Why Stripe Integration Is Hard in FlutterFlow
FlutterFlow supports Stripe payments through its built-in integration, but the "one-click setup" masks significant complexity. Production payment flows require proper webhook handling, subscription lifecycle management, and Apple/Google Pay configuration that goes far beyond the visual builder.
As certified FlutterFlow Experts, we've implemented payment systems for marketplace apps, SaaS products, and e-commerce platforms. This guide covers the full production setup.
Complete Stripe Setup
Step 1: Connect Stripe to FlutterFlow
FlutterFlow → Settings → Integrations → Stripe → Enter your publishable key and secret key. Critical: Use TEST keys during development. Switch to LIVE keys only when going to production. Never expose your secret key in client-side code.
Step 2: Set Up Cloud Functions
Stripe payments MUST go through server-side code. The flow:
- Client (FlutterFlow) creates a PaymentIntent via Cloud Function
- Cloud Function calls Stripe API with your secret key
- Cloud Function returns the client_secret to FlutterFlow
- FlutterFlow presents the payment sheet using the client_secret
- Stripe processes the payment and sends a webhook to your Cloud Function
- Cloud Function updates your Firestore with the payment status
The 6 Most Common Payment Failures
1. Payment Sheet Shows Blank or Crashes
Cause: Invalid or expired client_secret from the PaymentIntent. This happens when the Cloud Function returns an error but FlutterFlow doesn't handle it - the payment sheet tries to initialize with a null secret.
Fix: Add error handling to your Cloud Function. Check for client_secret in the response before showing the payment sheet. A Custom Function can validate the response format.
2. Apple Pay Not Appearing
Cause: Apple Pay requires: (1) a Stripe account with Apple Pay enabled, (2) a registered Merchant ID in Apple Developer Portal, (3) domain verification in Stripe Dashboard, and (4) the correct Country Code and Merchant Display Name in FlutterFlow.
Fix: Follow this exact sequence: Stripe Dashboard → Settings → Apple Pay → Add Domain. Apple Developer → Identifiers → Merchant IDs → Create. Download the payment processing certificate from Stripe and upload to Apple. In FlutterFlow → Stripe settings → enable Apple Pay with your Merchant ID.
3. Webhooks Not Firing
Cause: Stripe webhooks need a publicly accessible HTTPS endpoint. During development, your Cloud Function URL may not be deployed, or the webhook signing secret doesn't match.
Fix: Deploy your Cloud Functions first, then add the function URL as a webhook endpoint in Stripe Dashboard → Developers → Webhooks. Copy the webhook signing secret and use it in your Cloud Function to verify webhook authenticity. Listen for events: payment_intent.succeeded, payment_intent.payment_failed, and customer.subscription.updated.
4. Subscription Status Not Syncing
Cause: After a successful payment, the subscription status in Firestore doesn't update because the webhook didn't fire or wasn't processed correctly.
Fix: Implement a full webhook handler that processes customer.subscription.created, customer.subscription.updated, customer.subscription.deleted, and invoice.payment_failed. Update the user's Firestore document with the current subscription status, plan type, and expiration date.
5. Test Payments Work But Live Payments Fail
Cause: You switched from Stripe test keys to live keys but forgot to update: (1) the Cloud Function environment variables, (2) the webhook endpoint (test and live have separate endpoints), or (3) the webhook signing secret.
Fix: Stripe test and live modes are completely separate environments. When going live, update ALL three: publishable key in FlutterFlow, secret key in Cloud Functions, and webhook signing secret. Create a new webhook endpoint for live mode.
6. App Store Rejection Due to Stripe
Cause: Apple requires that digital goods and services purchased within the app use Apple's In-App Purchase system - NOT Stripe. Physical goods, services, and person-to-person transactions can use Stripe. For additional context, see our guide on App Store rejections.
Fix: For digital content (premium features, subscriptions to in-app content), use RevenueCat or FlutterFlow's IAP integration. Stripe is allowed for: physical goods, real-world services, person-to-person payments, and business software (B2B SaaS).
Payment Architecture
| Payment Type | Technology | Apple Compliant? |
|---|---|---|
| Physical goods | Stripe | Yes |
| Real-world services | Stripe / Stripe Connect | Yes |
| Digital subscriptions | RevenueCat / IAP | Yes (required) |
| Marketplace transactions | Stripe Connect | Yes |
| In-app premium features | IAP only | Yes (required) |
Need Expert Help?
Payment integration can't afford bugs. A broken payment flow means lost revenue and lost trust. Rehost implements production-grade payment systems in FlutterFlow - Stripe, Apple Pay, Google Pay, and subscription management. Get Expert Rescue →
FAQ
Can I use Stripe for in-app purchases in FlutterFlow?
Only for physical goods, real-world services, and person-to-person payments. Digital goods and subscriptions to in-app content must use Apple's In-App Purchase (for iOS) and Google Play Billing (for Android). Use RevenueCat for a unified cross-platform solution.
How do I handle failed payments in FlutterFlow?
Add error handling after the payment sheet action in FlutterFlow. Check the payment status - if failed, show a user-friendly error message with a retry option. On the server side, handle the payment_intent.payment_failed webhook to update the order status in Firestore.
Can I implement Stripe Connect for marketplace payments in FlutterFlow?
Yes, but it requires custom Cloud Functions. Stripe Connect handles split payments between your platform and sellers. You'll need Cloud Functions for: creating connected accounts, generating account links for onboarding, creating PaymentIntents with transfer data, and handling payouts.