Stripe Revenue
Connect a Stripe account of your own and ClientCasa books its settled revenue as sales — with the fees, refunds and payouts that go with them.
If you sell somewhere else through Stripe — a course platform, a storefront, a second business entirely — that money is real revenue and belongs in your books. Connect the account and ClientCasa reads it: every settled charge becomes a sale, the processing fee becomes a real expense, refunds and chargebacks come back out, and payouts get matched to the money that earned them.
It reads only. The key you paste can never move your money.
Before You Start
You'll need a restricted API key from the Stripe account you want to import — not your secret key. A restricted key can be scoped to read-only, which is the whole point.
Go to Settings → Integrations → Stripe revenue (/dashboard/settings/integrations/revenue-connections). Owner or admin, and part of the Books plan.
Creating the Key in Stripe
In Stripe: Developers → API keys → Create restricted key. Set Read on each of these and leave everything else — and every write — on None:
| Permission | Why it's needed |
|---|---|
| Charges | the settlement event, and the sale for a charge with no invoice |
| Invoices | line detail, pre-tax totals and service periods |
| Subscriptions | subscription metadata for the sale description |
| Customers | buyer name and email for the sale description (never written to your CRM) |
| Balance transactions | fee and net — the processing-fee cost row |
| Refunds | negative payments, so returned money leaves the books |
| Disputes | negative payments for charged-back money |
| Payouts | the payout reconciliation |
| Products | line naming |
| Prices | line naming |
Also switch on Balance transaction sources. It can't be checked when you connect — it's an expand permission rather than something we can list — so a key without it passes the check and then fails later, the first time a processing fee is read. Set it while you're in there.
The key's value is shown once and can't be edited afterwards, so it's worth getting right in one pass. If something is missing, ClientCasa tells you everything that's missing at once rather than one at a time — but you'll still have to create a fresh key.
A full-access key (sk_…) is refused on purpose. It would work perfectly, and that's exactly the problem — a key that can move your money has no business sitting in a bookkeeping integration. Only rk_ keys are accepted. Test-mode keys are allowed; they book test-mode revenue.
Connecting
- Press Connect a Stripe account.
- Paste the key into Restricted API key.
- Book this revenue to — which of your businesses this account's revenue belongs to. (Only shown if you have more than one; otherwise it lands on your only trade.)
- Import history from — leave it empty for the last 12 months. Months you've already finished up are never touched.
- Name (optional) — something like "Course sales", so you can tell two connections apart.
- Press Check this key.
Nothing has been imported yet. ClientCasa reads your Stripe history and shows you what would happen — how many sales it would create, and every charge it would skip, by reason. Read it, then press Import this revenue if it looks right, or Start over.
The preview is a sample past the first 250 objects, and it says so in amber when it is. The real import walks all of your history; the preview is deliberately capped so checking a key isn't an expensive operation. It's also rate-limited to a handful of checks per five minutes.
Money You Already Collect Through ClientCasa Is Never Imported Twice
This is the part that has to be right, so it's checked several different ways — and the connection tells you exactly how many charges it skipped for each reason, so you can audit the boundary against your own Stripe Dashboard:
- charged by ClientCasa, so it is already in your books — Stripe's own record says the charge was created by ClientCasa.
- tagged as a ClientCasa invoice, so it is already in your books — the charge carries our own metadata.
- already collected through ClientCasa — a payment in your books already carries this exact Stripe charge or payment intent.
Those are three different pieces of evidence, and they're reported as three different sentences on purpose. And you can't connect the Stripe account ClientCasa already collects your client payments through — that's refused outright, at connect time and again on every run.
Other things you'll see skipped, all of them normal:
- not settled yet — we'll look again on the next run.
- no money moved — a zero-amount charge.
- in a currency other than your books' — we don't convert.
- already imported by this connection.
- settled in a month you have already filed.
- billed by an invoice — the invoice books that money, not the charge, so counting both would double it.
What You Get
- Sales, at Sales
(/dashboard/invoices/sales), one per paid Stripe invoice or per standalone charge — never both for the same money. Lines are recorded pre-tax, dated by the day the money settled in your business's timezone. - Payments, already settled, so a connector sale is never sitting in your books looking uncollected.
- Processing fees, as real expenses on Schedule C Line 10 for the business you booked the account to — not netted silently out of revenue.
- Refunds and chargebacks, as negative payments, dated when they happened.
- Payouts, reconciled — deposits matched to the money that earned them.
A refund against a year you've already finished up still lands. Sales won't touch a filed month, but a refund will — as a dated adjustment in your earliest open month. The alternative would be to lose the money entirely, which is worse than reporting it a period late.
Reading a Run
Each connection card shows its last run: what was created, what was skipped and why, and anything that needs attention. Two things are worth knowing how to read:
- A run that stopped before it could read anything from Stripe says exactly that. A zero there means we didn't look, not there was nothing to find — and the card never dresses one up as the other.
- Attention items in amber are things to come back to: objects ClientCasa couldn't book safely (it books nothing rather than guessing), and temporary problems the next run will retry on its own.
Syncing runs hourly. Sync now on the card runs it immediately.
Pausing, Reconnecting, Removing
- Pause stops importing; Resume starts again.
- ClientCasa pauses a connection itself when it can't proceed safely — the trade it books to was archived, the key stopped working, the business was removed. The card shows the reason in plain words.
- Needs reconnecting means the stored key can't be read. Keys are encrypted with a secret that never leaves the environment they were saved in, so a key pasted somewhere else is permanently unreadable here. Nothing is wrong with your Stripe account: press Reconnect, paste a fresh restricted key, and syncing picks up exactly where it stopped. A key for a different Stripe account is refused — reconnect rotates a key, it doesn't re-point the connection.
- Remove stops the import and deletes the stored key. Sales it has already imported stay in your books exactly as they are — removing a connection never rewrites history.
Related
- Record a Sale — the same species of document, rung up by hand.
- Businesses and Trades — which trade a connected account books to.
- Set Up Payments — the other Stripe connection, the one that collects your clients' invoice payments.
- Sales Tax You've Collected.