I set up a full subscription business without opening the Stripe dashboard
Products, prices, webhooks, portal and a Swiss VAT registration — all over the Stripe API after the dashboard and connector both failed. And why billing is rented, never built.
This week I set up the entire billing layer for a Swiss directory business I'm building — product, monthly and annual subscription prices, webhooks, customer portal, even the Swiss VAT registration — without opening the Stripe dashboard once.
Not as a stunt. The dashboard was simply unavailable to my workflow: the browser automation I work with blocks financial dashboards outright, and the official connector's authentication flow was broken that day. The old reflex would be to stop, file it under "blocked," and come back later to click through forty screens by hand.
The newer reflex: the UI is just one client of the API. So I went underneath it.
Everything was a curl call
The whole setup turned out to be a short sequence of API calls. Create the product. Create two prices, tax-exclusive, monthly and annual. Create the webhook endpoint — and here's a detail the dashboard actively hides from you: the signing secret comes right back in the create response, no second trip to copy it from a settings page. Configure the customer portal: cancellation at period end, payment-method updates, invoice history.
The one I expected to fail was tax. Stripe Tax feels like a dashboard-only product. It isn't: the Registrations API takes a head-office address and a country registration, and the Swiss registration flipped from pending to active entirely over the API. The official docs even walk through the exact gotcha I hit — you must set the head office address first or the registration call errors out.
Honesty requires the footnote: two things still genuinely need the dashboard — brand assets and the terms-of-service URL for checkout. Ninety-five percent API, five percent clicking. I'll take it.
The decision that mattered more than the workaround
The API trick is the fun part, but the consequential decision came earlier. The directory runs on a plugin ecosystem that offers its own payments and invoicing stack, and the temptation to keep everything "in one system" is real. I rejected it and made Stripe the only billing brain: Checkout for purchase, the portal for self-service, webhooks the single source of truth for who's premium.
The reasoning is best summarized by Arnon Shimoni's fourteen pains of building your own billing system: idempotency, proration, refunds, invoice formatting, and the tax rules that change under your feet in every market. Every one of those pains is now Stripe's problem instead of mine. For a one-operator business, that's not a convenience — it's the difference between a side project that compounds and one that becomes a part-time accounting job.
The UI is a convenience layer. The API is the product.
Why this is an operator skill now
Five years ago "the dashboard is blocked" meant the work didn't happen that day. Now an AI assistant writes the calls, reads the responses, and verifies the result faster than I could navigate the settings menu — the same pattern as clearing two years of receipts, where the leverage wasn't speed but the ability to act directly on the system of record.
But the judgement layer doesn't go away. Knowing that prices should be tax-exclusive for a B2B product in Switzerland, that the webhook needs exactly four events and no more, that cancellation should run to period end — none of that is in the API reference. Tools fail constantly; I've written about working around them before. The operators who keep moving are the ones who understand the system one layer below the interface that just broke. That, again, is the only leverage that's left.
First test purchase ran end to end the same day: checkout, correct VAT line, invoice paid, welcome email out. The dashboard never saw me coming.
Sources & further reading
External
Stripe Docs — Manage tax registrations with the Registrations API · Arnon Shimoni — The 14 pains of building your own billing system
Related posts
I let AI clear two years of receipts · Claude Cowork keeps hanging? Here's the fix · The death of generic AI