Methodology

Building Recipes

A recipe is a declarative, multi-step brand interaction that an agent composes from this library and cooker renders. This page bridges the two: the phase contract, how each phase type resolves to components, how an agent assembles and brands one, and a fully decomposed live example.

1 The recipe model

Every recipe follows one phase contract: Hook → Challenge → Reward → Offer. The funnel stage sets the emphasis — awareness recipes lean on a fast Hook + Reward; conversion recipes weight the Offer. Cooker loads a recipe as JSON; each phase carries a type and props. The four phase renderers map that type to library components.

PhaseFlow roleRendererResolves toPurpose
HookentryHookRendererWelcomeScreenFirst exposure. Set the brand frame and invite the user in.
ChallengecoreChallengeRenderera switch over the challenge type → SurveyModule / BingoModule / SpinWheelModule / …The interaction itself — quiz, pick, scratch, spin, swipe, match.
RewardrewardRewardRendererBurstPay off the effort. Celebrate and reveal what was earned.
OfferexitOfferRendererProductRevealCardConvert attention into action — a product, coupon, or landing.

Shaping by funnel stage

funnelStage is metadata now, not navigation, but it still tunes how a recipe is shaped — its duration, mechanic, and how it lands.

Awareness

Keep total duration under 20s. High-dopamine mechanics (flip / scratch / spin / stories). One core interaction only. Brand visible but not dominating. Always end on a tangible reward — points or a coupon.

Consideration

30–120s or multi-session. Knowledge-building mechanics (quiz / swipe / bingo / missions). Collect preference data through the choices, reward progressively each step, and end on a personalized recommendation.

Conversion

Under 15s. Skip or minimize the entry animation. Urgency mechanics (countdown / timed offer / flash deal). Always include a copy-able coupon code or a clear CTA that navigates to purchase or claim.

Writing the wait

When a phase hands off to a longer, full-screen transition (app → external browser, a deep-link landing, an ad-click load), reach for BrandTransition rather than a bare spinner: a publisher-branded overlay with reward icons raining down. Its subtitle reframes the wait as earning, not waiting. Write to the value that is coming, never to the delay.

  • ✓ “Preparing your rewards …” — value is coming
  • ✓ “Charging your points …” — 점수 충전중, a Korean idiom
  • ✓ “Unlocking rewards from Toss …” — brand + action
  • ✗ “Loading …” — too generic, no value signal
  • ✗ “Please wait” — passive, no reward framing

2 Anatomy — how a type resolves to a Module

Hook, Reward, and Offer resolve to a fixed component. The Challenge phase is a switch over the challenge type: each type resolves to a promoted library Module implementing ModuleProps<Config>. The Module owns its recipe-state orchestration and fires onComplete — cooker no longer wraps a bare engine to supply that state. Several quiz/survey families collapse onto one Module (the indirection that makes SurveyModule live).

Challenge typeModule
ox-quiz / multi-quiz / survey / preference-pick / swipe-deckSurveyModule
review-pickReviewPickModule
scratchScratchModule
memory-matchMemoryMatchModule
bingoBingoModule
spin-wheelSpinWheelModule
product-exploreProductExploreModule
link-listLinkListModule
countdown-dealCountdownDealModule
flash-offerFlashOfferModule
timing-gameTimingGameModule

The consumption map traces this whole chain — recipe type → renderer → Module → transitive library render graph — so every component a recipe touches is tagged live and back-linked. See Component Registry.

3 How an agent composes one

  1. Query the manifest. Use the Query API to select components by funnelStage, intent, and complexity.
  2. Assemble the phases. Order one component per role (entry → core → reward → exit), each with an exitTrigger (tap / completion / automatic).
  3. Apply brand. Pass a TokenSeed for color/type/imagery and set the personality dial; per-step brandCustomizations map a brand aspect to a specific prop.personality is the provider-level brand motion dial. A brand sets it once on ThemeProvider personality="…" and every interaction’s feel inherits the tone — press, selection, and celebration all retune. smooth (default) decelerates, confident; bounce overshoots with a visible second bound; swift snaps and settles immediately. Components read the dial automatically via usePersonality() (hooks like usePressMotion / useSelectionMotion and the Burst component) — no per-component prop needed. An explicit personality override always wins.
  4. Validate. Composition rules (see Composition Rules) confirm the flow is well-formed before cooker renders it.

4 Worked example — product-showcase

Product Showcaseliveconsideration · 20–60s

Brand with personalized product catalog (e.g. Wadiz campaign). User browses 3 slides, answers a quiz, lands on a product offer.

#RoleComponentExitWhat it does
1entryWelcomeScreen livetapHook phase rendered by HookRenderer → WelcomeScreen. Neutral layout (no background image). Auto-starts after 4s per smooth personality.
2corePersonalizedProductShowcase livecompletionChallenge phase: ProductShowcaseChallenge wraps PersonalizedProductShowcase from the library. Shows 3 slides with appeal-point callouts, then a quiz question. Correct answer = full reward; each wrong attempt decays by rewardDecay array.
3rewardBurst liveautomaticReward phase: RewardRenderer fires Burst (kind=confetti, full-width shower) + Burst (kind=radial, centered radial). Uses slot-machine animation for randomized reward display.
4rewardBurst liveautomaticRadial particle burst rendered alongside confetti Burst in the reward phase.
5exitProductRevealCard livetapOffer phase rendered by OfferRenderer → ProductRevealCard. Surfaces 1 product. Reward trigger: after-challenge (reward already settled before offer). External browser opens on product tap.

Brand customization points

  • •step 1.brandName (name) — Brand display name shown in hook
  • •step 1.title (tone) — Hook headline
  • •step 1.subtitle (tone) — Hook sub-headline
  • •step 2.config.slides (imagery) — 3 product slides: imgUrl, appealPoint, imgText
  • •step 2.config.quiz (product) — Quiz question, options, correct answer, explanation
  • •step 2.config.rewardDecay (product) — Reward values per attempt [1st, 2nd, ...] in smallest currency unit
  • •step 2.product (product) — Product shown in loader and offer: thumbnail, name, brand
  • •step 5.products (product) — Product(s) surfaced in offer card

5 Spec'ing a new recipe

  • 1. Pick the funnel stage and write the one-line useCase.
  • 2. Choose one component per phase role (entry / core / reward / exit); reuse existing engines before adding components.
  • 3. Set each step's exitTrigger and the realistic totalDuration range.
  • 4. List brandCustomizations — every brand-variable prop, mapped to its brand aspect.
  • 5. Land it in cooker with a tier (prod / mock / lab); add the matching allRecipes entry with tier live / demo / experimental.

A tier:"live" allRecipes entry automatically produces the live badge and "used in N recipes" backlinks on every component it touches — the catalog stays honest because the recipe is the source of truth.