Billing with Stripe¶
Connect your Stripe account to Clynto to pull real MRR, ARR, subscriptions, and invoice history into every Clynto account. Once connected, the Revenue pillar of your health score reflects actual paying-customer reality — and failed payments, cancellations, and overdue invoices surface as churn signals in the inbox the moment they happen.
This guide walks you through setup, explains what you'll see afterwards, and covers the most common questions and error states.
What you get¶
Once Stripe is connected, Clynto starts using billing data in five places:
- Revenue pillar of the health score fills in with real MRR and payment-status data instead of sitting at zero.
- Billing tab on every account — MRR, ARR, current subscription status, active plan, renewal date, and the last few invoices. Lives on the account detail page alongside Usage and Support.
- Workspace table — new sortable columns for
MRR,ARR, andPayment Status. You can rank a portfolio by revenue or filter to "only overdue" in two clicks. - Churn signals — four new signal types fire as soon as the underlying Stripe event lands:
payment_failed— an invoice or subscription payment was rejectedpayment_overdue— a subscription is inpast_duestatesubscription_canceled— the customer canceled (with or without grace period)subscription_downgraded— MRR shrank at renewal (seat reduction or plan downgrade)
- Larry — Larry can answer questions like "which accounts are overdue?", "what's Acme's MRR trajectory?", or "how much ARR is at risk from payment failures this month?" — grounded in real Stripe numbers instead of guesses.
Before you start¶
You'll need:
- Admin or Owner role in your Clynto workspace. Members can view the integration once it's set up but can't connect, disconnect, or re-sync it.
- A Stripe restricted API key with read-only access. We strongly recommend a restricted key over your full secret key — Clynto only needs read permissions, and a restricted key limits the blast radius if anything goes wrong. Create one at Stripe Dashboard → Developers → API keys → Create restricted key with Read access to:
- Customers
- Subscriptions
- Invoices
- Products
- Prices
- Whether you're connecting test mode or live mode. Clynto doesn't auto-detect — the key you paste determines which Stripe environment we read from (
sk_live_...orrk_live_...for live,sk_test_.../rk_test_...for test). Most customers connect live. Use test mode only if you're kicking the tires. - Your Stripe webhook signing secret (optional but recommended — see Staying in sync).
Setup walkthrough¶
The setup wizard is a single step. The whole thing takes about 30 seconds.
Step 1 — Connect¶
- Go to Integrations in the left nav.
- Find the Stripe card under the Billing section and click Connect Stripe.
- Paste your restricted API key into the modal and click Connect.
Clynto validates the key instantly against Stripe's /account endpoint. If the key is wrong or missing scopes, you'll see an inline error explaining exactly what failed.
Once the key is accepted, Clynto fires the initial sync in the background. The card flips to a Syncing... state with a step-progress bar that walks through:
- Products — every active product in your Stripe account
- Prices — every active price linked to those products
- Customers — all customers, matched to Clynto accounts by email domain
- Subscriptions — the last 12 months of subscription history
- Invoices — the last 12 months of invoices
- Account billing — MRR, ARR, payment status, and renewal dates computed per account
A typical portfolio finishes in 1–5 minutes. When the bar completes, the card flips to Connected and the Billing tab on every matched account is populated.
Step 2 (optional) — Webhook secret¶
After the card is Connected, click Configure webhooks to open the webhook setup dialog. It gives you:
- A webhook URL to paste into Stripe (Stripe Dashboard → Developers → Webhooks → Add endpoint)
- A signing secret field where you paste the secret Stripe shows you after creating the endpoint
Select these events when creating the endpoint in Stripe:
customer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deletedinvoice.payment_failedinvoice.payment_succeeded
Save the secret back in Clynto. From that point on, any payment event in Stripe shows up in your Clynto inbox within seconds instead of waiting for the next manual re-sync.
Webhooks are optional but strongly recommended. Without them, you'll need to click Re-sync on the Stripe card to pick up new events. With them, Clynto reacts to payment failures in near real-time — which is the whole point of having payment signals in a CSM tool.
What you'll see after setup¶
On the Stripe card (Integrations page)¶
- Records synced — customers, subscriptions, and invoices pulled
- Last sync — when the most recent sync completed
- Configure webhooks button — set up or update the webhook signing secret
- Re-sync button — trigger a fresh pull immediately
- Disconnect button — sever the connection (see Disconnect flow)
On the Accounts page¶
New sortable columns available via the Columns drawer:
- MRR — current monthly recurring revenue for the account, in your default currency
- ARR — current annualized recurring revenue
- Payment Status —
paid,overdue,failed, or—for accounts with no subscription
On every account detail page¶
A Billing tab between Health and Support shows:
- Current MRR and ARR
- Active subscription (plan name, quantity, interval, renewal date)
- Recent invoices (last ~10) with amount, status, and payment date
- Lifetime value across all invoices against the account
If the account has no matching Stripe customer, the tab shows an empty state — either the account doesn't have a paying subscription yet, or the customer-to-account domain match didn't work (see FAQ).
In the inbox¶
Four new signal types show up alongside the rest of your churn signals:
- Payment failed — triggers on the first failed invoice charge
- Payment overdue — triggers when a subscription enters
past_due - Subscription canceled — triggers at cancellation (immediate or scheduled)
- Subscription downgraded — triggers when MRR shrinks at renewal
Each signal includes the exact dollar amount and plan context, and Larry's explanation links back to the specific invoice or subscription.
In the Health tab¶
The Revenue pillar card stops sitting at zero. Its score reflects current payment health:
paid— full creditoverdue— partial credit with a warning indicatorfailed— zero with a red indicator- No subscription — pillar doesn't contribute to the overall score
Staying in sync¶
Unlike Mixpanel and HubSpot, Stripe does not have an automatic daily sync in Clynto. That's intentional — payment events are time-sensitive and polling once a day isn't good enough for failed-charge alerts. Instead, there are two ways to keep Stripe data fresh:
Webhooks (recommended)¶
Once you've configured the webhook secret (Step 2 above), Stripe pushes events to Clynto the instant they happen. A failed charge at 2 AM shows up in your inbox at 2 AM, not at 5 AM the next morning. Webhook handling is idempotent — Stripe can redeliver the same event ten times and Clynto only processes it once.
Manual re-sync¶
If you haven't configured webhooks, or you want to force a full refresh (for example, after reconciling a dispute in Stripe), click Re-sync on the Stripe card. This re-pulls the last 12 months of subscriptions and invoices and recomputes every account's billing state.
Only one sync runs at a time per workspace. If you click Re-sync while a sync is in progress, you'll see a short "sync already running" notice — wait for the progress bar to finish and try again.
Troubleshooting¶
The Stripe card surfaces a few distinct states. Each one tells you something specific.
"Syncing..." (blue, step progress bar)¶
What it means: A sync is in progress, walking through Products → Prices → Customers → Subscriptions → Invoices → Account billing.
What to do: Nothing — wait for it to finish. A typical portfolio finishes in 1–5 minutes. If the bar appears stuck for over 15 minutes, contact support.
"Error — Invalid Stripe API key" (red)¶
What it means: The key you pasted was rejected by Stripe's /account endpoint.
What to do:
1. Double-check you pasted the full key (it should start with sk_ or rk_ and be quite long).
2. Confirm you haven't revoked the key in your Stripe dashboard.
3. If you're using a restricted key, confirm it has Read access to Customers, Subscriptions, Invoices, Products, and Prices.
4. Click Reconnect and paste the correct key.
"Error — Webhook signature invalid" (red, on the webhook config panel)¶
What it means: The signing secret you entered doesn't match the one Stripe is using to sign requests.
What to do: Open the webhook endpoint in your Stripe dashboard, copy the signing secret again (it starts with whsec_), paste it into Clynto's webhook config, and save. Stripe only shows the full secret once when you create the endpoint — if you've lost it, roll the secret and re-paste.
Hard error banner (red)¶
What it means: Something else failed — a Stripe API error, network timeout, or unexpected exception.
What to do: - Click Re-sync to retry. Transient issues resolve on their own. - If the error repeats, contact support with the exact error text.
"Records synced: 0 customers matched"¶
What it means: The sync completed and pulled Stripe customers, but none of them matched your Clynto accounts — so Billing tabs stay empty.
What to do: Account matching is primarily by email domain. If your Stripe customers have personal emails (john@gmail.com) instead of company emails (john@acme.com), there's nothing to match against. Fixes:
- Make sure your HubSpot integration is connected — that populates account domains from your CRM, which gives Stripe something to match on.
- For accounts imported via CSV, confirm the
domainfield is populated. - If a specific customer still isn't matching, ask support — we can force a manual match by customer ID.
Frequently asked questions¶
Does Clynto write anything back to Stripe? No. Every call is read-only. Clynto never issues refunds, cancels subscriptions, changes prices, or modifies customers. The integration uses a restricted key for exactly this reason — even if something in Clynto went wrong, it couldn't move money.
Which Stripe modes are supported — test or live? Both, but not at the same time. You connect one key per workspace, and that key determines the mode. Most customers connect live. If you want to play with the integration before wiring it up to production, connect a separate sandbox workspace to your test mode key.
How does MRR get calculated?
For each active subscription: price × quantity, normalized to a monthly interval. ARR is MRR × 12.
My accounts are multi-currency — how is MRR displayed? Clynto currently sums MRR across every currency a customer transacts in without conversion. If you have customers paying in both USD and EUR, the MRR column will mix them without a unit, which can inflate totals visually. Multi-currency normalization (to a workspace default currency) is on the roadmap — contact support if you need it now and we can configure a workspace-level currency override.
What about partial refunds and credit notes?
Clynto stores invoice amount_paid, amount_due, and amount_remaining, so the invoice row in the Billing tab reflects the net. There is no separate "refunds" list in the UI yet.
How far back does the sync go? 12 months for subscriptions and invoices. Products and prices are pulled in full (active only). Contact support if you need a longer backfill window for historical analysis.
How quickly do payment failures show up in the inbox? - With webhooks: seconds after the failure - Without webhooks: whenever you next click Re-sync
If you care about payment signals at all, configure webhooks. That's what they're for.
Does this work with Stripe Billing, Stripe Invoicing, or both? Both. Any invoice or subscription that exists in your Stripe account is visible to the read scopes Clynto uses, regardless of whether it came from Stripe Billing, Invoicing, Checkout, or the API directly.
Is my Stripe API key encrypted? Yes. Stored encrypted at rest, the same as every other integration credential. Decrypted only inside the sync workers at the moment of the API call.
I rotated my Stripe key — what do I do? Click Reconnect Stripe on the card, paste the new key, and confirm. Previous sync data is preserved.
Disconnect¶
To disconnect Stripe from Clynto:
- Click Disconnect on the Stripe card. A confirmation modal opens — confirm.
- Clynto clears the stored API key and marks the integration as disconnected. No further syncs run.
- To fully sever, also revoke the API key in your Stripe dashboard (Developers → API keys → Revoke).
Your previously synced data stays in Clynto — MRR, ARR, past invoices, and the Billing tab all remain visible but frozen at the last sync. If you want the data removed entirely, contact support.
Need help?¶
If something's not working and the troubleshooting above doesn't cover it, contact support and include:
- Your workspace name
- The exact text of any error shown on the Stripe card
- Roughly when you last had a successful sync (the "Last sync" timestamp)
- Whether you're on test mode or live mode
We can pull the integration's recent sync history from our side and tell you what happened.