Basic post-purchase
Time: ~15 minutes | Difficulty: Beginner | Type: first demo in Funnel demos Landing → pay → one-click add-on → cheaper fallback if they decline → one more add-on → thank you. This is the default DTC pattern. Everything else in this category is a variation on this graph.The live Tagada Demo store ships this type as Studio Showcase (Essential Tee → cap → tote). Reproduce it on any store — swap the products, keep the edges.
What you need
Prices are integer cents (
2999 = $29.99).
The graph
Six steps. Conditions only leave the offer nodes./:orderId on offer and thank-you paths is what lets the next page load the main order (and then the related ones).
Thank you: related orders
Post-purchase accepts do not mutate the main order. Each accept creates a child order whosemetadata.mainOrderId is the checkout order.
GET the main order (Plugin SDK getOrder, Headless tagada.customer.getOrder, dashboard order API). The payload includes relatedOrders[] — one entry per accepted offer.
OrderItemsList already renders each related order as its own block and a combined total. If you build the thank-you page yourself, do the same: one block per order + each relatedOrders[] item.
That is the system. Do not invent a second cart or append line items onto the original order.
Build it in Studio (matches the demo)
1
Catalog
Create the four products (or three if downsell reuses the cap at a second price). Each offer needs its own
priceId.2
Checkout offers
Dashboard → Offers: one upsell (cap), one downsell (cap cheaper), one upsell (tote). Each offer is a single line item.
3
Funnel
New funnel. Add the six steps above. Draw the seven edges. Bind each offer on its step (
stepConfig.resources.offer).4
Pages
Assign a Studio page per step — or leave checkout / offer / thank you empty to get native pages. Landing needs a Studio (or Plugin) page: native checkout does not cover
landing.5
Landing CTA
The buy button must open checkout with the tee
lineItems (variantId + quantity). A header “Checkout” with an empty cart shows placeholder totals.6
Save
Saving mounts routes. Preview from the landing step with a session that already has the tee in the cart.
/offer need a path remap to /downsell and /offer-tote so decline/accept do not land on the same URL. See Path remapping.
Build it with the Node SDK
Same graph as Studio. Native pages are injected when a step has nopluginId.
Native pages cover
checkout, offer, and thankyou. The landing step still needs a Studio or Plugin page (or skip landing and make checkout isEntry: true — then this type collapses to the 4-step Node tutorial).create payload: Upsell & Downsell Funnel → Step 2.
Share a cart link:
Same type on the Headless SDK
You host every URL. Tagada does not move the shopper. Copy this sequence — it is the whole type.checkoutOffers.create) or the dashboard. The Headless SDK only charges them.
Full method docs: Checkout Flow, Upsells & Offers.
To let Tagada own the step URLs instead, create the graph above and send the shopper in with funnel.navigate(). That is optional — a self-hosted store does not need a funnel record.
Paths the customer can take
Every accepted offer appears on thank you as a related order, not as an extra line on the tee order.
Next
Funnel demos
Catalog of types — this is the basic one
Funnel Orchestrator
Nodes, edges, analytics, A/B
Node SDK 4-step tutorial
Same idea without landing or the second OTO
Headless offers
One-click pay with
mainOrderId