Stripe Integration
Connect your Stripe account to feed the churn engine's billing signal family. Kustiq only reads — never writes to your Stripe data. Available on the Pro plan.
Last updated:
Overview
Kustiq's churn engine blends seven signal families. The billing family is the strongest single family (max_abs_impact=30) because payment failures, dunning, and cancellation are near-ground-truth churn indicators. Without Stripe, churn scores lean on the classifier and whatever CRM signals you've supplied; connecting Stripe lets Kustiq replace classifier guesses with observed financial behaviour.
Signal types
For each matched customer, the nightly sync emits up to five usage_signals rows that the StripeProvider turns into churn factors.
| Signal | Fires a factor when | Impact |
|---|---|---|
| stripe_subscription_status | Status is canceled | +15 |
| stripe_subscription_status | Any subscription is past_due (dunning) | +10 |
| stripe_payment_failure | ≥ 3 failed charges in 30 days | +12 |
| stripe_payment_failure | 1-2 failed charges in 30 days | +6 |
| stripe_downgrade | Plan amount dropped within 30 days | +10 |
| stripe_days_since_charge | ≥ 45 days without a successful charge | +8 |
| stripe_mrr_delta | MRR declining > 10% over 90 days | +10 |
| stripe_mrr_delta | MRR growing > 10% over 90 days | −8 |
The summed factor impact is clamped to [-30, +30] per customer so a single mis-classified event can't dominate the score.
How customer matching works
Kustiq pairs each Stripe customer with a Kustiq profile in the following order:
- Manual override. If the profile already has a
stripe_customer_idthat matches the incoming Stripe customer ID, it wins. Set this viaPATCH /api/v1/integrations/stripe/customer-mapping/{profile_id}for bulk cases or unusual matches. - Email domain. Kustiq extracts the business domain from the Stripe customer's email (or
metadata.domain), skips personal providers (Gmail, Yahoo, etc.), and matches the remaining domain to a profile with the same domain. - Persist auto-match. On first auto-match, Kustiq writes the Stripe customer ID back to the profile so the next sync is O(1). Subsequent syncs hit the manual-override path at (1).
Expect visible score shifts on day one
Connecting Stripe typically lifts a profile from one behavioural family (CRM only) to two (CRM + billing). The churn engine's classifier-weight redistribution rule then multiplies the classifier's churn_risk factor by 0.4 (down from 0.7 with one family). Scores skew more toward observed billing behaviour and away from LLM guesses — exactly the intended effect, but a visible shift on day one.
Sync schedule
The Stripe sync cron runs at 5:45 UTC daily (15 minutes after the HubSpot cron at 5:30). Pro-plan admins can also kick an ad-hoc sync from the Integrations page via the Sync now button. Rate limits stay well under Stripe's 100 req/sec ceiling.
Disconnecting
Click Disconnect on the Stripe card. Kustiq runs Stripe's OAuth deauthorize endpoint to revoke access server-side and nulls the local credentials. Previously-emitted usage_signals stay so past churn scores remain explainable. Future scoring no longer includes the billing family until you reconnect.