LoadersStripe

Stripe Loader

The Stripe loader pulls payment, subscription, and customer data from your Stripe account into your data warehouse. It uses Stripe’s list API endpoints with cursor-based pagination and supports incremental sync via the created timestamp for most objects.

Prerequisites

  • A Stripe account (Test mode or Live mode)
  • A Stripe API key with read permissions
  • A connected Warehouse (target warehouse) with write permissions on the target schema

Authentication

The Stripe loader uses API Key authentication.

Obtaining an API Key

  1. Log in to the Stripe Dashboard
  2. Navigate to Developers > API Keys
  3. Copy your Secret key (starts with sk_live_ for live mode or sk_test_ for test mode)
  4. In SignalSmith, paste the key into the API Key field

Security recommendations:

  • Use a restricted key with only read permissions. In Stripe, click “Create restricted key” and grant Read access to the resources you need.
  • Never use your live secret key for testing. Use sk_test_ keys with SignalSmith’s test mode to validate the configuration first.
Key TypePrefixUse Case
Live Secretsk_live_Production data extraction
Test Secretsk_test_Testing and development
Restrictedrk_live_ / rk_test_Recommended — scoped read-only access

Available Objects

ObjectAPI NameDescriptionDefault Sync Mode
CustomerscustomersCustomer records with email, name, and metadataIncremental
ChargeschargesIndividual payment charges (succeeded, failed, refunded)Incremental
SubscriptionssubscriptionsRecurring billing subscriptions and their statusesIncremental
InvoicesinvoicesInvoice records tied to subscriptions or one-off paymentsIncremental
Invoice Itemsinvoice_itemsIndividual line items on invoicesIncremental
ProductsproductsProduct catalog entriesIncremental
PricespricesPricing definitions (recurring, one-time, tiered)Incremental
Payment Intentspayment_intentsPayment flow records from the Payment Intents APIIncremental
Payment Methodspayment_methodsStored payment methods (cards, bank accounts)Full Refresh
RefundsrefundsRefund records associated with chargesIncremental
DisputesdisputesChargeback and dispute recordsIncremental
CouponscouponsDiscount couponsFull Refresh
PlansplansLegacy pricing plans (superseded by Prices)Full Refresh
Balance Transactionsbalance_transactionsLedger entries for all money movementIncremental
EventseventsStripe webhook event log (last 30 days)Incremental

Configuration

SettingDescriptionDefault
API KeyStripe secret key or restricted key— (required)
ModeLive or TestLive
ObjectsList of objects to sync— (you choose during setup)
Sync ModeFull Refresh or Incremental (per object)Incremental
Cursor FieldField used for incremental synccreated
Primary KeyField(s) that uniquely identify a recordid
Target SchemaWarehouse schema for Stripe tables— (required)
Table PrefixOptional prefix for table namesstripe_
ScheduleSync frequencyHourly

Scheduling Notes

  • Rate limits: Stripe allows 100 read requests per second in live mode and 25 per second in test mode. SignalSmith paginates efficiently and respects these limits with automatic backoff.
  • Incremental sync cursor: Most Stripe objects use the created timestamp for incremental sync. This means records are captured when they are created, but modifications to existing records (e.g., subscription status changes) are captured by re-fetching recent records within a lookback window.
  • Lookback window: For incremental syncs, SignalSmith applies a configurable lookback window (default: 3 days) to re-fetch recently created records that may have been updated. This ensures modifications are captured.
  • Event log retention: Stripe retains events for 30 days. If you sync events, the initial backfill captures the last 30 days. Incremental syncs keep the table up to date going forward.
  • Nested objects: Stripe’s API returns deeply nested JSON objects (e.g., metadata, address, shipping). SignalSmith flattens these into individual columns where possible and stores complex nested structures as JSON columns.

Schema Mapping

Stripe field types are mapped to warehouse-compatible types:

Stripe TypeWarehouse TypeNotes
stringVARCHAR
integerBIGINTAmounts are in the smallest currency unit (cents)
booleanBOOLEAN
timestampTIMESTAMPUnix epoch converted to UTC timestamp
hash (nested object)JSON / VARCHARFlattened when possible, JSON otherwise
arrayJSON / VARCHARStored as JSON array
enumVARCHARStatus fields like active, canceled, past_due

Currency and Amounts

Stripe stores all monetary amounts in the smallest currency unit (e.g., cents for USD, pence for GBP). The loader preserves this format. For example, a $10.50 charge is stored as 1050. Your models should divide by 100 (or the appropriate factor for the currency) when calculating display values.

Troubleshooting

IssueSolution
”Invalid API Key provided”Verify the key is correct and not expired. Check that you’re using the right mode (live vs. test)
“Permission denied” on specific objectsIf using a restricted key, ensure the key has Read access to the required resources
”Rate limit exceeded”SignalSmith handles rate limits automatically. If this persists with many objects, reduce sync frequency or stagger object extraction
Missing recent chargesIncremental sync uses created timestamp. Very recently created charges may appear on the next run
Amounts look wrong (too large)Stripe amounts are in cents. Divide by 100 in your model for dollar/euro values
Nested fields are JSON stringsComplex nested objects are stored as JSON. Use your warehouse’s JSON parsing functions in models
Test mode data appearing in productionVerify you configured the loader with a sk_live_ key, not sk_test_

Next Steps