This module is optional

Modules 1–8 are the full-day workshop — TaskFlow is already complete without this. This is a self-paced bonus for after the day, showing how the same config-first model extends to accepting real payments. Nothing here is required to finish the core lab.

What you'll add

A TaskFlow Pro upgrade: a workspace clicks Upgrade, pays through Stripe's hosted checkout, and a subscription record lands with its status once payment confirms — no polling, no webhook code you have to write. You'll touch the same three roles Module 7 introduced (org admin, workspace admin, developer), extended to a connector that's two-legged and async instead of one-shot.

Why this isn't just another connector

Slack (Module 7) is one-shot: fire a request, done. A checkout is different — you start it now, and confirmation (did they actually pay?) arrives later, asynchronously, from Stripe's own infrastructure. Stripe, Paddle, and Dodo all share this two-legged shape: a direct checkout call that returns a redirect URL, and a signed webhook that lands the result on whatever entity you configure — plus one thing no other connector has, a per-workspace Product Catalog so a checkout call never needs to carry a raw provider price id.

1 · Org admin — enable Stripe

Same enable step as any other connector — Org Settings → Integrations → Stripe → Enable. You'll need a Stripe test-mode account; the secret key, webhook signing secret, and product catalog are entered by the workspace, not you, in step 3.

2 · Org admin — define the subscription entity and the webhook landing

Add a small entity to land the result on — the same create-entity flow you used for Project and Task in Module 2.

json
POST /api/create-subscription
{
  "entityName": "subscription",
  "entityIdFieldName": "id",
  "UpdateParams": [
    { "name": "id",     "colType": "string" },
    { "name": "status", "colType": "string" },
    { "name": "plan",   "colType": "string" }
  ]
}

Then, on Stripe's Customize → Webhook tab, configure where a confirmed subscription event lands: Target Entity = subscription, Operation = update, Target Row ID = {{ipaas_ref.entityRef}} (the optional entity_ref your app passes when checkout starts), and a Field Mapping for status.

3 · Workspace admin — credentials and product catalog

On the Connectors screen, under Credentials: paste the Stripe test secret key and a webhook signing secret, then Save (its own independent save action — it can never overwrite anything else on this screen). Under Product Catalog, map a label of your choosing to a real Stripe Price id you've created in test mode:

json
{ "pro_monthly": "price_..." }

4 · Developer — call checkout from the client

The client sends only the label from step 3, plus a success/cancel URL — nothing identifying who's calling; that's stamped automatically from the signed-in user's own session. Everything workspace- or identity-specific — including resolving the label to the real Price id — happens server-side.

http
POST /app/{orgcode}/ipaas/stripe
{ "action_id": "checkout_price_recurring", "fields": { "product_name": "pro_monthly", "success_url": "...", "cancel_url": "..." } }
1Call the route above as a signed-in app user — get back result.checkout_url.
2Redirect the browser to checkout_url and pay with Stripe's test card 4242 4242 4242 4242.
3Stripe redirects to the success URL your client sent.
4Behind the scenes, Stripe's webhook already landed on your subscription row — check it: status is no longer pending.
http
GET /app/{orgcode}/item/subscription/{id}
→ { "id": "...", "status": "active", "plan": "pro" }

Try it

Run the four steps above with a real Stripe test-mode account. Then, in the Stripe dashboard, cancel the subscription and re-fetch the subscription row — its status updates again, asynchronously, with no code of yours in the path.

Going further: gating the upgrade isn't supported yet

If you wanted Pro offered only to workspaces not already on it, you'd normally gate the checkout call behind a condition in a Logic Block. That's not currently supported for payment connectors — Product Catalog label resolution only works on the direct route shown in step 4. Run any eligibility check in your own client/backend before calling checkout instead.

Go deeper