Recreating VShred's SGA funnel natively on Shopify: how it works, how it maps from the current system, and what to build. The whole funnel — quiz → VSL → checkout → upsells — on Shopify.
A resolver evaluates each step's conditions and returns the next page — spanning the whole funnel, quiz → upsells.
A $0 selling plan vaults the card at checkout; each upsell is a billing attempt against the contract. No re-collecting payment.
Customer Events emit at each step to an endpoint you own → Snowflake. Funnel Progression, Survey GA, Klaviyo don't move.
A port of the existing model onto Shopify primitives — the concepts survive one-to-one, not a foreign rebuild.
funnel_node metaobject — slug + before / after / variants / track as JSON fieldsSubscriptionContract (card vaulted) → subscriptionBillingAttemptCreate per stepThe condition vocabulary is theirs, extracted from the live decision tree — geo, cart-SKU/product, ownership, the quiz macro (gender + goal). We're re-expressing rules they already run, not inventing them.
$0 selling plans + card vaulting so later steps can charge — selling-plan groups → subscription contract.
First upsell action kicks off the funnel and mints the session token.
Fast server-side store (e.g. Redis) holding the macro, sticky A/B groups, position — off Shopify's hosting.
The decision engine — entry gating and exit routing; the A/B group picks which rule-set.
Each accept is a billing attempt against the vaulted card; records the purchase.
Weighted, sticky, step-level tests; the group is a cart attribute the resolver reads.
Customer Events emit per step, tagged, to your ingest endpoint → your warehouse.
Consolidate in-funnel purchases into one receipt, auto-total, send via Klaviyo.
A step is four config blocks. Real example: the burn step, from the live rules.
{
"slug": "us/burn", "type": "upsell",
"before": [
{ "when": {"is":"macro","gender":"female","goal":"get-toned"}, "goto":"us/burn-gt" },
{ "when": {"is":"geo_not","countries":["US"]}, "goto":"us/ht-call" }
],
"variants": { "sticky":"session", "pool":[ {"page":"…/12712","weight":50,"control":true}, {"page":"…/12721","weight":50} ] },
"after": [
{ "when": {"is":"cart_has_offer","skus":["…_sub_115","…_monthly"]}, "goto":"us/burn-pm" },
{ "when": {"is":"cart_has_offer","skus":["…evolved2_1","…_3","…_6"]}, "goto":"us/burn-3bo-us" }
],
"fallback": "us/burn-1bo-ds",
"track": { "on":["impression","decision","conversion"], "tags":["funnel","step","variant","macro"] }
}
Authored as metaobjects (variant references + safe rollback), generated to JSON, cached at the request layer for fast reads. Everything else is a list of nodes built from three primitives: a rule (when → goto), a condition (a typed when), a variant (page + weight + control).
SLTWTR solution blueprint · the full spec (components, data shapes, event model, open items) lives in the ClickUp deliverable. Scope: SLTWTR implements the selling-plan / card-vaulting piece and blueprints the rest for VShred's team to build.