Skip to main content

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).
Post-purchase accepts do not mutate the main order. Each accept creates a child order whose metadata.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.
Accept navigates immediately, but the child order lands asynchronously — the first response is often missing it. waitForRelatedOrders: true makes the SDK poll for up to 8s and return the latest snapshot. In React, useOrder does the same in the background so the main order paints immediately.
Studio’s 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 pages that share the Plugin/Studio internal path /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 no pluginId.
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).
Product 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.
In React, the thank-you page is one hook:
Offers are created with the Node SDK (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