bitcain docs

Payments & Billing

Payments & Billing

Stripe integration, subscriptions, usage tracking, referrals, and fee management.

13 tables in this group.

customers

ColumnTypeNullableDefault
iduuidNouuid_generate_v4()
created_attimestamptzYesnow()
updated_attimestamptzYesnow()
user_iduuidNo
emailtextNo
stripe_customer_idtextYes
paypal_customer_idtextYes
metadatajsonbYes'{}'::jsonb

RLS Policies:

  • Users can view their own customer data — ALL for {public}

Indexes:

  • customers_paypal_customer_id_key
  • customers_pkey
  • customers_stripe_customer_id_key
  • idx_customers_user_id

subscriptions

ColumnTypeNullableDefault
iduuidNouuid_generate_v4()
created_attimestamptzYesnow()
updated_attimestamptzYesnow()
customer_iduuidNo
tiersubscription_tierNo'free'::subscription_tier
statussubscription_statusNo'active'::subscription_status
providerpayment_providerNo
provider_subscription_idtextNo
provider_product_idtextYes
provider_price_idtextYes
current_period_starttimestamptzYes
current_period_endtimestamptzYes
trial_starttimestamptzYes
trial_endtimestamptzYes
cancel_at_period_endboolYesfalse
canceled_attimestamptzYes
metadatajsonbYes'{}'::jsonb

RLS Policies:

  • Users can view their own subscription data — ALL for {public}

Indexes:

  • idx_subscriptions_customer_id
  • subscriptions_pkey
  • subscriptions_provider_provider_subscription_id_key

subscription_history

Audit trail for all subscription changes

ColumnTypeNullableDefault
iduuidNogen_random_uuid()
user_iduuidNo
tiertextNo
statustextNo
stripe_customer_idtextYes
stripe_subscription_idtextYes
stripe_price_idtextYes
amount_centsint4Yes
currencytextYes'usd'::text
billing_intervaltextYes
started_attimestamptzNonow()
ended_attimestamptzYes
cancellation_reasontextYes
created_attimestamptzNonow()

RLS Policies:

  • Service role can manage subscription history — ALL for {public}
  • Users can view own subscription history — SELECT for {public}

Indexes:

  • idx_subscription_history_active
  • idx_subscription_history_dates
  • idx_subscription_history_stripe_customer
  • idx_subscription_history_user_id
  • subscription_history_pkey

payment_events

ColumnTypeNullableDefault
iduuidNouuid_generate_v4()
created_attimestamptzYesnow()
providerpayment_providerNo
provider_event_idtextNo
event_typetextNo
processedboolYesfalse
subscription_iduuidYes
customer_iduuidYes
datajsonbNo
error_messagetextYes

RLS Policies:

  • Users can view own payment events — SELECT for {public}

Indexes:

  • payment_events_pkey
  • payment_events_provider_provider_event_id_key

stripe_events

Stripe webhook events for idempotency and debugging

ColumnTypeNullableDefault
iduuidNogen_random_uuid()
event_idtextNo
event_typetextNo
user_iduuidYes
stripe_customer_idtextYes
stripe_subscription_idtextYes
payloadjsonbNo
processedboolYesfalse
processed_attimestamptzYes
error_messagetextYes
created_attimestamptzNonow()

RLS Policies:

  • Service role can manage stripe events — ALL for {public}

Indexes:

  • idx_stripe_events_customer
  • idx_stripe_events_event_id
  • idx_stripe_events_processed
  • idx_stripe_events_user_id
  • stripe_events_event_id_key
  • stripe_events_pkey

usage_limits

Daily usage tracking for API calls and trades

ColumnTypeNullableDefault
iduuidNogen_random_uuid()
user_iduuidNo
datedateNoCURRENT_DATE
api_callsint4Yes0
tradesint4Yes0
portfolio_value_usdnumericYes0
created_attimestamptzNonow()
updated_attimestamptzNonow()

RLS Policies:

  • Service role can manage usage limits — ALL for {public}
  • Users can view own usage limits — SELECT for {public}

Indexes:

  • idx_usage_limits_date
  • idx_usage_limits_user_date
  • unique_user_date
  • usage_limits_pkey

feature_usage

ColumnTypeNullableDefault
iduuidNouuid_generate_v4()
created_attimestamptzYesnow()
updated_attimestamptzYesnow()
customer_iduuidNo
feature_typetextNo
usage_countint4Yes0
usage_limitint4Yes
reset_periodtextYes'monthly'::text
last_resettimestamptzYesnow()
metadatajsonbYes'{}'::jsonb

RLS Policies:

  • Users can view their own feature usage — ALL for {public}

Indexes:

  • feature_usage_customer_id_feature_type_key
  • feature_usage_pkey

fee_history

Historical fee records for completed trades

ColumnTypeNullableDefault
iduuidNogen_random_uuid()
user_iduuidNo
trade_iduuidYes
exchangevarchar(50)No
symbolvarchar(20)No
sidevarchar(10)No
maker_feenumericNo0
taker_feenumericNo0
network_feenumericNo0
spread_costnumericNo0
total_feenumericNo0
fee_currencyvarchar(10)No
trade_valuenumericNo
effective_fee_percentagenumericNo0
executed_attimestamptzNo
created_attimestamptzNonow()
updated_attimestamptzYesnow()

RLS Policies:

  • fee_history_service_all — ALL for {service_role}
  • fee_history_user_insert — INSERT for {public}
  • fee_history_user_select — SELECT for {public}

Indexes:

  • fee_history_pkey
  • idx_fee_history_executed_at
  • idx_fee_history_user_executed
  • idx_fee_history_user_id

referral_codes

ColumnTypeNullableDefault
iduuidNogen_random_uuid()
user_iduuidNo
codevarchar(20)No
is_activeboolNotrue
expires_attimestamptzYes
max_usesint4Yes
current_usesint4No0
metadatajsonbYes'{}'::jsonb
created_attimestamptzNonow()
updated_attimestamptzNonow()

RLS Policies:

  • Service role can manage codes — ALL for {service_role}
  • Users can view own referral codes — SELECT for {public}

Indexes:

  • idx_referral_codes_user_id
  • referral_codes_code_key
  • referral_codes_pkey
  • unique_user_active_code

referral_rewards

ColumnTypeNullableDefault
iduuidNogen_random_uuid()
referral_iduuidNo
referrer_iduuidNo
referred_iduuidNo
tier_iduuidYes
tier_namevarchar(50)Yes
reward_typevarchar(30)No
amountnumericNo
currencyvarchar(10)No'USD'::character varying
commission_ratenumericYes
statusvarchar(20)No'pending'::character varying
paid_attimestamptzYes
payout_iduuidYes
transaction_referencevarchar(100)Yes
metadatajsonbYes'{}'::jsonb
created_attimestamptzNonow()
updated_attimestamptzNonow()

RLS Policies:

  • Service role can manage rewards — ALL for {service_role}
  • Users can view own rewards — SELECT for {public}

Indexes:

  • idx_referral_rewards_referrer_id
  • referral_rewards_pkey

referrals

ColumnTypeNullableDefault
iduuidNogen_random_uuid()
referrer_iduuidNo
referred_iduuidNo
referral_code_iduuidNo
referral_codevarchar(20)No
statusvarchar(20)No'pending'::character varying
verified_attimestamptzYes
verification_metadatajsonbYes'{}'::jsonb
created_attimestamptzNonow()
updated_attimestamptzNonow()

RLS Policies:

  • Service role can manage referrals — ALL for {service_role}
  • Users can view referrals they created — SELECT for {public}

Indexes:

  • idx_referrals_referrer_id
  • referrals_pkey
  • unique_referral

referral_payouts

ColumnTypeNullableDefault
iduuidNogen_random_uuid()
user_iduuidNo
payout_schedulevarchar(20)No
amountnumericNo
currencyvarchar(10)No'USD'::character varying
statusvarchar(20)No'pending'::character varying
payment_methodvarchar(50)Yes
payment_detailsjsonbYes'{}'::jsonb
transaction_idvarchar(100)Yes
transaction_hashvarchar(100)Yes
processed_attimestamptzYes
failed_reasontextYes
retry_countint4No0
metadatajsonbYes'{}'::jsonb
created_attimestamptzNonow()
updated_attimestamptzNonow()

RLS Policies:

  • Service role can manage payouts — ALL for {service_role}
  • Users can view own payouts — SELECT for {public}

Indexes:

  • idx_referral_payouts_user_id
  • referral_payouts_pkey

referral_tiers

ColumnTypeNullableDefault
iduuidNogen_random_uuid()
tier_namevarchar(50)No
tier_levelint4No
min_referralsint4No
max_referralsint4Yes
commission_ratenumericNo
descriptiontextYes
benefitsjsonbYes'[]'::jsonb
is_activeboolNotrue
created_attimestamptzNonow()
updated_attimestamptzNonow()

RLS Policies:

  • Anyone can view active tiers — SELECT for {public}
  • Service role can manage tiers — ALL for {service_role}

Indexes:

  • referral_tiers_pkey
  • referral_tiers_tier_level_key
  • referral_tiers_tier_name_key

On this page