Documentation
¶
Overview ¶
Package schema defines the database models for the subscription plugin.
Package schema defines the database models for the subscription plugin.
Package schema defines the database models for the subscription plugin.
Index ¶
- type Feature
- type FeatureGrant
- type FeatureGrantType
- type FeatureTier
- type FeatureUsageAction
- type FeatureUsageLog
- type OrganizationFeatureUsage
- type PlanFeatureLink
- type Subscription
- type SubscriptionAddOn
- type SubscriptionAddOnFeature
- type SubscriptionAddOnItem
- type SubscriptionAddOnTier
- type SubscriptionAlert
- type SubscriptionAlertConfig
- type SubscriptionAlertTemplate
- type SubscriptionBillingMetric
- type SubscriptionCohort
- type SubscriptionCoupon
- type SubscriptionCouponRedemption
- type SubscriptionCurrency
- type SubscriptionCustomer
- type SubscriptionCustomerTaxID
- type SubscriptionEvent
- type SubscriptionExchangeRate
- type SubscriptionInvoice
- type SubscriptionInvoiceItem
- type SubscriptionMovement
- type SubscriptionPaymentMethod
- type SubscriptionPlan
- type SubscriptionPlanFeature
- type SubscriptionPlanTier
- type SubscriptionPromotionCode
- type SubscriptionTaxExemption
- type SubscriptionTaxRate
- type SubscriptionUsageRecord
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Feature ¶
type Feature struct {
mainschema.AuditableModel `bun:",inline"`
bun.BaseModel `bun:"table:subscription_features,alias:sf"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
AppID xid.ID `json:"appId" bun:"app_id,notnull,type:varchar(20)"`
Key string `json:"key" bun:"key,notnull"` // Unique per app
Name string `json:"name" bun:"name,notnull"` // Display name
Description string `json:"description" bun:"description"` // Feature description
Type string `json:"type" bun:"type,notnull"` // boolean, limit, unlimited, metered, tiered
Unit string `json:"unit" bun:"unit"` // "seats", "GB", "API calls", etc.
ResetPeriod string `json:"resetPeriod" bun:"reset_period"` // none, daily, weekly, monthly, yearly, billing_period
IsPublic bool `json:"isPublic" bun:"is_public,notnull,default:true"` // Show in pricing pages
DisplayOrder int `json:"displayOrder" bun:"display_order,notnull,default:0"`
Icon string `json:"icon" bun:"icon"` // Icon identifier for UI
ProviderFeatureID string `json:"providerFeatureId" bun:"provider_feature_id"` // Provider sync ID
LastSyncedAt *time.Time `json:"lastSyncedAt" bun:"last_synced_at"` // Last provider sync time
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
// Relations
App *mainschema.App `json:"app,omitempty" bun:"rel:belongs-to,join:app_id=id"`
Tiers []FeatureTier `json:"tiers,omitempty" bun:"rel:has-many,join:id=feature_id"`
Plans []PlanFeatureLink `json:"plans,omitempty" bun:"rel:has-many,join:id=feature_id"`
}
Feature represents a standalone feature definition that can be linked to plans
type FeatureGrant ¶
type FeatureGrant struct {
mainschema.AuditableModel `bun:",inline"`
bun.BaseModel `bun:"table:subscription_feature_grants,alias:sfg"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
OrganizationID xid.ID `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
FeatureID xid.ID `json:"featureId" bun:"feature_id,notnull,type:varchar(20)"`
GrantType string `json:"grantType" bun:"grant_type,notnull"` // addon, override, promotion, trial, manual
Value int64 `json:"value" bun:"value,notnull"` // Additional quota
ExpiresAt *time.Time `json:"expiresAt" bun:"expires_at"`
SourceType string `json:"sourceType" bun:"source_type"` // addon, coupon, promotion, etc.
SourceID *xid.ID `json:"sourceId" bun:"source_id,type:varchar(20)"` // AddOn ID, Promotion ID, etc.
Reason string `json:"reason" bun:"reason"`
IsActive bool `json:"isActive" bun:"is_active,notnull,default:true"`
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
// Relations
Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
Feature *Feature `json:"feature,omitempty" bun:"rel:belongs-to,join:feature_id=id"`
}
FeatureGrant provides additional feature access beyond the plan
type FeatureGrantType ¶
type FeatureGrantType string
FeatureGrantType defines the type of feature grant
const ( // FeatureGrantTypeAddon is a grant from an add-on purchase FeatureGrantTypeAddon FeatureGrantType = "addon" // FeatureGrantTypeOverride is a manual override FeatureGrantTypeOverride FeatureGrantType = "override" // FeatureGrantTypePromotion is a promotional grant FeatureGrantTypePromotion FeatureGrantType = "promotion" // FeatureGrantTypeTrial is a trial grant FeatureGrantTypeTrial FeatureGrantType = "trial" // FeatureGrantTypeManual is a manually added grant FeatureGrantTypeManual FeatureGrantType = "manual" )
type FeatureTier ¶
type FeatureTier struct {
bun.BaseModel `bun:"table:subscription_feature_tiers,alias:sft"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
FeatureID xid.ID `json:"featureId" bun:"feature_id,notnull,type:varchar(20)"`
TierOrder int `json:"tierOrder" bun:"tier_order,notnull,default:0"`
UpTo int64 `json:"upTo" bun:"up_to,notnull"` // -1 for unlimited
Value string `json:"value" bun:"value"` // What's unlocked at this tier (JSON)
Label string `json:"label" bun:"label"` // Display label for this tier
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
// Relations
Feature *Feature `json:"feature,omitempty" bun:"rel:belongs-to,join:feature_id=id"`
}
FeatureTier represents a tier within a tiered feature type
type FeatureUsageAction ¶
type FeatureUsageAction string
FeatureUsageAction defines the type of usage action
const ( // FeatureUsageActionConsume decrements the available quota FeatureUsageActionConsume FeatureUsageAction = "consume" // FeatureUsageActionGrant adds to the quota FeatureUsageActionGrant FeatureUsageAction = "grant" // FeatureUsageActionReset resets the usage counter FeatureUsageActionReset FeatureUsageAction = "reset" // FeatureUsageActionAdjust manually adjusts the usage FeatureUsageActionAdjust FeatureUsageAction = "adjust" )
type FeatureUsageLog ¶
type FeatureUsageLog struct {
bun.BaseModel `bun:"table:subscription_feature_usage_logs,alias:sful"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
OrganizationID xid.ID `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
FeatureID xid.ID `json:"featureId" bun:"feature_id,notnull,type:varchar(20)"`
Action string `json:"action" bun:"action,notnull"` // consume, grant, reset, adjust
Quantity int64 `json:"quantity" bun:"quantity,notnull"`
PreviousUsage int64 `json:"previousUsage" bun:"previous_usage,notnull,default:0"`
NewUsage int64 `json:"newUsage" bun:"new_usage,notnull,default:0"`
ActorID *xid.ID `json:"actorId" bun:"actor_id,type:varchar(20)"`
Reason string `json:"reason" bun:"reason"`
IdempotencyKey string `json:"idempotencyKey" bun:"idempotency_key"`
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
// Relations
Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
Feature *Feature `json:"feature,omitempty" bun:"rel:belongs-to,join:feature_id=id"`
}
FeatureUsageLog provides an audit trail for feature usage changes
type OrganizationFeatureUsage ¶
type OrganizationFeatureUsage struct {
bun.BaseModel `bun:"table:subscription_org_feature_usage,alias:sofu"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
OrganizationID xid.ID `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
FeatureID xid.ID `json:"featureId" bun:"feature_id,notnull,type:varchar(20)"`
CurrentUsage int64 `json:"currentUsage" bun:"current_usage,notnull,default:0"`
PeriodStart time.Time `json:"periodStart" bun:"period_start,notnull"`
PeriodEnd time.Time `json:"periodEnd" bun:"period_end,notnull"`
LastReset time.Time `json:"lastReset" bun:"last_reset,notnull"`
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
UpdatedAt time.Time `json:"updatedAt" bun:"updated_at,nullzero,notnull,default:current_timestamp"`
// Relations
Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
Feature *Feature `json:"feature,omitempty" bun:"rel:belongs-to,join:feature_id=id"`
}
OrganizationFeatureUsage tracks feature usage per organization
type PlanFeatureLink ¶
type PlanFeatureLink struct {
bun.BaseModel `bun:"table:subscription_plan_feature_links,alias:spfl"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
PlanID xid.ID `json:"planId" bun:"plan_id,notnull,type:varchar(20)"`
FeatureID xid.ID `json:"featureId" bun:"feature_id,notnull,type:varchar(20)"`
Value string `json:"value" bun:"value"` // JSON: limit value, tier, boolean, etc.
IsBlocked bool `json:"isBlocked" bun:"is_blocked,notnull,default:false"` // Explicitly blocked for this plan
IsHighlighted bool `json:"isHighlighted" bun:"is_highlighted,notnull,default:false"` // Highlight in pricing comparison
OverrideSettings map[string]interface{} `json:"overrideSettings" bun:"override_settings,type:jsonb"`
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
UpdatedAt time.Time `json:"updatedAt" bun:"updated_at,nullzero,notnull,default:current_timestamp"`
// Relations
Plan *SubscriptionPlan `json:"plan,omitempty" bun:"rel:belongs-to,join:plan_id=id"`
Feature *Feature `json:"feature,omitempty" bun:"rel:belongs-to,join:feature_id=id"`
}
PlanFeatureLink connects features to plans with plan-specific configuration
type Subscription ¶
type Subscription struct {
mainschema.AuditableModel `bun:",inline"`
bun.BaseModel `bun:"table:subscriptions,alias:sub"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
OrganizationID xid.ID `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
PlanID xid.ID `json:"planId" bun:"plan_id,notnull,type:varchar(20)"`
Status string `json:"status" bun:"status,notnull"`
Quantity int `json:"quantity" bun:"quantity,notnull,default:1"`
CurrentPeriodStart time.Time `json:"currentPeriodStart" bun:"current_period_start,notnull"`
CurrentPeriodEnd time.Time `json:"currentPeriodEnd" bun:"current_period_end,notnull"`
TrialStart *time.Time `json:"trialStart" bun:"trial_start"`
TrialEnd *time.Time `json:"trialEnd" bun:"trial_end"`
CancelAt *time.Time `json:"cancelAt" bun:"cancel_at"`
CanceledAt *time.Time `json:"canceledAt" bun:"canceled_at"`
EndedAt *time.Time `json:"endedAt" bun:"ended_at"`
PausedAt *time.Time `json:"pausedAt" bun:"paused_at"`
ResumeAt *time.Time `json:"resumeAt" bun:"resume_at"`
ProviderSubID string `json:"providerSubId" bun:"provider_sub_id"`
ProviderCustomerID string `json:"providerCustomerId" bun:"provider_customer_id"`
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
// Relations
Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
Plan *SubscriptionPlan `json:"plan,omitempty" bun:"rel:belongs-to,join:plan_id=id"`
AddOns []SubscriptionAddOnItem `json:"addOns,omitempty" bun:"rel:has-many,join:id=subscription_id"`
}
Subscription represents an organization's subscription
type SubscriptionAddOn ¶
type SubscriptionAddOn struct {
mainschema.AuditableModel `bun:",inline"`
bun.BaseModel `bun:"table:subscription_addons,alias:sao"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
AppID xid.ID `json:"appId" bun:"app_id,notnull,type:varchar(20)"`
Name string `json:"name" bun:"name,notnull"`
Slug string `json:"slug" bun:"slug,notnull"`
Description string `json:"description" bun:"description"`
BillingPattern string `json:"billingPattern" bun:"billing_pattern,notnull"`
BillingInterval string `json:"billingInterval" bun:"billing_interval,notnull"`
Price int64 `json:"price" bun:"price,notnull,default:0"`
Currency string `json:"currency" bun:"currency,notnull,default:'USD'"`
TierMode string `json:"tierMode" bun:"tier_mode,default:'graduated'"`
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
IsActive bool `json:"isActive" bun:"is_active,notnull,default:true"`
IsPublic bool `json:"isPublic" bun:"is_public,notnull,default:true"`
DisplayOrder int `json:"displayOrder" bun:"display_order,notnull,default:0"`
RequiresPlanIDs []string `json:"requiresPlanIds" bun:"requires_plan_ids,array,type:varchar(20)[]"`
ExcludesPlanIDs []string `json:"excludesPlanIds" bun:"excludes_plan_ids,array,type:varchar(20)[]"`
MaxQuantity int `json:"maxQuantity" bun:"max_quantity,notnull,default:0"`
ProviderPriceID string `json:"providerPriceId" bun:"provider_price_id"`
// Relations
App *mainschema.App `json:"app,omitempty" bun:"rel:belongs-to,join:app_id=id"`
Features []SubscriptionAddOnFeature `json:"features,omitempty" bun:"rel:has-many,join:id=addon_id"`
Tiers []SubscriptionAddOnTier `json:"tiers,omitempty" bun:"rel:has-many,join:id=addon_id"`
}
SubscriptionAddOn represents an add-on product
type SubscriptionAddOnFeature ¶
type SubscriptionAddOnFeature struct {
bun.BaseModel `bun:"table:subscription_addon_features,alias:saf"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
AddOnID xid.ID `json:"addOnId" bun:"addon_id,notnull,type:varchar(20)"`
Key string `json:"key" bun:"key,notnull"`
Name string `json:"name" bun:"name,notnull"`
Description string `json:"description" bun:"description"`
Type string `json:"type" bun:"type,notnull"`
Value string `json:"value" bun:"value"`
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
// Relations
AddOn *SubscriptionAddOn `json:"addOn,omitempty" bun:"rel:belongs-to,join:addon_id=id"`
}
SubscriptionAddOnFeature represents a feature on an add-on
type SubscriptionAddOnItem ¶
type SubscriptionAddOnItem struct {
bun.BaseModel `bun:"table:subscription_addon_items,alias:sai"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
SubscriptionID xid.ID `json:"subscriptionId" bun:"subscription_id,notnull,type:varchar(20)"`
AddOnID xid.ID `json:"addOnId" bun:"addon_id,notnull,type:varchar(20)"`
Quantity int `json:"quantity" bun:"quantity,notnull,default:1"`
ProviderSubItemID string `json:"providerSubItemId" bun:"provider_sub_item_id"`
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
// Relations
Subscription *Subscription `json:"subscription,omitempty" bun:"rel:belongs-to,join:subscription_id=id"`
AddOn *SubscriptionAddOn `json:"addOn,omitempty" bun:"rel:belongs-to,join:addon_id=id"`
}
SubscriptionAddOnItem represents an add-on attached to a subscription
type SubscriptionAddOnTier ¶
type SubscriptionAddOnTier struct {
bun.BaseModel `bun:"table:subscription_addon_tiers,alias:sat"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
AddOnID xid.ID `json:"addOnId" bun:"addon_id,notnull,type:varchar(20)"`
TierOrder int `json:"tierOrder" bun:"tier_order,notnull"`
UpTo int64 `json:"upTo" bun:"up_to,notnull"`
UnitAmount int64 `json:"unitAmount" bun:"unit_amount,notnull"`
FlatAmount int64 `json:"flatAmount" bun:"flat_amount,notnull,default:0"`
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
// Relations
AddOn *SubscriptionAddOn `json:"addOn,omitempty" bun:"rel:belongs-to,join:addon_id=id"`
}
SubscriptionAddOnTier represents a pricing tier for an add-on
type SubscriptionAlert ¶
type SubscriptionAlert struct {
bun.BaseModel `bun:"table:subscription_alerts,alias:sa"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
OrganizationID xid.ID `bun:"organization_id,notnull,type:char(20)"`
ConfigID *xid.ID `bun:"config_id,type:char(20)"`
Type string `bun:"type,notnull"`
Severity string `bun:"severity,notnull,default:'info'"`
Status string `bun:"status,notnull,default:'pending'"`
Title string `bun:"title,notnull"`
Message string `bun:"message,notnull"`
MetricKey string `bun:"metric_key"`
CurrentValue float64 `bun:"current_value"`
ThresholdValue float64 `bun:"threshold_value"`
LimitValue float64 `bun:"limit_value"`
SubscriptionID *xid.ID `bun:"subscription_id,type:char(20)"`
InvoiceID *xid.ID `bun:"invoice_id,type:char(20)"`
Channels []string `bun:"channels,array"`
SentAt *time.Time `bun:"sent_at"`
DeliveryStatus string `bun:"delivery_status,type:jsonb"`
AcknowledgedAt *time.Time `bun:"acknowledged_at"`
AcknowledgedBy string `bun:"acknowledged_by"`
ResolvedAt *time.Time `bun:"resolved_at"`
Resolution string `bun:"resolution"`
Metadata string `bun:"metadata,type:jsonb"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
UpdatedAt time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}
SubscriptionAlert represents an alert in the database
type SubscriptionAlertConfig ¶
type SubscriptionAlertConfig struct {
bun.BaseModel `bun:"table:subscription_alert_configs,alias:sac"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
OrganizationID xid.ID `bun:"organization_id,notnull,type:char(20)"`
AlertType string `bun:"alert_type,notnull"`
IsEnabled bool `bun:"is_enabled,notnull,default:true"`
ThresholdPercent float64 `bun:"threshold_percent"`
MetricKey string `bun:"metric_key"`
DaysBeforeEnd int `bun:"days_before_end"`
Channels []string `bun:"channels,array"`
Recipients []string `bun:"recipients,array"`
WebhookURL string `bun:"webhook_url"`
SlackChannel string `bun:"slack_channel"`
MinInterval int `bun:"min_interval,notnull,default:60"`
MaxAlertsPerDay int `bun:"max_alerts_per_day,notnull,default:5"`
SnoozedUntil *time.Time `bun:"snoozed_until"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
UpdatedAt time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}
SubscriptionAlertConfig represents an alert configuration in the database
type SubscriptionAlertTemplate ¶
type SubscriptionAlertTemplate struct {
bun.BaseModel `bun:"table:subscription_alert_templates,alias:sat"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
AlertType string `bun:"alert_type,notnull"`
Channel string `bun:"channel,notnull"`
Subject string `bun:"subject"`
TitleTemplate string `bun:"title_template,notnull"`
BodyTemplate string `bun:"body_template,notnull"`
IsDefault bool `bun:"is_default,notnull,default:false"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
UpdatedAt time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}
SubscriptionAlertTemplate represents an alert template in the database
type SubscriptionBillingMetric ¶
type SubscriptionBillingMetric struct {
bun.BaseModel `bun:"table:subscription_billing_metrics,alias:sbm"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
Type string `bun:"type,notnull"` // mrr, arr, churn_rate, etc.
Period string `bun:"period,notnull"` // daily, weekly, monthly, yearly
Value float64 `bun:"value,notnull"`
Currency string `bun:"currency,notnull"`
Date time.Time `bun:"date,notnull"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
}
SubscriptionBillingMetric represents a billing metric in the database
type SubscriptionCohort ¶
type SubscriptionCohort struct {
bun.BaseModel `bun:"table:subscription_cohorts,alias:sco"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
CohortMonth time.Time `bun:"cohort_month,notnull"`
TotalCustomers int `bun:"total_customers,notnull"`
MonthNumber int `bun:"month_number,notnull"` // 0 = signup month, 1 = first month after, etc.
ActiveCustomers int `bun:"active_customers,notnull"`
RetentionRate float64 `bun:"retention_rate,notnull"`
Revenue int64 `bun:"revenue,notnull"`
Currency string `bun:"currency,notnull"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
UpdatedAt time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}
SubscriptionCohort represents cohort data in the database
type SubscriptionCoupon ¶
type SubscriptionCoupon struct {
bun.BaseModel `bun:"table:subscription_coupons,alias:scp"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
Code string `bun:"code,notnull,unique"`
Name string `bun:"name,notnull"`
Description string `bun:"description"`
Type string `bun:"type,notnull"` // percentage, fixed_amount, trial_extension, free_months
Duration string `bun:"duration,notnull"` // once, repeating, forever
Status string `bun:"status,notnull,default:'active'"`
PercentOff float64 `bun:"percent_off"`
AmountOff int64 `bun:"amount_off"`
Currency string `bun:"currency"`
TrialDays int `bun:"trial_days"`
FreeMonths int `bun:"free_months"`
DurationMonths int `bun:"duration_months"`
MaxRedemptions int `bun:"max_redemptions"`
MaxRedemptionsPerOrg int `bun:"max_redemptions_per_org"`
MinPurchaseAmount int64 `bun:"min_purchase_amount"`
ApplicablePlans []string `bun:"applicable_plans,array"`
ApplicableAddOns []string `bun:"applicable_addons,array"`
FirstPurchaseOnly bool `bun:"first_purchase_only,notnull,default:false"`
ValidFrom time.Time `bun:"valid_from,notnull"`
ValidUntil *time.Time `bun:"valid_until"`
TimesRedeemed int `bun:"times_redeemed,notnull,default:0"`
ProviderCouponID string `bun:"provider_coupon_id"`
Metadata string `bun:"metadata,type:jsonb"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
UpdatedAt time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}
SubscriptionCoupon represents a coupon in the database
type SubscriptionCouponRedemption ¶
type SubscriptionCouponRedemption struct {
bun.BaseModel `bun:"table:subscription_coupon_redemptions,alias:scr"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
CouponID xid.ID `bun:"coupon_id,notnull,type:char(20)"`
OrganizationID xid.ID `bun:"organization_id,notnull,type:char(20)"`
SubscriptionID xid.ID `bun:"subscription_id,notnull,type:char(20)"`
DiscountType string `bun:"discount_type,notnull"`
DiscountAmount int64 `bun:"discount_amount,notnull"`
Currency string `bun:"currency,notnull"`
RedeemedAt time.Time `bun:"redeemed_at,notnull,default:current_timestamp"`
ExpiresAt *time.Time `bun:"expires_at"`
// Relations
Coupon *SubscriptionCoupon `bun:"rel:belongs-to,join:coupon_id=id"`
}
SubscriptionCouponRedemption represents a coupon redemption in the database
type SubscriptionCurrency ¶
type SubscriptionCurrency struct {
bun.BaseModel `bun:"table:subscription_currencies,alias:sc"`
ID xid.ID `bun:"id,pk,type:char(20)"`
Code string `bun:"code,notnull,unique"`
Name string `bun:"name,notnull"`
Symbol string `bun:"symbol,notnull"`
DecimalPlaces int `bun:"decimal_places,notnull,default:2"`
IsDefault bool `bun:"is_default,notnull,default:false"`
IsActive bool `bun:"is_active,notnull,default:true"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
UpdatedAt time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}
SubscriptionCurrency represents a supported currency in the database
type SubscriptionCustomer ¶
type SubscriptionCustomer struct {
mainschema.AuditableModel `bun:",inline"`
bun.BaseModel `bun:"table:subscription_customers,alias:sc"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
OrganizationID xid.ID `json:"organizationId" bun:"organization_id,notnull,unique,type:varchar(20)"`
ProviderCustomerID string `json:"providerCustomerId" bun:"provider_customer_id,notnull,unique"`
Email string `json:"email" bun:"email,notnull"`
Name string `json:"name" bun:"name"`
Phone string `json:"phone" bun:"phone"`
TaxID string `json:"taxId" bun:"tax_id"`
TaxExempt bool `json:"taxExempt" bun:"tax_exempt,notnull,default:false"`
Currency string `json:"currency" bun:"currency,notnull,default:'USD'"`
Balance int64 `json:"balance" bun:"balance,notnull,default:0"`
DefaultPaymentID *xid.ID `json:"defaultPaymentId" bun:"default_payment_id,type:varchar(20)"`
// Billing address
BillingAddressLine1 string `json:"billingAddressLine1" bun:"billing_address_line1"`
BillingAddressLine2 string `json:"billingAddressLine2" bun:"billing_address_line2"`
BillingCity string `json:"billingCity" bun:"billing_city"`
BillingState string `json:"billingState" bun:"billing_state"`
BillingPostalCode string `json:"billingPostalCode" bun:"billing_postal_code"`
BillingCountry string `json:"billingCountry" bun:"billing_country"`
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
// Relations
Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
DefaultPayment *SubscriptionPaymentMethod `json:"defaultPayment,omitempty" bun:"rel:belongs-to,join:default_payment_id=id"`
}
SubscriptionCustomer represents the billing customer for an organization
type SubscriptionCustomerTaxID ¶
type SubscriptionCustomerTaxID struct {
bun.BaseModel `bun:"table:subscription_customer_tax_ids,alias:sctid"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
OrganizationID xid.ID `bun:"organization_id,notnull,type:char(20)"`
Type string `bun:"type,notnull"` // eu_vat, in_gst, etc.
Value string `bun:"value,notnull"`
Country string `bun:"country,notnull"`
VerifiedAt *time.Time `bun:"verified_at"`
IsValid bool `bun:"is_valid,notnull,default:false"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
UpdatedAt time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}
SubscriptionCustomerTaxID represents a customer's tax ID in the database
type SubscriptionEvent ¶
type SubscriptionEvent struct {
bun.BaseModel `bun:"table:subscription_events,alias:se"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
SubscriptionID *xid.ID `json:"subscriptionId" bun:"subscription_id,type:varchar(20)"`
OrganizationID xid.ID `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
EventType string `json:"eventType" bun:"event_type,notnull"`
EventData map[string]interface{} `json:"eventData" bun:"event_data,type:jsonb"`
ProviderEventID string `json:"providerEventId" bun:"provider_event_id"`
IPAddress string `json:"ipAddress" bun:"ip_address"`
UserAgent string `json:"userAgent" bun:"user_agent"`
ActorID *xid.ID `json:"actorId" bun:"actor_id,type:varchar(20)"`
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
// Relations
Subscription *Subscription `json:"subscription,omitempty" bun:"rel:belongs-to,join:subscription_id=id"`
Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
}
SubscriptionEvent represents an audit event for subscription changes
type SubscriptionExchangeRate ¶
type SubscriptionExchangeRate struct {
bun.BaseModel `bun:"table:subscription_exchange_rates,alias:ser"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
FromCurrency string `bun:"from_currency,notnull"`
ToCurrency string `bun:"to_currency,notnull"`
Rate float64 `bun:"rate,notnull"`
ValidFrom time.Time `bun:"valid_from,notnull"`
ValidUntil *time.Time `bun:"valid_until"`
Source string `bun:"source,notnull,default:'manual'"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
UpdatedAt time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}
SubscriptionExchangeRate represents an exchange rate in the database
type SubscriptionInvoice ¶
type SubscriptionInvoice struct {
mainschema.AuditableModel `bun:",inline"`
bun.BaseModel `bun:"table:subscription_invoices,alias:si"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
SubscriptionID xid.ID `json:"subscriptionId" bun:"subscription_id,notnull,type:varchar(20)"`
OrganizationID xid.ID `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
Number string `json:"number" bun:"number,notnull,unique"`
Status string `json:"status" bun:"status,notnull"`
Currency string `json:"currency" bun:"currency,notnull,default:'USD'"`
Subtotal int64 `json:"subtotal" bun:"subtotal,notnull,default:0"`
Tax int64 `json:"tax" bun:"tax,notnull,default:0"`
Total int64 `json:"total" bun:"total,notnull,default:0"`
AmountPaid int64 `json:"amountPaid" bun:"amount_paid,notnull,default:0"`
AmountDue int64 `json:"amountDue" bun:"amount_due,notnull,default:0"`
Description string `json:"description" bun:"description"`
PeriodStart time.Time `json:"periodStart" bun:"period_start,notnull"`
PeriodEnd time.Time `json:"periodEnd" bun:"period_end,notnull"`
DueDate time.Time `json:"dueDate" bun:"due_date,notnull"`
PaidAt *time.Time `json:"paidAt" bun:"paid_at"`
VoidedAt *time.Time `json:"voidedAt" bun:"voided_at"`
ProviderInvoiceID string `json:"providerInvoiceId" bun:"provider_invoice_id"`
ProviderPDFURL string `json:"providerPdfUrl" bun:"provider_pdf_url"`
HostedInvoiceURL string `json:"hostedInvoiceUrl" bun:"hosted_invoice_url"`
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
// Relations
Subscription *Subscription `json:"subscription,omitempty" bun:"rel:belongs-to,join:subscription_id=id"`
Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
Items []SubscriptionInvoiceItem `json:"items,omitempty" bun:"rel:has-many,join:id=invoice_id"`
}
SubscriptionInvoice represents a billing invoice
type SubscriptionInvoiceItem ¶
type SubscriptionInvoiceItem struct {
bun.BaseModel `bun:"table:subscription_invoice_items,alias:sii"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
InvoiceID xid.ID `json:"invoiceId" bun:"invoice_id,notnull,type:varchar(20)"`
Description string `json:"description" bun:"description,notnull"`
Quantity int64 `json:"quantity" bun:"quantity,notnull,default:1"`
UnitAmount int64 `json:"unitAmount" bun:"unit_amount,notnull"`
Amount int64 `json:"amount" bun:"amount,notnull"`
PlanID *xid.ID `json:"planId" bun:"plan_id,type:varchar(20)"`
AddOnID *xid.ID `json:"addOnId" bun:"addon_id,type:varchar(20)"`
PeriodStart time.Time `json:"periodStart" bun:"period_start,notnull"`
PeriodEnd time.Time `json:"periodEnd" bun:"period_end,notnull"`
Proration bool `json:"proration" bun:"proration,notnull,default:false"`
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
ProviderItemID string `json:"providerItemId" bun:"provider_item_id"`
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
// Relations
Invoice *SubscriptionInvoice `json:"invoice,omitempty" bun:"rel:belongs-to,join:invoice_id=id"`
Plan *SubscriptionPlan `json:"plan,omitempty" bun:"rel:belongs-to,join:plan_id=id"`
AddOn *SubscriptionAddOn `json:"addOn,omitempty" bun:"rel:belongs-to,join:addon_id=id"`
}
SubscriptionInvoiceItem represents a line item on an invoice
type SubscriptionMovement ¶
type SubscriptionMovement struct {
bun.BaseModel `bun:"table:subscription_movements,alias:sm"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
SubscriptionID xid.ID `bun:"subscription_id,notnull,type:char(20)"`
OrganizationID xid.ID `bun:"organization_id,notnull,type:char(20)"`
MovementType string `bun:"movement_type,notnull"` // new, upgrade, downgrade, churn, reactivation
PreviousMRR int64 `bun:"previous_mrr,notnull,default:0"`
NewMRR int64 `bun:"new_mrr,notnull,default:0"`
MRRChange int64 `bun:"mrr_change,notnull,default:0"`
Currency string `bun:"currency,notnull"`
PreviousPlanID *xid.ID `bun:"previous_plan_id,type:char(20)"`
NewPlanID *xid.ID `bun:"new_plan_id,type:char(20)"`
Reason string `bun:"reason"`
Notes string `bun:"notes"`
OccurredAt time.Time `bun:"occurred_at,notnull"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
// Relations
Subscription *Subscription `bun:"rel:belongs-to,join:subscription_id=id"`
PreviousPlan *SubscriptionPlan `bun:"rel:belongs-to,join:previous_plan_id=id"`
NewPlan *SubscriptionPlan `bun:"rel:belongs-to,join:new_plan_id=id"`
}
SubscriptionMovement represents a subscription movement event in the database
type SubscriptionPaymentMethod ¶
type SubscriptionPaymentMethod struct {
mainschema.AuditableModel `bun:",inline"`
bun.BaseModel `bun:"table:subscription_payment_methods,alias:spm"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
OrganizationID xid.ID `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
Type string `json:"type" bun:"type,notnull"` // card, bank_account, sepa_debit
IsDefault bool `json:"isDefault" bun:"is_default,notnull,default:false"`
ProviderMethodID string `json:"providerMethodId" bun:"provider_method_id,notnull"`
ProviderCustomerID string `json:"providerCustomerId" bun:"provider_customer_id,notnull"`
// Card fields
CardBrand string `json:"cardBrand" bun:"card_brand"`
CardLast4 string `json:"cardLast4" bun:"card_last4"`
CardExpMonth int `json:"cardExpMonth" bun:"card_exp_month"`
CardExpYear int `json:"cardExpYear" bun:"card_exp_year"`
CardFunding string `json:"cardFunding" bun:"card_funding"`
// Bank fields
BankName string `json:"bankName" bun:"bank_name"`
BankLast4 string `json:"bankLast4" bun:"bank_last4"`
BankRoutingNumber string `json:"bankRoutingNumber" bun:"bank_routing_number"`
BankAccountType string `json:"bankAccountType" bun:"bank_account_type"`
// Billing details
BillingName string `json:"billingName" bun:"billing_name"`
BillingEmail string `json:"billingEmail" bun:"billing_email"`
BillingPhone string `json:"billingPhone" bun:"billing_phone"`
BillingAddressLine1 string `json:"billingAddressLine1" bun:"billing_address_line1"`
BillingAddressLine2 string `json:"billingAddressLine2" bun:"billing_address_line2"`
BillingCity string `json:"billingCity" bun:"billing_city"`
BillingState string `json:"billingState" bun:"billing_state"`
BillingPostalCode string `json:"billingPostalCode" bun:"billing_postal_code"`
BillingCountry string `json:"billingCountry" bun:"billing_country"`
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
// Relations
Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
}
SubscriptionPaymentMethod represents a stored payment method
type SubscriptionPlan ¶
type SubscriptionPlan struct {
mainschema.AuditableModel `bun:",inline"`
bun.BaseModel `bun:"table:subscription_plans,alias:sp"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
AppID xid.ID `json:"appId" bun:"app_id,notnull,type:varchar(20)"`
Name string `json:"name" bun:"name,notnull"`
Slug string `json:"slug" bun:"slug,notnull"` // Unique within app
Description string `json:"description" bun:"description"`
BillingPattern string `json:"billingPattern" bun:"billing_pattern,notnull"`
BillingInterval string `json:"billingInterval" bun:"billing_interval,notnull"`
BasePrice int64 `json:"basePrice" bun:"base_price,notnull,default:0"`
Currency string `json:"currency" bun:"currency,notnull,default:'USD'"`
TrialDays int `json:"trialDays" bun:"trial_days,notnull,default:0"`
TierMode string `json:"tierMode" bun:"tier_mode,default:'graduated'"`
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
IsActive bool `json:"isActive" bun:"is_active,notnull,default:true"`
IsPublic bool `json:"isPublic" bun:"is_public,notnull,default:true"`
DisplayOrder int `json:"displayOrder" bun:"display_order,notnull,default:0"`
ProviderPlanID string `json:"providerPlanId" bun:"provider_plan_id"`
ProviderPriceID string `json:"providerPriceId" bun:"provider_price_id"`
// Relations
App *mainschema.App `json:"app,omitempty" bun:"rel:belongs-to,join:app_id=id"`
Features []SubscriptionPlanFeature `json:"features,omitempty" bun:"rel:has-many,join:id=plan_id"`
Tiers []SubscriptionPlanTier `json:"tiers,omitempty" bun:"rel:has-many,join:id=plan_id"`
FeatureLinks []PlanFeatureLink `json:"featureLinks,omitempty" bun:"rel:has-many,join:id=plan_id"`
}
SubscriptionPlan represents a subscription plan in the database
type SubscriptionPlanFeature ¶
type SubscriptionPlanFeature struct {
bun.BaseModel `bun:"table:subscription_plan_features,alias:spf"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
PlanID xid.ID `json:"planId" bun:"plan_id,notnull,type:varchar(20)"`
Key string `json:"key" bun:"key,notnull"`
Name string `json:"name" bun:"name,notnull"`
Description string `json:"description" bun:"description"`
Type string `json:"type" bun:"type,notnull"` // boolean, limit, unlimited
Value string `json:"value" bun:"value"` // JSON-encoded value
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
// Relations
Plan *SubscriptionPlan `json:"plan,omitempty" bun:"rel:belongs-to,join:plan_id=id"`
}
SubscriptionPlanFeature represents a feature limit on a plan
type SubscriptionPlanTier ¶
type SubscriptionPlanTier struct {
bun.BaseModel `bun:"table:subscription_plan_tiers,alias:spt"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
PlanID xid.ID `json:"planId" bun:"plan_id,notnull,type:varchar(20)"`
TierOrder int `json:"tierOrder" bun:"tier_order,notnull"`
UpTo int64 `json:"upTo" bun:"up_to,notnull"` // -1 for infinite
UnitAmount int64 `json:"unitAmount" bun:"unit_amount,notnull"`
FlatAmount int64 `json:"flatAmount" bun:"flat_amount,notnull,default:0"`
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
// Relations
Plan *SubscriptionPlan `json:"plan,omitempty" bun:"rel:belongs-to,join:plan_id=id"`
}
SubscriptionPlanTier represents a pricing tier for a plan
type SubscriptionPromotionCode ¶
type SubscriptionPromotionCode struct {
bun.BaseModel `bun:"table:subscription_promotion_codes,alias:spc"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
CouponID xid.ID `bun:"coupon_id,notnull,type:char(20)"`
Code string `bun:"code,notnull,unique"`
IsActive bool `bun:"is_active,notnull,default:true"`
MaxRedemptions int `bun:"max_redemptions"`
ValidFrom time.Time `bun:"valid_from,notnull"`
ValidUntil *time.Time `bun:"valid_until"`
RestrictToOrgs []string `bun:"restrict_to_orgs,array"`
FirstTimeOnly bool `bun:"first_time_only,notnull,default:false"`
TimesRedeemed int `bun:"times_redeemed,notnull,default:0"`
ProviderPromoID string `bun:"provider_promo_id"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
UpdatedAt time.Time `bun:"updated_at,notnull,default:current_timestamp"`
// Relations
Coupon *SubscriptionCoupon `bun:"rel:belongs-to,join:coupon_id=id"`
}
SubscriptionPromotionCode represents a promotion code in the database
type SubscriptionTaxExemption ¶
type SubscriptionTaxExemption struct {
bun.BaseModel `bun:"table:subscription_tax_exemptions,alias:ste"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
OrganizationID xid.ID `bun:"organization_id,notnull,type:char(20)"`
Type string `bun:"type,notnull"` // nonprofit, government, resale
Certificate string `bun:"certificate,notnull"`
Country string `bun:"country,notnull"`
State string `bun:"state"`
VerifiedAt *time.Time `bun:"verified_at"`
ExpiresAt *time.Time `bun:"expires_at"`
IsActive bool `bun:"is_active,notnull,default:true"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
UpdatedAt time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}
SubscriptionTaxExemption represents a tax exemption in the database
type SubscriptionTaxRate ¶
type SubscriptionTaxRate struct {
bun.BaseModel `bun:"table:subscription_tax_rates,alias:str"`
ID xid.ID `bun:"id,pk,type:char(20)"`
AppID xid.ID `bun:"app_id,notnull,type:char(20)"`
Name string `bun:"name,notnull"`
Description string `bun:"description"`
Type string `bun:"type,notnull"` // vat, gst, sales_tax, etc.
Percentage float64 `bun:"percentage,notnull"`
Country string `bun:"country,notnull"`
State string `bun:"state"`
City string `bun:"city"`
PostalCode string `bun:"postal_code"`
Behavior string `bun:"behavior,notnull,default:'exclusive'"` // exclusive, inclusive
IsDefault bool `bun:"is_default,notnull,default:false"`
IsActive bool `bun:"is_active,notnull,default:true"`
ProviderTaxRateID string `bun:"provider_tax_rate_id"`
ValidFrom time.Time `bun:"valid_from,notnull"`
ValidUntil *time.Time `bun:"valid_until"`
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
UpdatedAt time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}
SubscriptionTaxRate represents a tax rate in the database
type SubscriptionUsageRecord ¶
type SubscriptionUsageRecord struct {
bun.BaseModel `bun:"table:subscription_usage_records,alias:sur"`
ID xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
SubscriptionID xid.ID `json:"subscriptionId" bun:"subscription_id,notnull,type:varchar(20)"`
OrganizationID xid.ID `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
MetricKey string `json:"metricKey" bun:"metric_key,notnull"`
Quantity int64 `json:"quantity" bun:"quantity,notnull"`
Action string `json:"action" bun:"action,notnull"` // set, increment, decrement
Timestamp time.Time `json:"timestamp" bun:"timestamp,notnull"`
IdempotencyKey string `json:"idempotencyKey" bun:"idempotency_key"`
Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
ProviderRecordID string `json:"providerRecordId" bun:"provider_record_id"`
Reported bool `json:"reported" bun:"reported,notnull,default:false"`
ReportedAt *time.Time `json:"reportedAt" bun:"reported_at"`
CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
// Relations
Subscription *Subscription `json:"subscription,omitempty" bun:"rel:belongs-to,join:subscription_id=id"`
Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
}
SubscriptionUsageRecord represents a usage record for metered billing