On this page · 11 sections
Overview
The Stripe Connect integration is the input source for Kustiq’s churn engine. It reads subscription, charge, and customer data on your Stripe account and turns it into a churn-risk score on every matched paying customer. It does not run Kustiq’s own billing, and it does not run your reporting.
One direction, Stripe to Kustiq. We never call POST, PATCH, or DELETE against your Stripe account: a code-level guard blocks every non-GET request to the Stripe API and raises an error instead of mutating anything. 5 signal families feed the engine: MRR delta, payment failures, downgrades, days since last charge, and subscription status. The full list is in the Signal reference below.
With the integration on, a customer with fresh payment failures in the last 30 days moves to the top of the at-risk segment on the next sync. With Stripe alone, the same signal stays in the dashboard event log nobody scrolls.
Setup, in 4 minutes
Five steps. Stripe-side OAuth, no API key paste, no restricted-key creation. You can revoke the grant from your Stripe dashboard at any time, and Kustiq’s client refuses to send anything but reads.
Open Integrations in your Kustiq workspace
~ 20 secondsFrom the dashboard, go to Settings → Integrations. Find the Stripe card, click Connect. The Stripe Connect button opens in the same tab.
Authorise the Stripe Connect consent screen
~ 60 secondsStripe shows the consent dialog. Pick the account and click Connect my Stripe account. On Kustiq’s side a code-level guard blocks every write call to the Stripe API, so the integration only ever reads. Stripe redirects back to Kustiq and the integration card flips to Connected.
Run the first sync
~ 30 seconds to startPress Sync now on the Stripe card. Kustiq pages through your customers 100 at a time, pulling subscriptions, lifetime charges, and the last 30 days of subscription events so the engine has cohort context on day one.
Confirm the customer match
~ 1 minuteKustiq matches Stripe customers to your existing churn-engine profiles by saved customer ID first, then by email domain. Unmatched customers stay out of the score until you set the mapping manually from the profile.
Verify in the churn dashboard
~ 30 secondsOpen /dashboard/churn. Scores and CLTV bands populate as the first sync completes, then refresh on the daily sync or whenever you press Sync now.
Signal reference
Five signal families, read from three Stripe objects per customer during sync: subscriptions, lifetime charges, and the last 30 days of subscription update events. Nothing else on your account is read, so extra products or events cost you nothing and do not affect the score.
Churn signals
5 signals- stripe_payment_failureDunning
- stripe_subscription_status · past_due / canceledChurn
- stripe_downgradeDowngrade
- stripe_days_since_chargeSilence
- stripe_mrr_delta · contractionContraction
Recovery signals
3 signals- stripe_payment_failure · clean 30d windowRecovered
- stripe_subscription_status · activeActive
- stripe_mrr_delta · expansionUpgrade
stripe_mrr_delta appears in two columns; the sign of the delta decides direction.
Context inputs
3 inputs- billing interval + tenureCycle
- lifetime billed amountCLTV floor
- customer name, email, metadataMatching
Context inputs do not move the score on their own. They feed the cohort and tenure features the score and CLTV bands depend on.
Wire Stripe in 4 minutes, churn scores on the first sync.
Pro plan ($119/mo). The Stripe Connect integration is included; no per-event fee on usage.
Permissions and scopes
Stripe’s current Connect OAuth offers one standard grant for new platforms, so read-only is enforced on Kustiq’s side: an HTTP-layer guard blocks every non-GET request to the Stripe API and raises an error instead of mutating anything. The grant is revocable from Stripe → Settings → Connected apps without contacting support. What Kustiq actually reads:
- Customers · name, email, metadata. Used for matching and tenure features.
- Subscriptions · status, plan, interval, cancellation and pause state. Drives the status and downgrade signals.
- Charges · amount, status, attempt history, lifetime totals. Drives the dunning signal and the CLTV floor.
- Subscription update events · last 30 days. Drives downgrade and MRR-delta detection.
Kustiq does not read balances, transfers, payouts, tax records, or bank data, and never issues a write. If your IT review asks for a written list of what we touch, the four lines above are the answer.
Outbound webhooks
Kustiq does not register webhooks on your Stripe account; every sync is a read. Webhooks go the other way: on Pro you can register up to 5 endpoints and Kustiq POSTs signed events like churn.score_changed when a sync moves a score. The snippet below is the verification we recommend on your side.
// Express handler. Use express.raw({ type: "application/json" }). const crypto = require("crypto"); const SECRET = process.env.KUSTIQ_WEBHOOK_SECRET; function verify(req) { const sig = req.headers["x-kustiq-signature"] || ""; if (sig.length !== 64) return false; const mac = crypto .createHmac("sha256", SECRET) .update(req.body) .digest("hex"); const ok = crypto.timingSafeEqual( Buffer.from(mac, "hex"), Buffer.from(sig, "hex"), ); if (!ok) return false; // Replay check: body has top-level "timestamp" (unix seconds). const body = JSON.parse(req.body); return Date.now() / 1000 - body.timestamp < 300; }
Each request is signed with HMAC-SHA256 over the raw body; the signature is a bare 64-character hex digest in the X-Kustiq-Signature header, and the body carries a top-level unix timestamp for replay protection. Retry policy: a non-2xx response or no response inside 10s triggers one retry 5 seconds later, then the event is dropped; every attempt is logged with status code and latency.
Sync rules
- Cadence. On demand plus daily. You run the first sync at connect time; after that Kustiq refreshes signals once a day and whenever you press Sync now.
- Direction. One way, Stripe to Kustiq. The integration never writes, updates, refunds, or cancels anything on your account; a code-level guard blocks every non-GET request.
- Mode.The account you pick on Stripe’s consent screen decides live vs test. Reconnect to switch.
- Match key. Saved Stripe customer ID first (set automatically after the first match, or manually per profile), customer email domain second. Unmatched customers never feed a score.
- Coverage. Charges are read all-time so lifetime revenue is right; subscription update events use a 30-day window. Customers are paged 100 at a time.
- Rate limit.Stripe’s read API limits apply during sync; live mode caps at 100 req / sec, test mode at 25.
Trust and data handling
This section is the answer to your IT review. What we store, what we never touch, where it lives.
What Kustiq stores, what Kustiq never touches
Kustiq stores only Stripe customer and subscription IDs and aggregate signals derived from the reads listed above. No card numbers, no charge tokens, no PII beyond what is needed to match a Stripe customer to a Kustiq profile. OAuth tokens are encrypted at rest before they reach the database.
What we store
- +
customer.idandsubscription.idreferences - +Customer email, name (for matching only)
- +Aggregate signals: status, amount band, attempt count
- +Encrypted OAuth refresh token
- +Signal rows with timestamps (score history)
What we never touch
- −Card numbers (PAN), CVC, full BIN
- −Charge tokens, payment-method tokens
- −Beyond-match PII (address, tax IDs, phone)
- −Bank-account numbers, payouts, balance
- −Anything write-side on your account
Data lives where the rest of the platform lives: the primary database is Supabase (US East) and API workers run on Hetzner in the EU. There is no per-workspace region picker. Full DPA at /dpa, security posture at /trust.
Disconnect
Two paths. From Stripe: Stripe → Settings → Connected apps → Kustiq → Revoke access. From Kustiq: Settings → Integrations → Stripe → Disconnect. Disconnecting from Kustiq calls Stripe’s deauthorize endpoint and deletes the stored tokens immediately; all reads stop with the grant.
What disconnect does, and what it does not do
Disconnect stops Kustiq from reading anything new from your Stripe account. Existing churn scores stay on your Kustiq profiles until you delete them or reconnect; synced history is preserved so you can re-enable without losing context.
Troubleshooting
Five known states. Each has a stable anchor so you can link a teammate to the exact row.
OAuth grant revoked by Stripe #
The Stripe-side admin revoked the connected app, or the access token expired without a successful refresh. Reconnect from Settings → Integrations. Past scores stay; no Stripe data is lost.
Stripe rate-limit during sync #
Another integration on the same Stripe account is consuming the read budget. The sync stops and picks up where it left off on the next run. Press Sync now once the limit clears.
Stripe customer not matched to a profile #
The Stripe customer has no saved mapping and no email domain that matches a completed profile. Set the customer’s email in Stripe, or map the profile to the customer ID manually from the dashboard, then run Sync now.
Stripe integration requires Pro #
The Stripe Connect integration is gated to Pro ($119/mo). Upgrade from /pricing#pro; existing OAuth grants resume automatically.
Stripe account in restricted state #
Stripe restricted the account (KYC pending, payouts paused, or under review). Read access on subscriptions can be denied. Resolve the restriction in Stripe, then run the sync again.
FAQ
Is this the same Stripe integration that handles my Kustiq subscription?
Which Stripe data does Kustiq read?
Does Kustiq write anything to Stripe?
Where does the Stripe data live?
Is the Stripe integration available on the free tier?
What happens to the data Kustiq stored if I disconnect?
Does the integration touch any card data?
Changelog
- 2026-05-16 · v1.1 Pair-lock production-ready audit. BreadcrumbList position-1 fixed to “Home”. SoftwareApplication JSON-LD @id-graph linked to root
#organd#site. New per-page OG image at/docs/stripe/opengraph-image. FAQ trust-card reference converted to anchor link. Free-tier copy unified to 3 profiles a week. Eleven → 11 numeric consistency. - 2026-05-08 · v1.0 Initial release. Disambiguation banner against billing-docs collision. Pro-plan link on the lede. Trust section above Disconnect. Footer cross-link row. Last-verified badge.
- 2026-04-17 · v0.9 Stripe Connect integration shipped: OAuth flow, read guard, daily churn-signal sync.
Stripe wired. Engine scoring on the first sync.
4-minute OAuth connect; writes are code-blocked, reads only. The first sync pulls lifetime charges and current subscriptions for every matched customer. Available on the Pro plan ($119/mo).