Appearance
Stripe node
The Stripe node creates a Stripe Checkout Session and hands back its URL — so a flow can take a payment. The visitor pays on Stripe's own hosted page; no card data ever passes through your flow.
Component id: flowrunner/stripe.
IMPORTANT
This node is an installable component, not part of the engine. Every workspace gets it installed automatically; if it has been removed, the node passes straight through at run time and the editor marks it Not installed in the Add panel. Open Components in the project header to reinstall it.
How it works
The node calls the Stripe API with your secret key (a secret reference) and creates a checkout session for a single line item you describe inline — no need to pre-create a product in Stripe. It returns:
text
refs.<resultVar> = { id: "cs_test_...", url: "https://checkout.stripe.com/c/pay/cs_..." }The typical flow: a form submits → the Stripe node creates the session → you redirect the visitor to ${checkout.url}. When they finish (or cancel), Stripe returns them to your success / cancel URL.
Redirecting to checkout
Wire this node into a form's onSubmit flow, then give the End node a redirect field bound to ${checkout.url}:
text
Stripe → End responseBody: { redirect: "${checkout.url}" }On submit, the form sends the visitor straight to Stripe's payment page — see Redirecting after submit. Because the amount and product are flow references, the same flow charges a different amount per submission (e.g. ${start.total}).
Amounts
amount is in the smallest unit of the currency — cents for USD/EUR/GBP. 2000 means $20.00. A fractional value (19.99) is rejected before the request, so a typo can't silently drop the pennies. Zero-decimal currencies (JPY) use the whole number.
Safety
- The secret key resolves from
${secrets.*}/${env.*}only — never flow input. - All requests go to the fixed host
api.stripe.com— no SSRF surface. - Because creating a session never charges (the charge happens later on Stripe's page), a network error or a transient
429/5xxis safely retried when you setretries. A client rejection (400bad amount,401bad key) is not retried; wire the error port to handle it.
Config
| Field | Required | Description |
|---|---|---|
secretKey | Yes | Stripe secret key, as a secret reference (${secrets.STRIPE_SECRET_KEY}). |
mode | No (default payment) | payment for a one-time charge, subscription for a monthly recurring charge. |
productName | Yes | What the customer is buying (shown on the Stripe page). May be a flow reference. |
amount | Yes | Price in the smallest currency unit (2000 = $20.00). May be a flow reference. |
currency | No (default usd) | ISO currency code. |
quantity | No (default 1) | Number of units. |
successUrl | Yes | Where Stripe returns the visitor after payment. |
cancelUrl | Yes | Where Stripe returns the visitor if they cancel. |
resultVar | No (default checkout) | The variable the { id, url } result is written to. |
Ports
next and error.
Examples
Charge a fixed price for a product:
text
Stripe secretKey: ${secrets.STRIPE_SECRET_KEY}
productName: "Pro plan"
amount: 2000 # $20.00
currency: usd
successUrl: https://mysite.com/thanks
cancelUrl: https://mysite.com/pricing
resultVar: checkout
# → redirect the visitor to refs.checkout.urlCharge a dynamic amount taken from the form:
text
Stripe productName: "Donation from ${start.name}"
amount: ${start.cents} # the form sends an integer number of cents
currency: usd
successUrl: https://mysite.com/thanks
cancelUrl: https://mysite.com/TIP
Test with a Stripe test-mode key (sk_test_...) and card 4242 4242 4242 4242. Store the live key under Secrets as STRIPE_SECRET_KEY and never paste it into a flow field directly.
Confirming payment
Creating the session doesn't mean the visitor paid — they pay on Stripe's page afterward. To act on a completed payment (fulfil an order, send a receipt), receive Stripe's checkout.session.completed webhook: add a webhook endpoint in the Stripe dashboard pointing at a second flow, and set that flow's Start node to Webhook Signature → Stripe auth with the endpoint's signing secret. FlowRunner verifies the signature, then the flow reads the event (${start.type}, ${start.data}). See Webhook signatures → Stripe.