You can. A Stripe Checkout session is genuinely a few lines of code, and Stripe Billing even ships its own hosted Customer Portal — cancel, update card, switch plan, no email required. That part is not the hard part, and we won't pretend it is. The hard part is everything downstream of the first successful charge: what happens on the first failed renewal, what VAT you owe once a German buyer and a UK buyer show up in the same week, and how a subscription actually turns a feature on. Below is what that specifically involves — judge for yourself whether it's a weekend or a quarter.
| What has to work | Stripe alone | Stripe + Onelo Paywall |
|---|---|---|
| Checkout | Built in. | Built in, hosted, your branding. |
| Cancel / update card / switch plan | Stripe's own Customer Portal — genuinely solved already. | Same, via Stripe's portal wired in. |
| Self-serve refunds | Not in the portal — a human or a custom API call. | Self-serve in the portal (Pro+). |
| VAT per buyer, EU+UK | Stripe Tax (a separate paid add-on) can compute the rate, but its threshold monitoring only flags a potential registration obligation after the fact — it doesn't stop a sale or register you. | Computed per sale, included in the fee; the €10,000 threshold is enforced BEFORE the sale completes, not flagged afterward. |
| Failed renewal (dunning) | Stripe retries the card (Smart Retries) — whether you notify the customer, show a grace window, or revoke access is on you to wire. | Wired: one notification per failure streak, grace window, automatic revoke/restore tied to the same subscription state. |
| Webhook idempotency | Stripe retries events on any non-2xx — a handler that isn't provably idempotent double-processes on retry. | Handled once, centrally, for every event type. |
| Gate a feature by plan | Custom code reading subscription status on every request. | A flag scoped to a plan; flips automatically on upgrade/downgrade/cancel. |
| Price shown to the buyer | You decide and implement gross-vs-net display yourself, per country. | Set once — gross or net — and every buyer sees one final price. |
Stripe doesn't deliver a webhook exactly once — it retries on anything but a 2xx response, which means the same invoice.payment_failed or checkout.session.completed event can hit your endpoint more than once. A handler that isn't written to be idempotent will double-send a dunning email, or worse, double-grant access. Getting this right means treating every event as a two-phase operation — claim it, then commit it — so a crash between the two leaves the event safely re-runnable instead of half-applied. It's not exotic, but it's also not the first thing a Stripe quickstart shows you, and it's exactly the kind of bug that only shows up once real money and real retries are involved.
Dunning has its own sharp edge: Stripe's Smart Retries will attempt a failed card several times over about two weeks. Notify the customer on every attempt and you've sent five emails for one problem; notify once and you have to track "have we already told them" per subscription, per failure streak, separate from Stripe's own retry state. Onelo fires exactly one dunning notification per failure streak and clears it on recovery — this is the specific, unglamorous plumbing that eats the time, not the checkout button.
Not "plug in Stripe and charge a card" — the part that only shows up once buyers from more than one country start paying you. This is the actual checklist, not a summary of it:
Reverse charge is only legal once you've checked the number against VIES (Directive 2006/112/EC) — zero-rate an invalid one and the VAT liability is yours, not the buyer's.
The UK left VIES after Brexit — a GB number needs its own check against HMRC's API, or you're guessing.
Cross-border B2C sales to EU consumers, summed for the calendar year — cross it and you must register for OSS and start charging each buyer's country rate.
The EU SME cross-border scheme (Directive 2020/285) lets a small seller stay exempt EU-wide up to €100,000 annual turnover — an alternative path to OSS almost nobody hand-rolling Stripe has heard of, let alone implemented.
An invoice is an accounting document — it should stay in the seller's own language consistently, not switch per buyer, and follow each country's numbering/registration-number rules.
National VAT thresholds move — Portugal and Romania both changed theirs in 2025. Something has to notice before your rate is wrong.
This is what Onelo's Sales Region Wizard walks a seller through when they connect Stripe — not a settings toggle, a decision tree that resolves local-only, OSS or the EX exemption based on where the seller actually sells and how much.
If you sell to one country, don't need to gate features by plan, and can live with Stripe's own Customer Portal and a manual refund click when someone asks — a raw Stripe integration is genuinely fine, and paying a transaction fee on top of it buys you very little. That's a real, common case for a first paid feature and we won't pretend otherwise.
The moment that stops being true is the moment a second country shows up in your Stripe dashboard, or a customer downgrades and still has Pro a week later — which, with Stripe's own subscription Entitlements, is the documented default: entitlements only refresh at subscription creation or the next billing cycle, not the instant you change the price, so a mid-cycle downgrade needs its own workaround to take effect immediately. At that point you're the one writing the idempotent webhook handler and the once-per-failure dunning logic from the section above, plus a running €10,000 tracker that has to block a sale mid-checkout — not flag it after the fact. That's not an afternoon; it's a few focused days to get right, and then something you keep maintaining as EU thresholds and Stripe's own retry behavior change under you. Onelo Paywall runs on your own Stripe account — same seller of record, same money in your account — with that layer already built and already tested against exactly those edge cases, instead of four separate things you're keeping in sync by hand.
Say your product is €19/month. Stripe's own processing fee applies either way and doesn't change based on Onelo — its published UK rate is 1.5% + £0.20 per charge (EU and international cards run higher), so call it roughly €0.50–€1 gone before anyone else is involved. Onelo's fee sits on top of that: 7% on the free plan is about €1.33, 2% on Pro is about €0.38, 1% on Business is about €0.19. On the free plan that's roughly €1.80–€2.30 total in fees on a €19 charge — the number to weigh against the few focused days above, not against zero.
A Stripe-only setup pays none of that Onelo fee, and it already covers checkout and the cancel/update-card/plan-switch portal on its own — but VAT compliance, dunning, idempotent webhook handling and plan-gated flags are then your build-and-maintain cost. For a side project taking its first international payments, that's usually still cheaper to buy than build — but if none of the checklist above applies to you yet, paying 7% for it is a real, legitimate reason to wait.
Onelo Paywall doesn't create a second ledger of your customers or subscriptions — the Stripe subscription objects, customers and payment history live in your own Stripe account the entire time, and stay there if you stop using Onelo. Existing subscriptions keep billing through Stripe on their own either way. What you'd lose access to, and would need to rebuild, is the layer this page is actually about: VAT-per-buyer, threshold blocking, dunning, the portal add-ons and plan-gated flags. That's an honest trade to weigh, not a hidden one.
Branded hosted page + social login, wired for you — not a component you assemble.
You're the seller of record. Onelo Tax computes EU+UK VAT per buyer.
Refunds, cancel, plan change, invoices — self-serve, no support tickets.
Plan-gated entitlements tied to billing, with an upsell prompt on the locked ones.
HTTP monitors + incidents, auto-opened and auto-resolved.
Bug/feature reports from inside the app, with a public voting roadmap.
Pre-launch signups that auto-swap into the store the day you launch.
Versioned legal docs, re-consent, marketing checkbox, audit trail.
Every hosted screen carries your colors and logo, not Onelo's.
The stuff you rebuild on every project, in one place — one SDK per platform (Web/JS, Swift, Kotlin, Flutter, React Native, Electron; Python/Node/PHP on the backend).