Onekode
Start free
Ways to start
Work
Founders Hub
AboutContact
← All guides
Guide·Payments

Take real payments in your app

Test first, unlock only on Stripe's own confirmation, and check store rules if it's a phone app.

Test every payment in test mode first. Then make sure your app unlocks something only when Stripe confirms the payment, not when a page loads. If it is a phone app that sells digital content, check the store rules too. Vendor pages read 23 October 2026.

FlutterFlow

How do I add Stripe to a FlutterFlow app?

FlutterFlow's own Stripe route handles one-off payments.

For subscriptions, and for knowing that someone really paid, there is more to do than its doc says. We link the doc for where to click and cover the gaps here. Labels below are the doc's own words ("its docs call it"), and we haven't seen them in the product, so check them in FlutterFlow before you go live. Paying other sellers is a different job: see Stripe Connect in the questions below.

  1. The doc's route, for one-off payments. Its docs call the place Settings and Integrations, then In App Purchases & Subscriptions, then Stripe. Turn on "Enable Stripe Payments". Put your test keys under Test Credentials with "Is Production" off, and your live keys under Production Credentials. Then Deploy. The route needs Firebase, Firebase Authentication and the Blaze plan, and a Firebase Cloud Function processes the transaction. The amount goes in the smallest currency unit, which means cents. The payment needs a signed-in user. If you see a CORS error, the troubleshooting page points to the function's allUsers permission. We give no Merchant Country Code format, because the doc gives two different ones. Read the doc itself: FlutterFlow, Stripe and Fixing Stripe deployment & payment errors.

  2. The gap page one asks about. The doc has no subscriptions and no webhooks. For web subscriptions, Stripe says a webhook is required, and FlutterFlow's troubleshooting page points web to direct API calls. We explain both in Why did they pay but nothing unlocked? and in what happens when a subscription renews.

  3. The doc doesn't say what writes "paid". Here is the check. The doc sets the amount in the app's action and stores the payment ID in an app variable you name. It doesn't say what records "paid" in your database, or whether the price is checked on the server. That is a gap in the doc, not a verdict on any app. Ask three questions:

    1. 1.Where does the price come from? The app screen, or a lookup on the server from a fixed price?
    2. 2.What writes "paid"? The Cloud Function after Stripe confirms, or an app action after the payment ID comes back?
    3. 3.Who can change it? Can a signed-in user edit their own "paid" or plan field in Firestore?

    If you can't answer them, run the hand test below, then ask for the Free Build Audit.

  4. A phone app. Subscriptions in a phone app go through RevenueCat, which is FlutterFlow's own advice, and RevenueCat has no web support. The detail is in Can I use Stripe in my iPhone or Android app?

Lovable

How do I add payments to a Lovable app?

Lovable has two routes, and you use one, not both.

Read Add payments to your app and Connect your own Stripe account first. Facts read 23 October 2026.

Lovable's built-in payments. Lovable recommends these first. They run on Paddle or Stripe, and Lovable creates and manages the provider account. You need a Pro plan or higher, and only admins and owners can set it up. A database is needed only if the app stores payment data such as subscriptions or orders, but older React + Vite apps always need Lovable's built-in backend. Sign-in is recommended, so each purchase links to a user. Test mode runs in the preview with test cards. Live runs on the published app. Products and prices sync from test to live when you publish, and discounts don't. Going live needs a readiness check (privacy policy, terms, refund policy, genuine content) and provider verification. Lovable registers two webhook endpoints per environment, and its doc says: "Do not delete or disable either Lovable-registered endpoint." If the app's endpoint is deleted, purchases succeed but subscriptions never activate. So leave them in place, and do hand test step 8 on the published app.

Your own Stripe account. Paste a restricted (rk_) or secret (sk_) key into the Connect Stripe form, never into the chat, as Lovable says. Publishable keys don't work. Webhooks are off by default. A test key means test mode. To go live, submit a live key and have Lovable switch to the live price IDs, because they differ. There is no separate test environment: with a live key, payments in the preview are real. Subscriptions are checked with Stripe directly.

Lovable's doc says the app checks payment status with Stripe directly by default, and suggests webhooks for fulfilment. Its one-time section doesn't say the unlock waits for that check. The check: hand test steps 4 and 5.

Gotchas. Disconnecting doesn't cancel subscriptions or refund anyone. On your own Supabase, the secret key stays there, so payment functions keep charging until you delete it there. The customer portal doesn't work in the preview panel.

Replit

How do I add Stripe to an app built with Replit?

Replit has two routes, one per environment, and you don't mix them in one environment: the doc says mixing causes "connection conflicts".

Read Accept payments with Stripe and Stripe payments.

The Stripe connector. It sits under Integrations, then Stripe, on paid plans (Core or Pro). Agent sets up a Stripe sandbox, so you don't copy keys. The connector pages don't say how webhooks are handled. The check is hand test steps 4 and 5.

Your own keys. Put them in Secrets: STRIPE_SECRET_KEY (the exact name), STRIPE_PUBLISHABLE_KEY and STRIPE_WEBHOOK_SECRET. Replit doesn't manage this route. The endpoint Agent writes verifies Stripe's signature with the webhook secret and marks orders paid on checkout.session.completed. In the test environment, the Stripe CLI gives its own signing secret. Production needs a separate live-mode endpoint at the published address, with its own signing secret.

Going live with the connector. In the Publish pane, install the Stripe app (the "Replit Integrated Payments" app), pick the live account and not a sandbox, finish Stripe's business verification if asked, confirm it shows "connected", then publish. Replit's doc says your sandbox integration is not production-ready.

The publish blockers founders hit (our summary of forum reports):

  • If production uses your own keys, the key must be a live key.
  • Products and prices don't sync from sandbox to live, so create them in live Stripe.
  • On a first publish, get the published address, finish the webhook and secrets setup, then republish.
  • A sandbox claim that expires can block Publish.

Subscriptions. Replit mentions Stripe Billing with the same keys and webhook. For phone-app subscriptions it points to RevenueCat.

Want a phone app? Start with Can I publish an app I built with Lovable, Replit or another AI builder?

Store billing

Can I use Stripe in my iPhone or Android app?

It depends on what you sell.

Digital content and features unlocked inside the app go through the store's own billing. Physical goods and services use Stripe in the phone app too. Each rule below carries its date and link, and none of it promises that any route will pass review. Check the current guideline before you build.

Apple (App Review Guidelines, Last Updated: October 16, 2026, read 23 October 2026).

  • 3.1.1: unlocking features or content in the app, such as subscriptions, premium content or a full version, "must use in-app purchase." How much the stores take is in What it costs to publish an app.
  • 3.1.3(e): physical goods or services consumed outside the app must use purchase methods other than in-app purchase. So a booking, delivery or physical-product app uses Stripe in its iPhone app.
  • The US storefront exception (3.1.1(a) and the 3.1.3 intro): apps on the United States storefront can include buttons, links or calls to action to other purchase methods without an entitlement. All other storefronts may not. This US rule follows a court case, Epic v. Apple, that is still going, so check the current guideline.
  • 3.1.3(b): an app may let users access content or subscriptions bought elsewhere "provided those items are also available as in-app purchases within the app". One founder reported that Apple classed a Lovable-built coaching app as multiplatform, so its content also had to be sold by in-app purchase. That is one founder's report of one review, not a rule for every coaching app.
  • 3.1.3(d): real-time person-to-person services (Apple's examples: tutoring, medical consultations, real estate tours, fitness training) may use other purchase methods. One-to-few and one-to-many real-time services must use in-app purchase.
  • Other 3.1.3 exceptions exist for reader apps, company-internal apps, free stand-alone apps and advertising management. Read them in the guideline.

An app that sells digital content outside in-app purchase can be rejected under 3.1.1: see Why apps get rejected.

Google Play (Payments policy, read 23 October 2026; the page carries no policy date). Paid downloads and in-app purchases of digital items must use Google Play's billing system unless an exception applies. Physical goods, physical services and bill payments must not use Play billing.

Google's US page (read 23 October 2026) adds this. From 29 October 2025, for mobile and tablet apps serving US users, Google will not require Play Billing and won't block links to outside purchases. Developers who offer external links or alternative billing enrol in Google's programs, which launched on 9 December 2025. On 17 September 2026, Google told developers enrolled in external content links they have until 1 December 2026 to report successful downloads and pay the relevant service fees. That is the external-links reporting date, not an end date for the US changes, and the page gives no end date.

RevenueCat, the route Replit and FlutterFlow name for phone-app subscriptions. In Replit, Agent creates the RevenueCat project, product and entitlement. FlutterFlow has Paywall, Purchase and Restore Purchases actions, and no web support. Setup needs the store accounts and agreements: for Apple, the Apple Developer Program, a TestFlight build and the Paid Apps Agreement; for Google, an active subscription and a closed testing track. In previews and Expo Go, purchases are simulated. We can't say that RevenueCat, an external link or alternative billing will pass review. Read Replit, Add payments with RevenueCat and FlutterFlow, RevenueCat.

Two builders' own lines, set beside Apple's, not merged. Replit's docs (read 23 October 2026) say: "You can't route around it with an external payment link." That is simpler than Apple's current US storefront rule above. Base44's docs (read 23 October 2026) say: "If you plan to publish your app to the App Store or Google Play, don't sell digital content in the mobile app." Base44 apps don't support store in-app purchases yet.

If you wrap a web app. If you wrap a web app from Lovable or Base44 for the stores, you still need the store's own billing for digital content outside the US storefront. On the US storefront, Apple's 3.1.1(a) and the 3.1.3 intro allow links. For Google, US users don't need Play Billing from 29 October 2025, with enrolment. Check the current guidelines before you build. The whole route to the stores is in Publish your app to the app stores.

Test and live

Test mode vs live: why do payments break when the app goes live?

Test and live are two separate worlds in Stripe.

Each has its own keys, products, prices and webhook secrets, and the preview is not live. The common failures:

  • Keys in the wrong place. A webhook secret gets rejected, or test keys sit where live ones belong. In Replit, test-environment secrets and deployment secrets are separate.
  • Products and prices don't carry over everywhere. Replit doesn't sync them. Lovable's built-in payments sync on publish, but not discounts. Bubble's plan IDs must match across test and live. Lovable's own-Stripe route switches price IDs with the live key.
  • A live endpoint needs a new signing secret. When you switch to live, Stripe gives the webhook endpoint a new one.
  • The preview isn't live. Lovable (the customer portal), Base44 (checkout), FlutterFlow (web versus mobile) and Replit (the live webhook at the published address) all say part of payments works only once published. Redirects can send people to the wrong page when the preview and live addresses differ.
  • Going live is more admin than expected. One founder reported that business verification and more steps came after a quick test.

Do all your testing in test mode. Hand test step 8 is the first live check.

Next: Stripe's go-live checklist and API keys. If it works in the preview but not live, read the section "Why does it work in the preview but not when it's live?" in When your AI builder keeps breaking. For hosting and publishing, "How do I host my app?" is a planned guide. The wider launch list is Launch List.

Subscriptions

What happens when a subscription renews, a card fails or someone cancels?

A subscription is a promise that keeps paying, so your app has to hear about every renewal, cancellation and failed card, not only the first payment.

  • Two Checkout modes. One-time purchases and recurring ones are different Stripe Checkout modes (payment and subscription). Subscription mode saves the payment method by default (How Checkout works).
  • Webhooks are required for subscriptions, says Stripe. Events can arrive more than once and out of order, so the unlock must still work correctly if it runs twice. Renewals, cancellations and failed renewals reach your app the same way. If the endpoint is missing or deleted, the first payment can succeed while the subscription never activates, as Lovable's doc says.
  • Bubble. With "End of billing period" cancellation, Bubble's manual says the web app doesn't update unless you process the webhook event.
  • FlutterFlow. The doc has no subscriptions. Web subscriptions need the server-side confirmation, and phone apps go through RevenueCat (see the FlutterFlow and store sections above).
  • Subscriptions need sign-in. Lovable, Bolt and FlutterFlow say so in their docs. How to set that up: "How do I set up login and user roles?" is a planned guide.

Hand test step 7 is the check. We don't describe Stripe's retry behaviour or the customer portal beyond what the vendors' pages say.

Other builders

How do Bolt, Base44, Bubble, Cursor and Claude Code handle payments?

Each has a route and a test mode.

The part the docs say least about is who checks that a payment really happened. Labels are the vendors' own words in their docs ("its docs call it"), and we haven't seen them in the product.

How other builders handle payments
BuilderRouteTest modeWho handles the confirmationWhat the doc doesn't say
BoltIts docs call it the gear icon, then Stripe, then add a test key (sk_test_), retrieve products and apply. Needs a Bolt database or Supabase (edge functions; not Firebase), sign-in set up and a Stripe accountIts doc says to always use Stripe's test environmentBolt's doc says it registers webhook endpoints and verifies signaturesA live switch or go-live steps
Base44Builder plan and above. Dashboard, then Integrations, then Stripe. Claim the sandbox within 60 days. Checkout runs only on the published app. Base44 apps don't sell digital content through the storesBase44 sets up a Stripe test environmentIts doc advises the success page to confirm the payment "instead of relying on webhooks alone". Stripe says fulfilment can't rely on the landing page alone, so use bothSignature checks
BubbleThe Bubble-made Stripe plugin, with live and test key sets. "Checkout v3" is recommended. One-off: "Charge the current user". Subscriptions: "Subscribe the user to a plan". Plan IDs must match across test and live. Connect: Standard onboarding onlyTest mode uses the test keysThe plugin doesn't describe webhook handlingSignature checks. Build Check can't read Bubble apps, so use the hand test above, or the Free Build Audit
Cursor and Claude CodeNo connector. You or the agent follow Stripe's own docs (our reading, no vendor page)Test keys, per StripeYouEvery check in this guide is yours. If the code is JavaScript or TypeScript, Build Check can read it
A second pair of eyes

When should someone check your payments before launch?

When real money is about to move and you can't say how your app confirms a payment.

The signs:

  • Subscriptions unlock access.
  • A phone app sells anything.
  • Credits are going on one payment bug that keeps coming back. See AI builder credits.

Either of those, or any one of these, is a reason to ask for the Free Build Audit first.

The free next step

What should I do next?

A person checks how your app confirms a payment before real money moves.

With the Free Build Audit, you send a link to your running app. Code access and a test login are optional. A person on our team records a 10 to 15 minute walkthrough and sends a one-page note on what stays, what needs fixing and what blocks launch, with a first fix for each.

It is free. It isn't a security audit or a certificate, and it doesn't say your payments are ready.

Get the Free Build Audit

If you want it done for you, Finish and Launch is our service for that.

Questions

Questions.

Should I use Lovable's built-in payments or my own Stripe account?

Lovable recommends its built-in payments first. They run on Paddle or Stripe, and Lovable creates the provider account for you. Or you can connect your own Stripe account with a restricted or secret key, never pasted into the chat. You use one route, not both at once. Read 23 October 2026.

Does Bubble have a Stripe plugin?

Yes. Bubble makes its own Stripe plugin, with separate test and live keys in the Plugins tab, and its manual recommends Checkout v3. The manual does not describe how the plugin checks webhook signatures, so run the hand test in this guide and ask a person to check the rest. Read 23 October 2026.

Does Base44 support Stripe?

Yes, on the Builder plan and above. Base44 sets up a Stripe test environment that you claim from Dashboard, Integrations, Stripe, within 60 days. Checkout runs only on the published app. Base44 also says not to sell digital content in an app you publish to the App Store or Google Play. Read 23 October 2026.

Can I use Stripe with Cursor or Claude Code?

Yes. In our reading neither comes with a Stripe connector, so you or the agent follow Stripe's own documentation, and every check in this guide is yours to make: the confirmation, the price set on the server and the hand test. Build Check can read JavaScript and TypeScript code. Read 23 October 2026.

Can my app pay other sellers? (Stripe Connect)

Paying other sellers, as a marketplace does, is Stripe Connect. FlutterFlow's Stripe documentation does not cover it. Bubble's plugin supports only Standard account onboarding, and its app fees are a fixed amount, not a percentage. Start with Stripe's Connect documentation, and ask a person to look before real money moves. Read 23 October 2026.

What if Stripe isn't available in my country?

Stripe lists the countries and regions it supports on its global page, so check that first. Lovable's built-in payments can run on Paddle instead of Stripe. If neither is open to you, a person can help you choose a route that fits where you sell. Read 23 October 2026.

Do I have to handle sales tax or VAT?

That depends on where you sell, so ask a tax adviser. Stripe lists four steps: know where you must collect tax, register there, calculate and collect it, then file and remit. Stripe Tax can calculate and collect, and has its own fees. Paddle, an option in Lovable, handles tax as merchant of record. Read 23 October 2026.