How the pieces connect
The three parts each own a layer. FlutterFlow generates the Flutter client, which talks to Firebase directly through the FlutterFire SDKs — Firebase Auth for sign-in, Cloud Firestore for data. Stripe is the only part FlutterFlow can't wire visually, so you add a Custom Action that calls Stripe's API. The pattern that holds up: never create charges from the client. The app calls a Cloud Function (onCall or an HTTPS endpoint) that uses the Stripe Node SDK and your secret key to create a PaymentIntent or a Checkout Session. Stripe processes the payment, then fires a webhook back to a second Cloud Function. That function writes the result to a Firestore document — say users/{uid}/subscriptions/{id}. FlutterFlow already has a Firestore listener on that document, so the UI flips to "active" the moment the write lands. No polling, no client-side trust in the payment outcome.