Getting Started (with Supabase)
Complete instructions to set stripe-sync up.
Add stripe tables
By default, we add the tables under the stripe
schema.
postgres.sql
sql
CREATE SCHEMA stripe;
CREATE TABLE stripe.application (
"id" text not null,
"name" text,
"object" text not null
);
CREATE TABLE stripe.account (
"business_profile" jsonb,
"business_type" text,
"capabilities" jsonb,
"charges_enabled" boolean,
"company" jsonb,
"controller" jsonb,
"country" text,
"created" integer,
"default_currency" text,
"details_submitted" boolean,
"email" text,
"external_accounts" jsonb,
"future_requirements" jsonb,
"id" text not null,
"individual" jsonb,
"metadata" jsonb,
"object" text not null,
"payouts_enabled" boolean,
"requirements" jsonb,
"settings" jsonb,
"tos_acceptance" jsonb,
"type" text
);
CREATE TABLE stripe.application_fee (
"account" jsonb not null,
"amount" integer not null,
"amount_refunded" integer not null,
"application" jsonb not null,
"balance_transaction" jsonb,
"charge" jsonb not null,
"created" integer,
"currency" text not null,
"id" text not null,
"livemode" boolean,
"object" text not null,
"originating_transaction" jsonb,
"refunded" boolean not null,
"refunds" jsonb not null
);
CREATE TABLE stripe.refund (
"amount" integer not null,
"balance_transaction" jsonb,
"charge" jsonb,
"created" integer,
"currency" text not null,
"description" text,
"failure_balance_transaction" jsonb,
"failure_reason" text,
"id" text not null,
"instructions_email" text,
"metadata" jsonb,
"next_action" jsonb,
"object" text not null,
"payment_intent" jsonb,
"reason" text,
"receipt_number" text,
"source_transfer_reversal" jsonb,
"status" text,
"transfer_reversal" jsonb
);
CREATE TABLE stripe.balance (
"available" jsonb not null,
"connect_reserved" jsonb,
"instant_available" jsonb,
"issuing" jsonb,
"livemode" boolean,
"object" text not null,
"pending" jsonb not null
);
CREATE TABLE stripe.configuration (
"active" boolean not null,
"application" jsonb,
"business_profile" jsonb not null,
"created" integer,
"default_return_url" text,
"features" jsonb not null,
"id" text not null,
"is_default" boolean not null,
"livemode" boolean,
"metadata" jsonb,
"object" text not null,
"updated" integer not null
);
CREATE TABLE stripe.session (
"configuration" jsonb,
"created" integer,
"customer" text not null,
"id" text not null,
"livemode" boolean,
"locale" text,
"object" text not null,
"on_behalf_of" text,
"return_url" text,
"url" text not null
);
CREATE TABLE stripe.capability (
"account" jsonb not null,
"future_requirements" jsonb,
"id" text not null,
"object" text not null,
"requested" boolean not null,
"requested_at" integer,
"requirements" jsonb,
"status" text
);
CREATE TABLE stripe.cash_balance (
"available" jsonb,
"customer" text not null,
"livemode" boolean,
"object" text not null,
"settings" jsonb not null
);
CREATE TABLE stripe.charge (
"amount" integer not null,
"amount_captured" integer not null,
"amount_refunded" integer not null,
"application" jsonb,
"application_fee" jsonb,
"application_fee_amount" integer,
"balance_transaction" jsonb,
"billing_details" jsonb not null,
"calculated_statement_descriptor" text,
"captured" boolean not null,
"created" integer,
"currency" text not null,
"customer" jsonb,
"description" text,
"disputed" boolean not null,
"failure_balance_transaction" jsonb,
"failure_code" text,
"failure_message" text,
"fraud_details" jsonb,
"id" text not null,
"invoice" jsonb,
"livemode" boolean,
"metadata" jsonb not null,
"object" text not null,
"on_behalf_of" jsonb,
"outcome" jsonb,
"paid" boolean not null,
"payment_intent" jsonb,
"payment_method" text,
"payment_method_details" jsonb,
"radar_options" jsonb,
"receipt_email" text,
"receipt_number" text,
"receipt_url" text,
"refunded" boolean not null,
"refunds" jsonb not null,
"review" jsonb,
"shipping" jsonb,
"source_transfer" jsonb,
"statement_descriptor" text,
"statement_descriptor_suffix" text,
"status" text,
"transfer" jsonb,
"transfer_data" jsonb,
"transfer_group" text
);
CREATE TABLE stripe.dispute (
"amount" integer not null,
"balance_transactions" jsonb not null,
"charge" jsonb not null,
"created" integer,
"currency" text not null,
"evidence" jsonb not null,
"evidence_details" jsonb not null,
"id" text not null,
"is_charge_refundable" boolean not null,
"livemode" boolean,
"metadata" jsonb not null,
"object" text not null,
"payment_intent" jsonb,
"reason" text not null,
"status" text
);
CREATE TABLE stripe.checkout_session (
"after_expiration" jsonb,
"allow_promotion_codes" boolean,
"amount_subtotal" integer,
"amount_total" integer,
"automatic_tax" jsonb not null,
"billing_address_collection" text,
"cancel_url" text not null,
"client_reference_id" text,
"consent" jsonb,
"consent_collection" jsonb,
"currency" text,
"customer" jsonb,
"customer_creation" text,
"customer_details" jsonb,
"customer_email" text,
"expires_at" integer not null,
"id" text not null,
"line_items" jsonb,
"livemode" boolean,
"locale" text,
"metadata" jsonb,
"mode" text not null,
"object" text not null,
"payment_intent" jsonb,
"payment_link" jsonb,
"payment_method_collection" text,
"payment_method_options" jsonb,
"payment_method_types" jsonb not null,
"payment_status" text not null,
"phone_number_collection" jsonb,
"recovered_from" text,
"setup_intent" jsonb,
"shipping_address_collection" jsonb,
"shipping_cost" jsonb,
"shipping_details" jsonb,
"shipping_options" jsonb not null,
"status" text,
"submit_type" text,
"subscription" jsonb,
"success_url" text not null,
"tax_id_collection" jsonb,
"total_details" jsonb,
"url" text
);
CREATE TABLE stripe.coupon (
"amount_off" integer,
"applies_to" jsonb,
"created" integer,
"currency" text,
"currency_options" jsonb,
"duration" text not null,
"duration_in_months" integer,
"id" text not null,
"livemode" boolean,
"max_redemptions" integer,
"metadata" jsonb,
"name" text,
"object" text not null,
"percent_off" integer,
"redeem_by" integer,
"times_redeemed" integer not null,
"valid" boolean not null
);
CREATE TABLE stripe.credit_note (
"amount" integer not null,
"created" integer,
"currency" text not null,
"customer" jsonb not null,
"customer_balance_transaction" jsonb,
"discount_amount" integer not null,
"discount_amounts" jsonb not null,
"id" text not null,
"invoice" jsonb not null,
"lines" jsonb not null,
"livemode" boolean,
"memo" text,
"metadata" jsonb,
"number" text not null,
"object" text not null,
"out_of_band_amount" integer,
"pdf" text not null,
"reason" text,
"refund" jsonb,
"status" text,
"subtotal" integer not null,
"subtotal_excluding_tax" integer,
"tax_amounts" jsonb not null,
"total" integer not null,
"total_excluding_tax" integer,
"type" text not null,
"voided_at" integer
);
CREATE TABLE stripe.customer (
"address" jsonb,
"balance" integer,
"cash_balance" jsonb,
"created" integer,
"currency" text,
"default_source" jsonb,
"delinquent" boolean,
"description" text,
"discount" jsonb,
"email" text,
"id" text not null,
"invoice_credit_balance" jsonb,
"invoice_prefix" text,
"invoice_settings" jsonb,
"livemode" boolean,
"metadata" jsonb,
"name" text,
"next_invoice_sequence" integer,
"object" text not null,
"phone" text,
"preferred_locales" jsonb,
"shipping" jsonb,
"sources" jsonb,
"subscriptions" jsonb,
"tax" jsonb,
"tax_exempt" text,
"tax_ids" jsonb,
"test_clock" jsonb
);
CREATE TABLE stripe.discount (
"checkout_session" text,
"coupon" jsonb not null,
"customer" jsonb,
"end" integer,
"id" text not null,
"invoice" text,
"invoice_item" text,
"object" text not null,
"promotion_code" jsonb,
"start" integer not null,
"subscription" text
);
CREATE TABLE stripe.source (
"ach_credit_transfer" jsonb,
"ach_debit" jsonb,
"acss_debit" jsonb,
"alipay" jsonb,
"amount" integer,
"au_becs_debit" jsonb,
"bancontact" jsonb,
"card" jsonb,
"card_present" jsonb,
"client_secret" text,
"code_verification" jsonb,
"created" integer,
"currency" text,
"customer" text,
"eps" jsonb,
"flow" text,
"giropay" jsonb,
"id" text not null,
"ideal" jsonb,
"klarna" jsonb,
"livemode" boolean,
"metadata" jsonb,
"multibanco" jsonb,
"object" text not null,
"owner" jsonb,
"p24" jsonb,
"receiver" jsonb,
"redirect" jsonb,
"sepa_debit" jsonb,
"sofort" jsonb,
"source_order" jsonb,
"statement_descriptor" text,
"status" text,
"three_d_secure" jsonb,
"type" text,
"usage" text,
"wechat" jsonb
);
CREATE TABLE stripe.subscription (
"application" jsonb,
"application_fee_percent" integer,
"automatic_tax" jsonb not null,
"billing_cycle_anchor" integer not null,
"billing_thresholds" jsonb,
"cancel_at" integer,
"cancel_at_period_end" boolean not null,
"canceled_at" integer,
"collection_method" text not null,
"created" integer,
"currency" text not null,
"current_period_end" integer not null,
"current_period_start" integer not null,
"customer" jsonb not null,
"days_until_due" integer,
"default_payment_method" jsonb,
"default_source" jsonb,
"default_tax_rates" jsonb,
"description" text,
"discount" jsonb,
"ended_at" integer,
"id" text not null,
"items" jsonb not null,
"latest_invoice" jsonb,
"livemode" boolean,
"metadata" jsonb not null,
"next_pending_invoice_item_invoice" integer,
"object" text not null,
"pause_collection" jsonb,
"payment_settings" jsonb,
"pending_invoice_item_interval" jsonb,
"pending_setup_intent" jsonb,
"pending_update" jsonb,
"schedule" jsonb,
"start_date" integer not null,
"status" text,
"test_clock" jsonb,
"transfer_data" jsonb,
"trial_end" integer,
"trial_start" integer
);
CREATE TABLE stripe.tax_id (
"country" text,
"created" integer,
"customer" jsonb,
"id" text not null,
"livemode" boolean,
"object" text not null,
"type" text not null,
"value" text not null,
"verification" jsonb
);
CREATE TABLE stripe.customer_cash_balance_transaction (
"applied_to_payment" jsonb,
"created" integer,
"currency" text not null,
"customer" jsonb not null,
"ending_balance" integer not null,
"funded" jsonb,
"id" text not null,
"livemode" boolean,
"net_amount" integer not null,
"object" text not null,
"refunded_from_payment" jsonb,
"type" text not null,
"unapplied_from_payment" jsonb
);
CREATE TABLE stripe.file (
"created" integer,
"expires_at" integer,
"filename" text,
"id" text not null,
"links" jsonb,
"object" text not null,
"purpose" text,
"size" integer not null,
"title" text,
"type" text,
"url" text
);
CREATE TABLE stripe.verification_session (
"client_secret" text,
"created" integer,
"id" text not null,
"last_error" jsonb,
"last_verification_report" jsonb,
"livemode" boolean,
"metadata" jsonb not null,
"object" text not null,
"options" jsonb not null,
"redaction" jsonb,
"status" text,
"type" text,
"url" text,
"verified_outputs" jsonb
);
CREATE TABLE stripe.invoice (
"account_country" text,
"account_name" text,
"account_tax_ids" jsonb,
"amount_due" integer not null,
"amount_paid" integer not null,
"amount_remaining" integer not null,
"application" jsonb,
"application_fee_amount" integer,
"attempt_count" integer not null,
"attempted" boolean not null,
"auto_advance" boolean,
"automatic_tax" jsonb not null,
"billing_reason" text,
"charge" jsonb,
"collection_method" text not null,
"created" integer,
"currency" text not null,
"custom_fields" jsonb,
"customer" jsonb,
"customer_address" jsonb,
"customer_email" text,
"customer_name" text,
"customer_phone" text,
"customer_shipping" jsonb,
"customer_tax_exempt" text,
"customer_tax_ids" jsonb,
"default_payment_method" jsonb,
"default_source" jsonb,
"default_tax_rates" jsonb not null,
"description" text,
"discount" jsonb,
"discounts" jsonb,
"due_date" integer,
"ending_balance" integer,
"footer" text,
"hosted_invoice_url" text,
"id" text,
"invoice_pdf" text,
"last_finalization_error" jsonb,
"lines" jsonb not null,
"livemode" boolean,
"metadata" jsonb,
"next_payment_attempt" integer,
"number" text,
"object" text not null,
"on_behalf_of" jsonb,
"paid" boolean not null,
"paid_out_of_band" boolean not null,
"payment_intent" jsonb,
"payment_settings" jsonb not null,
"period_end" integer not null,
"period_start" integer not null,
"post_payment_credit_notes_amount" integer not null,
"pre_payment_credit_notes_amount" integer not null,
"quote" jsonb,
"receipt_number" text,
"rendering_options" jsonb,
"starting_balance" integer not null,
"statement_descriptor" text,
"status" text,
"status_transitions" jsonb not null,
"subscription" jsonb,
"subscription_proration_date" integer,
"subtotal" integer not null,
"subtotal_excluding_tax" integer,
"tax" integer,
"test_clock" jsonb,
"threshold_reason" jsonb,
"total" integer not null,
"total_discount_amounts" jsonb,
"total_excluding_tax" integer,
"total_tax_amounts" jsonb not null,
"transfer_data" jsonb,
"webhooks_delivered_at" integer
);
CREATE TABLE stripe.invoiceitem (
"amount" integer not null,
"currency" text not null,
"customer" jsonb not null,
"date" integer not null,
"description" text,
"discountable" boolean not null,
"discounts" jsonb,
"id" text not null,
"invoice" jsonb,
"livemode" boolean,
"metadata" jsonb,
"object" text not null,
"period" jsonb not null,
"price" jsonb,
"proration" boolean not null,
"quantity" integer not null,
"subscription" jsonb,
"subscription_item" text,
"tax_rates" jsonb,
"test_clock" jsonb,
"unit_amount" integer,
"unit_amount_decimal" text
);
CREATE TABLE stripe.issuing_authorization (
"amount" integer not null,
"amount_details" jsonb,
"approved" boolean not null,
"authorization_method" text not null,
"balance_transactions" jsonb not null,
"card" jsonb not null,
"cardholder" jsonb,
"created" integer,
"currency" text not null,
"id" text not null,
"livemode" boolean,
"merchant_amount" integer not null,
"merchant_currency" text not null,
"merchant_data" jsonb not null,
"metadata" jsonb not null,
"object" text not null,
"pending_request" jsonb,
"request_history" jsonb not null,
"status" text,
"transactions" jsonb not null,
"treasury" jsonb,
"verification_data" jsonb not null,
"wallet" text
);
CREATE TABLE stripe.issuing_card (
"brand" text not null,
"cancellation_reason" text,
"cardholder" jsonb not null,
"created" integer,
"currency" text not null,
"cvc" text,
"exp_month" integer not null,
"exp_year" integer not null,
"financial_account" text,
"id" text not null,
"last4" text not null,
"livemode" boolean,
"metadata" jsonb not null,
"number" text,
"object" text not null,
"replaced_by" jsonb,
"replacement_for" jsonb,
"replacement_reason" text,
"shipping" jsonb,
"spending_controls" jsonb not null,
"status" text,
"type" text not null,
"wallets" jsonb
);
CREATE TABLE stripe.issuing_cardholder (
"billing" jsonb not null,
"company" jsonb,
"created" integer,
"email" text,
"id" text not null,
"individual" jsonb,
"livemode" boolean,
"metadata" jsonb not null,
"name" text not null,
"object" text not null,
"phone_number" text,
"requirements" jsonb not null,
"spending_controls" jsonb,
"status" text,
"type" text
);
CREATE TABLE stripe.issuing_dispute (
"amount" integer not null,
"balance_transactions" jsonb,
"created" integer,
"currency" text not null,
"evidence" jsonb not null,
"id" text not null,
"livemode" boolean,
"metadata" jsonb not null,
"object" text not null,
"status" text,
"transaction" jsonb not null,
"treasury" jsonb
);
CREATE TABLE stripe.issuing_transaction (
"amount" integer not null,
"amount_details" jsonb,
"authorization" jsonb,
"balance_transaction" jsonb,
"card" jsonb not null,
"cardholder" jsonb,
"created" integer,
"currency" text not null,
"dispute" jsonb,
"id" text not null,
"livemode" boolean,
"merchant_amount" integer not null,
"merchant_currency" text not null,
"merchant_data" jsonb not null,
"metadata" jsonb not null,
"object" text not null,
"purchase_details" jsonb,
"treasury" jsonb,
"type" text,
"wallet" text
);
CREATE TABLE stripe.mandate (
"customer_acceptance" jsonb not null,
"id" text not null,
"livemode" boolean,
"multi_use" jsonb,
"object" text not null,
"payment_method" jsonb not null,
"payment_method_details" jsonb not null,
"single_use" jsonb,
"status" text,
"type" text not null
);
CREATE TABLE stripe.order (
"amount_subtotal" integer not null,
"amount_total" integer not null,
"application" jsonb,
"automatic_tax" jsonb,
"billing_details" jsonb,
"client_secret" text,
"created" integer,
"currency" text not null,
"customer" jsonb,
"description" text,
"discounts" jsonb,
"id" text not null,
"ip_address" text,
"line_items" jsonb,
"livemode" boolean,
"metadata" jsonb,
"object" text not null,
"payment" jsonb not null,
"shipping_cost" jsonb,
"shipping_details" jsonb,
"status" text,
"tax_details" jsonb,
"total_details" jsonb not null
);
CREATE TABLE stripe.payment_intent (
"amount" integer not null,
"amount_capturable" integer,
"amount_details" jsonb,
"amount_received" integer,
"application" jsonb,
"application_fee_amount" integer,
"automatic_payment_methods" jsonb,
"canceled_at" integer,
"cancellation_reason" text,
"capture_method" text not null,
"charges" jsonb,
"client_secret" text,
"confirmation_method" text not null,
"created" integer,
"currency" text not null,
"customer" jsonb,
"description" text,
"id" text not null,
"invoice" jsonb,
"last_payment_error" jsonb,
"livemode" boolean,
"metadata" jsonb,
"next_action" jsonb,
"object" text not null,
"on_behalf_of" jsonb,
"payment_method" jsonb,
"payment_method_options" jsonb,
"payment_method_types" jsonb not null,
"processing" jsonb,
"receipt_email" text,
"review" jsonb,
"setup_future_usage" text,
"shipping" jsonb,
"statement_descriptor" text,
"statement_descriptor_suffix" text,
"status" text,
"transfer_data" jsonb,
"transfer_group" text
);
CREATE TABLE stripe.payment_link (
"active" boolean not null,
"after_completion" jsonb not null,
"allow_promotion_codes" boolean not null,
"application_fee_amount" integer,
"application_fee_percent" integer,
"automatic_tax" jsonb not null,
"billing_address_collection" text not null,
"consent_collection" jsonb,
"currency" text not null,
"customer_creation" text not null,
"id" text not null,
"line_items" jsonb,
"livemode" boolean,
"metadata" jsonb not null,
"object" text not null,
"on_behalf_of" jsonb,
"payment_intent_data" jsonb,
"payment_method_collection" text not null,
"payment_method_types" jsonb,
"phone_number_collection" jsonb not null,
"shipping_address_collection" jsonb,
"shipping_options" jsonb not null,
"submit_type" text not null,
"subscription_data" jsonb,
"tax_id_collection" jsonb not null,
"transfer_data" jsonb,
"url" text not null
);
CREATE TABLE stripe.payment_method (
"acss_debit" jsonb,
"affirm" jsonb,
"afterpay_clearpay" jsonb,
"alipay" jsonb,
"au_becs_debit" jsonb,
"bacs_debit" jsonb,
"bancontact" jsonb,
"billing_details" jsonb not null,
"blik" jsonb,
"boleto" jsonb,
"card" jsonb,
"card_present" jsonb,
"created" integer,
"customer" jsonb,
"customer_balance" jsonb,
"eps" jsonb,
"fpx" jsonb,
"giropay" jsonb,
"grabpay" jsonb,
"id" text not null,
"ideal" jsonb,
"interac_present" jsonb,
"klarna" jsonb,
"konbini" jsonb,
"link" jsonb,
"livemode" boolean,
"metadata" jsonb,
"object" text not null,
"oxxo" jsonb,
"p24" jsonb,
"paynow" jsonb,
"promptpay" jsonb,
"radar_options" jsonb,
"sepa_debit" jsonb,
"sofort" jsonb,
"type" text,
"us_bank_account" jsonb,
"wechat_pay" jsonb
);
CREATE TABLE stripe.payout (
"amount" integer not null,
"arrival_date" integer not null,
"automatic" boolean not null,
"balance_transaction" jsonb,
"created" integer,
"currency" text not null,
"description" text,
"destination" jsonb,
"failure_balance_transaction" jsonb,
"failure_code" text,
"failure_message" text,
"id" text not null,
"livemode" boolean,
"metadata" jsonb,
"method" text not null,
"object" text not null,
"original_payout" jsonb,
"reversed_by" jsonb,
"source_type" text not null,
"statement_descriptor" text,
"status" text,
"type" text
);
CREATE TABLE stripe.person (
"account" text not null,
"address" jsonb,
"address_kana" jsonb,
"address_kanji" jsonb,
"created" integer,
"dob" jsonb,
"email" text,
"first_name" text,
"first_name_kana" text,
"first_name_kanji" text,
"full_name_aliases" jsonb,
"future_requirements" jsonb,
"gender" text,
"id" text not null,
"id_number_provided" boolean,
"id_number_secondary_provided" boolean,
"last_name" text,
"last_name_kana" text,
"last_name_kanji" text,
"maiden_name" text,
"metadata" jsonb,
"nationality" text,
"object" text not null,
"phone" text,
"political_exposure" text,
"registered_address" jsonb,
"relationship" jsonb,
"requirements" jsonb,
"ssn_last_4_provided" boolean,
"verification" jsonb
);
CREATE TABLE stripe.plan (
"active" boolean not null,
"aggregate_usage" text,
"amount" integer,
"amount_decimal" text,
"billing_scheme" text not null,
"created" integer,
"currency" text not null,
"id" text not null,
"interval" text not null,
"interval_count" integer not null,
"livemode" boolean,
"metadata" jsonb,
"nickname" text,
"object" text not null,
"product" jsonb,
"tiers" jsonb,
"tiers_mode" text,
"transform_usage" jsonb,
"trial_period_days" integer,
"usage_type" text not null
);
CREATE TABLE stripe.price (
"active" boolean not null,
"billing_scheme" text not null,
"created" integer,
"currency" text not null,
"currency_options" jsonb,
"custom_unit_amount" jsonb,
"id" text not null,
"livemode" boolean,
"lookup_key" text,
"metadata" jsonb not null,
"nickname" text,
"object" text not null,
"product" jsonb not null,
"recurring" jsonb,
"tax_behavior" text,
"tiers" jsonb,
"tiers_mode" text,
"transform_quantity" jsonb,
"type" text not null,
"unit_amount" integer,
"unit_amount_decimal" text
);
CREATE TABLE stripe.product (
"active" boolean not null,
"created" integer,
"default_price" jsonb,
"description" text,
"id" text not null,
"images" jsonb not null,
"livemode" boolean,
"metadata" jsonb not null,
"name" text not null,
"object" text not null,
"package_dimensions" jsonb,
"shippable" boolean,
"statement_descriptor" text,
"tax_code" jsonb,
"unit_label" text,
"updated" integer not null,
"url" text
);
CREATE TABLE stripe.promotion_code (
"active" boolean not null,
"code" text not null,
"coupon" jsonb not null,
"created" integer,
"customer" jsonb,
"expires_at" integer,
"id" text not null,
"livemode" boolean,
"max_redemptions" integer,
"metadata" jsonb,
"object" text not null,
"restrictions" jsonb not null,
"times_redeemed" integer not null
);
CREATE TABLE stripe.quote (
"amount_subtotal" integer not null,
"amount_total" integer not null,
"application" jsonb,
"application_fee_amount" integer,
"application_fee_percent" integer,
"automatic_tax" jsonb not null,
"collection_method" text not null,
"computed" jsonb not null,
"created" integer,
"currency" text,
"customer" jsonb,
"default_tax_rates" jsonb,
"description" text,
"discounts" jsonb not null,
"expires_at" integer not null,
"footer" text,
"from_quote" jsonb,
"header" text,
"id" text not null,
"invoice" jsonb,
"invoice_settings" jsonb,
"line_items" jsonb,
"livemode" boolean,
"metadata" jsonb not null,
"number" text,
"object" text not null,
"on_behalf_of" jsonb,
"status" text,
"status_transitions" jsonb not null,
"subscription" jsonb,
"subscription_data" jsonb not null,
"subscription_schedule" jsonb,
"test_clock" jsonb,
"total_details" jsonb not null,
"transfer_data" jsonb
);
CREATE TABLE stripe.early_fraud_warning (
"actionable" boolean not null,
"charge" jsonb not null,
"created" integer,
"fraud_type" text not null,
"id" text not null,
"livemode" boolean,
"object" text not null,
"payment_intent" jsonb
);
CREATE TABLE stripe.recipient (
"active_account" jsonb,
"cards" jsonb,
"created" integer,
"default_card" jsonb,
"description" text,
"email" text,
"id" text not null,
"livemode" boolean,
"metadata" jsonb not null,
"migrated_to" jsonb,
"name" text,
"object" text not null,
"rolled_back_from" jsonb,
"type" text not null
);
CREATE TABLE stripe.report_run (
"created" integer,
"error" text,
"id" text not null,
"livemode" boolean,
"object" text not null,
"parameters" jsonb not null,
"report_type" text not null,
"result" jsonb,
"status" text,
"succeeded_at" integer
);
CREATE TABLE stripe.report_type (
"data_available_end" integer not null,
"data_available_start" integer not null,
"default_columns" jsonb,
"id" text not null,
"livemode" boolean,
"name" text not null,
"object" text not null,
"updated" integer not null,
"version" integer not null
);
CREATE TABLE stripe.review (
"billing_zip" text,
"charge" jsonb,
"closed_reason" text,
"created" integer,
"id" text not null,
"ip_address" text,
"ip_address_location" jsonb,
"livemode" boolean,
"object" text not null,
"open" boolean not null,
"opened_reason" text not null,
"payment_intent" jsonb,
"reason" text not null,
"session" jsonb
);
CREATE TABLE stripe.setup_intent (
"application" jsonb,
"attach_to_self" boolean,
"cancellation_reason" text,
"client_secret" text,
"created" integer,
"customer" jsonb,
"description" text,
"flow_directions" jsonb,
"id" text not null,
"last_setup_error" jsonb,
"latest_attempt" jsonb,
"livemode" boolean,
"mandate" jsonb,
"metadata" jsonb,
"next_action" jsonb,
"object" text not null,
"on_behalf_of" jsonb,
"payment_method" jsonb,
"payment_method_options" jsonb,
"payment_method_types" jsonb not null,
"single_use_mandate" jsonb,
"status" text,
"usage" text not null
);
CREATE TABLE stripe.scheduled_query_run (
"created" integer,
"data_load_time" integer not null,
"error" jsonb,
"file" jsonb,
"id" text not null,
"livemode" boolean,
"object" text not null,
"result_available_until" integer not null,
"sql" text not null,
"status" text,
"title" text not null
);
CREATE TABLE stripe.sku (
"active" boolean not null,
"attributes" jsonb not null,
"created" integer,
"currency" text not null,
"id" text not null,
"image" text,
"inventory" jsonb not null,
"livemode" boolean,
"metadata" jsonb not null,
"object" text not null,
"package_dimensions" jsonb,
"price" integer not null,
"product" jsonb not null,
"updated" integer not null
);
CREATE TABLE stripe.transaction (
"ach_credit_transfer" jsonb,
"amount" integer not null,
"chf_credit_transfer" jsonb,
"created" integer,
"currency" text not null,
"gbp_credit_transfer" jsonb,
"id" text not null,
"livemode" boolean,
"object" text not null,
"paper_check" jsonb,
"sepa_credit_transfer" jsonb,
"source" text not null,
"status" text,
"type" text not null
);
CREATE TABLE stripe.subscription_schedule (
"application" jsonb,
"canceled_at" integer,
"completed_at" integer,
"created" integer,
"current_phase" jsonb,
"customer" jsonb not null,
"default_settings" jsonb not null,
"end_behavior" text not null,
"id" text not null,
"livemode" boolean,
"metadata" jsonb,
"object" text not null,
"phases" jsonb not null,
"released_at" integer,
"released_subscription" text,
"status" text,
"subscription" jsonb,
"test_clock" jsonb
);
CREATE TABLE stripe.tax_rate (
"active" boolean not null,
"country" text,
"created" integer,
"description" text,
"display_name" text not null,
"id" text not null,
"inclusive" boolean not null,
"jurisdiction" text,
"livemode" boolean,
"metadata" jsonb,
"object" text not null,
"percentage" integer not null,
"state" text,
"tax_type" text
);
CREATE TABLE stripe.reader (
"action" jsonb,
"device_sw_version" text,
"device_type" text not null,
"id" text not null,
"ip_address" text,
"label" text not null,
"livemode" boolean,
"location" jsonb,
"metadata" jsonb not null,
"object" text not null,
"serial_number" text not null,
"status" text
);
CREATE TABLE stripe.test_clock (
"created" integer,
"deletes_after" integer not null,
"frozen_time" integer not null,
"id" text not null,
"livemode" boolean,
"name" text,
"object" text not null,
"status" text
);
CREATE TABLE stripe.topup (
"amount" integer not null,
"balance_transaction" jsonb,
"created" integer,
"currency" text not null,
"description" text,
"expected_availability_date" integer,
"failure_code" text,
"failure_message" text,
"id" text not null,
"livemode" boolean,
"metadata" jsonb not null,
"object" text not null,
"source" jsonb,
"statement_descriptor" text,
"status" text,
"transfer_group" text
);
CREATE TABLE stripe.transfer (
"amount" integer not null,
"amount_reversed" integer not null,
"balance_transaction" jsonb,
"created" integer,
"currency" text not null,
"description" text,
"destination" jsonb,
"destination_payment" jsonb,
"id" text not null,
"livemode" boolean,
"metadata" jsonb not null,
"object" text not null,
"reversals" jsonb not null,
"reversed" boolean not null,
"source_transaction" jsonb,
"source_type" text,
"transfer_group" text
);
CREATE TABLE stripe.credit_reversal (
"amount" integer not null,
"currency" text not null,
"financial_account" text not null,
"hosted_regulatory_receipt_url" text,
"id" text not null,
"livemode" boolean,
"metadata" jsonb not null,
"network" text not null,
"object" text not null,
"received_credit" text not null,
"status" text,
"status_transitions" jsonb not null,
"transaction" jsonb
);
CREATE TABLE stripe.debit_reversal (
"amount" integer not null,
"currency" text not null,
"financial_account" text,
"hosted_regulatory_receipt_url" text,
"id" text not null,
"linked_flows" jsonb,
"livemode" boolean,
"metadata" jsonb not null,
"network" text not null,
"object" text not null,
"received_debit" text not null,
"status" text,
"status_transitions" jsonb not null,
"transaction" jsonb
);
CREATE TABLE stripe.financial_account (
"active_features" jsonb not null,
"balance" jsonb not null,
"country" text not null,
"created" integer,
"features" jsonb,
"financial_addresses" jsonb not null,
"id" text not null,
"livemode" boolean,
"metadata" jsonb,
"object" text not null,
"pending_features" jsonb not null,
"platform_restrictions" jsonb,
"restricted_features" jsonb not null,
"status" text,
"status_details" jsonb not null,
"supported_currencies" jsonb not null
);
CREATE TABLE stripe.inbound_transfer (
"amount" integer not null,
"cancelable" boolean not null,
"created" integer,
"currency" text not null,
"description" text,
"failure_details" jsonb,
"financial_account" text not null,
"hosted_regulatory_receipt_url" text,
"id" text not null,
"linked_flows" jsonb not null,
"livemode" boolean,
"metadata" jsonb not null,
"object" text not null,
"origin_payment_method" text not null,
"origin_payment_method_details" jsonb,
"returned" boolean,
"statement_descriptor" text not null,
"status" text,
"status_transitions" jsonb not null,
"transaction" jsonb
);
CREATE TABLE stripe.outbound_payment (
"amount" integer not null,
"cancelable" boolean not null,
"created" integer,
"currency" text not null,
"customer" text,
"description" text,
"destination_payment_method" text,
"destination_payment_method_details" jsonb,
"end_user_details" jsonb,
"expected_arrival_date" integer not null,
"financial_account" text not null,
"hosted_regulatory_receipt_url" text,
"id" text not null,
"livemode" boolean,
"metadata" jsonb not null,
"object" text not null,
"returned_details" jsonb,
"statement_descriptor" text not null,
"status" text,
"status_transitions" jsonb not null,
"transaction" jsonb not null
);
CREATE TABLE stripe.outbound_transfer (
"amount" integer not null,
"cancelable" boolean not null,
"created" integer,
"currency" text not null,
"description" text,
"destination_payment_method" text not null,
"destination_payment_method_details" jsonb not null,
"expected_arrival_date" integer not null,
"financial_account" text not null,
"hosted_regulatory_receipt_url" text,
"id" text not null,
"livemode" boolean,
"metadata" jsonb not null,
"object" text not null,
"returned_details" jsonb,
"statement_descriptor" text not null,
"status" text,
"status_transitions" jsonb not null,
"transaction" jsonb not null
);
CREATE TABLE stripe.received_credit (
"amount" integer not null,
"created" integer,
"currency" text not null,
"description" text not null,
"failure_code" text,
"financial_account" text,
"hosted_regulatory_receipt_url" text,
"id" text not null,
"initiating_payment_method_details" jsonb not null,
"linked_flows" jsonb not null,
"livemode" boolean,
"network" text,
"object" text not null,
"reversal_details" jsonb,
"status" text,
"transaction" jsonb
);
CREATE TABLE stripe.received_debit (
"amount" integer not null,
"created" integer,
"currency" text not null,
"description" text not null,
"failure_code" text,
"financial_account" text,
"hosted_regulatory_receipt_url" text,
"id" text not null,
"initiating_payment_method_details" jsonb,
"linked_flows" jsonb not null,
"livemode" boolean,
"network" text,
"object" text not null,
"reversal_details" jsonb,
"status" text,
"transaction" jsonb
);
Update database permissions
Make sure to only use the service_role
Supabase client in a protected server environment to access Stripe data.
sql
grant usage on schema stripe to service_role;
grant all privileges on all tables in schema stripe to service_role;
Update Supabase API options
Add the stripe
schema to search path and make sure that Supabase/Postgrest will expose the schema to the API.
Add Supabase Edge Functions handler
Init Supabase
bash
supabase init
Create Supabase function handler
bash
supabase functions new stripe
./supabase/functions/stripe/index.ts
ts
import { serve } from "https://deno.land/std@0.131.0/http/server.ts";
import Stripe from "https://esm.sh/stripe@9.6.0?target=deno&no-check";
import {
createDenoHandler,
createSupabaseAdapter,
} from "https://esm.sh/stripe-sync@0.0.9";
import { createClient } from "https://esm.sh/@supabase/supabase-js@2.0.0-rc.4";
const stripe = Stripe(Deno.env.get("STRIPE_API_KEY"), {
httpClient: Stripe.createFetchHttpClient(),
apiVersion: "2022-08-01",
});
const cryptoProvider = Stripe.createSubtleCryptoProvider();
export const supabaseClient = createClient(
Deno.env.get("SUPABASE_URL") ?? "",
Deno.env.get("SUPABASE_SERVICE_ROLE_KEY") ?? "",
{
db: {
schema: "stripe",
},
}
);
const handler = createDenoHandler({
databaseAdapter: createSupabaseAdapter({
supabase: supabaseClient,
}),
stripe,
cryptoProvider,
stripeEndpointSecret: Deno.env.get("STRIPE_ENDPOINT_SECRET") ?? "",
stripeSecretKey: Deno.env.get("STRIPE_SK") ?? "",
});
serve(handler);
Create .env
file
./supabase/.env
STRIPE_SK=sk_...
STRIPE_ENDPOINT_SECRET=whsec_...
Deploy edge functions
Make sure to pass the --no-verify-jwt
flat, since we want Stripe to be able to send us POST reqeusts.
supabase secrets set --env-file ./supabase/.env
supabase functions deploy stripe --no-verify-jwt