Project Lure · Voice Demo Landers · GTM

Implementation & Product Spec

The foundation worked out before any build: what each feature is, exactly how it runs live, which real provider powers it, what we reuse vs build, the design direction, and the decisions that gate everything. Grounded in the actual code (fe-main, main monorepo, justsext-landers), the live ElevenLabs config, Linear, and Slack — not the prototype.

v1 · 2026-06-23 Author: Ilia (GTM) Sources: code + Linear + Slack + ElevenLabs (11-agent discovery) Status: pre-build groundwork
0 TL;DR & verdict 1 What the brief got wrong 2 Architecture & data flow 3 Feature spec (live, per feature) 4 Provider & systems map 5 Content pre-generation 6 Design: redesign direction 7 Reuse map (what to lift) 8 Open decisions 9 Risks & blockers 10 Build sequence 11 Immediate next actions

0TL;DR & verdict

Lure can be built almost entirely from systems that already exist in production. The lander lives in justsext-landers and reuses its attribution, Google auth, and analytics verbatim. The live voice call is the same ElevenLabs path the product runs today. Demo photos are served by a live endpoint from galleries that already exist for Sophie Dee. The work is mostly assembly + a new demo agent + a real design, not greenfield.

Three things are not ready and gate the monetizing parts:

⛔ Hard blockers (someone must clear these, not us)

Everything below treats those as decision points with options + a recommendation, so the spec is actionable now.

1What the brief got wrong (now corrected)

Brief / prototype saidReality (from code + Slack)
Payment via "Centrobill, no re-auth"OpenPay is the gateway (Ilia confirmed). Code: getopenpay-go, saved payment_method_id one-click in lambdas/api-user-billing + api-webhook-openpay. "No re-auth" = reuse a stored payment-method token (exists on OpenPay). Centrobill has zero code; every "Centrobill" mention in the Lure tickets has been corrected to OpenPay. The only open payment item is the broken prod checkout, not the gateway choice.
Demo agent = a branch off the product agent ("not a separate agent")The team decided the opposite in #eng (Jun 19-20): two separate agents, sophie-dee-voice-lander + sophie-dee-web. Reason: max call duration is an agent-level setting (confirmed in the EL config — max_duration_seconds is not client-overridable). The Linear ticket text (GTM-2178) is stale.
Reuse the prototype designThe prototype design is a throwaway. It reads as generic NSFW-AI-app "slop" (abstract orb, neon purple/pink gradients, casino clutter). It needs a full redesign toward a real, premium, creator-forward call (see §6).
"94% anonymous" is a problem to fixFor the lander it is by design — web demo calls start anonymous (pre-signup). The analytics join key is call_id, not user_id. Real account identity attaches at registration.

2Architecture & data flow

One sentence: a Next.js lander on landers.justsext.com runs a live ElevenLabs voice call through the existing voice backend, gates the user, registers them with the same Google auth as the app, charges them through the live gateway, then hands off into the SIREN product via a one-time exchange code.

1
Affiliate click → lander
PornHub "talk with my AI" / Crak / TrafficJunky. Everflow affid + ef_transaction_id captured by lib/attribution.ts (already built), persisted to localStorage. reuse
2
Guest session (optional, for early attribution)
POST /auth/auth/guest with the Everflow referral payload → guest JWT. Lets attribution attach before signup. reuse
3
"Answer" → live voice call
Lander mints a session: GET call.app.justsext.com/calls/signed-url?creator_id=…{signed_url, agent_id, call_id, max_duration_seconds}. Browser connects to ElevenLabs via @elevenlabs/client Conversation SDK. port from fe-main
4
Gamified demo runs
Client-side mechanics (chips, emoji, heat, combo, slot-machine). Photos pulled from pre-gen galleries. Token countdown drains. build (UI) logic maps to SIREN tickets
5
Hook threshold → registration wall
2 min OR 4 photos OR tokens hit 0. Google auth (same Cognito flow as the app) via reused lib/auth.ts. reuse
6
Hard paywall → purchase
Token pack / subscribe through the live gateway, ideally with a saved-card one-click. blocked: payment broken
7
Handoff into SIREN product
POST /auth/auth/exchange-code/create (30s one-time) → redirect justsext.com/?exchange_code=…&creatorId=…&startCall=true. App auto-logs-in and drops into the live sophie-dee-web call. reuse (backend ready)

Throughout: every funnel step fires an event carrying affid + ef_transaction_id + creator_id (GTM-2182), aligned to the C78 dictionary, joined on call_id.

3Feature spec — live, per feature

For each feature: how it works for real, the provider, what we reuse, what we build.

3.1 Live voice call build (port)

Not a mock. The browser holds a real WebRTC/WebSocket session with ElevenLabs Conversational AI.

3.2 The demo voice agent blocked on Karen duration value

A new ElevenLabs agent, sophie-dee-voice-lander, cloned from Sophie Dee - Web (agent_9601kph9vs55ek4b08nj4bv86v03).

3.3 The 7 gamified mechanics build (UI) density

Client-side state on top of the live call. Each maps to an in-product SIREN ticket so the behavior is defined, not invented. Put every mechanic behind a Statsig flag so the active set is config, not a deploy (GTM-2179 / GTM-2186).

MechanicHow it worksSIREN reference
Silence-rescue chips4s quiet → 3 cluster-aware reply chips; one tap fires a replyD2C-4949 / D2C-4870
Emoji react bartap → particle burst + creator audio ~200ms; ~50% random floating labelD2C-4623
Photo slot-machine1.4s spin → locked image → unlock CTA (12 tokens); heat +10 request / +15 unlock; insufficient → paywallD2C-4624 (full spec) · shipped code in D2C-4852 / fe-main PR #1215
Heat meterevery interaction raises it; 50% confetti; 100% jackpotD2C-4621
Combo streakback-to-back interactions stack an "x3 combo" chipD2C-4622
Token countdowndrains live; <60 red pulse; hits 0 → CC modal slides up, creator loops "don't go babe", no hangupD2C-4548 epic
Cluster switcherflip mid-flirt / heating-up / silent; pools + tone shiftD2C-4519 (canceled — reference only)

Photos are not generated live. The "just generated" framing is a UI illusion over pre-gen assets (see §5). The slot-machine spin spec (1.4s, cubic-bezier, unlock at 12 tokens, heat math) is fully written in D2C-4624 — copy it.

3.4 Registration — same Google auth as the app reuse

3.5 Hard paywall blocked: payment broken

3.6 Live avatar vendor M3

Two genuinely different paths. The call screen already exposes the attach point: swap the single creator <img> for a <video> driven by the existing isCreatorSpeaking + volume signals.

3.7 Handoff into SIREN reuse

After purchase, mint a 30-second one-time code (POST /auth/auth/exchange-code/create, Bearer user token) and redirect to justsext.com/?exchange_code=…&creatorId=…&startCall=true. The app auto-redeems and starts the live sophie-dee-web call. Backend is ready; standardize on this (not the ?code= hack currently in the landers repo, which is a latent bug).

3.8 Instrumentation build to spec

Events fire at every step (lander_view → demo_call_started → demo_chip_tap / emoji_react / photo_spin / photo_unlock / heat_milestone → demo_gate_reached → demo_registration_completed → demo_paywall_view → demo_purchase), each carrying affid + ef_transaction_id + creator_id, joined on call_id, aligned to the C78 dictionary. Owner: Mac, under Ilia (GTM-2182). Reuse the lander's existing Segment/GTM/PostHog rigs.

⚠ Measurement caveat

Two product bugs are still open: D2C-4943 (≈50% of web calls have null agent_id; 86.9% null creator_name all-time) and D2C-5065 (no user_id on web calls). If Lure ships its funnel before these land, demo events inherit null creator_id and purchases won't join back to source. Design a Lure-specific creator_id pass-through, or wait for the fixes.

4Provider & systems map

CapabilityProvider / systemEndpoint / locationStatus
Live voiceElevenLabs Conversational AI + @elevenlabs/clientsigned URL from call.app.justsext.com/calls/signed-url; backend main/services/call-servicelive
Demo agentElevenLabs (new agent)sophie-dee-voice-lander — to create, clone of agent_9601kph9vs…to create (Karen)
Google authAWS Cognito (Google IdP) + STXT auth-serviceapi.justsext.com/auth/auth/google; reuse landers/lib/auth.tslive
HandoffSTXT exchange-code/auth/auth/exchange-code/create + redeembackend live
PaymentOpenPay (confirmed — not Centrobill)lambdas/api-user-billing + api-webhook-openpayprod checkout broken
PhotosPre-gen galleries (fal.ai Z-Image LoRA pipeline)POST api/medias/internal/free-media by escalation_step; CDN static.justsext.comlive
Avatar (video)fal.ai pre-render (rec) / Anam / d-idfal.ai Kling/OmniHuman (team access set up)M3
AttributionEverflow → lib/attribution.tscaptured + persisted on lander; snapshot on call createlive
AnalyticsSegment + GTM + PostHog → BigQuery / MetabaseC78 dict; funnel.tools.stxt.ailive (to wire)
HostingVerceljustsext-landers, landers.justsext.comlive

5Content strategy — video-first on Sophie Dee

Creator: Sophie Dee. She is the one we test everything on, has the most ready content, the live EL agent, and a complete tagged gallery. Lock her as the launch creator (Eric's Jun 21 DM steer: pick 1-2 creators, move fast; pre-gen and live-gen both available).

Medium: go straight to video, skip photo-only testing. Ilia's call — video is more engaging than stills, so the demo content (the "slot machine" reveal, the creator hero, the escalation arc) should be short video clips, not photos. The photo-unlock mechanic stays as a shape, but what it reveals is video.

Two axes we test (both, not either/or)

What we reuse vs generate

Hard gate: Sophie Dee likeness/consent sign-off (Erin/legal) before generating motion video. Confirm before any gen run.

6Design — rebuild from scratch, many variants

The current prototype is a throwaway placeholder. We rebuild the design from scratch and work it properly. But the engagement ideas stay — the whole point is to actively hook the user, so every mechanic and idea in the prototype is kept and tested, not thrown out. The redesign is not "remove gamification." It is two things: (1) raise the craft so every screen is clean, clear, and high-quality, and (2) produce many variants to test, because we don't yet know which shape converts cold traffic.

The variant matrix — we test across both axes

Plan for iterations, not one design. Two axes, and we build options along each:

🎰 Style axis
Casino-maximal: heat, combo, confetti, slot-machine, jackpots loud and front-and-center — lean into the game
Clean-minimal: calm, premium, creator-forward, mechanics subtle and earned
…and points in between. Both ends are valid; the data picks.
🎚 Density axis
Fewer mechanics: 3-ish — focused, less to overwhelm a cold user
More mechanics: 5-7+ — maximal dopamine surface
Ties to GTM-2186 mechanic-density arms (3 / 5 / 7).

Non-negotiable craft bar (applies to every variant, casino or clean)

  1. Clean & clear. Whatever the density, the screen must read instantly — clear hierarchy, one obvious primary action, nothing confusing. "Casino" must still be a well-designed casino, not clutter.
  2. Believable. It should feel like a real person on a real call (her real photo/video as the hero), not a generic AI widget.
  3. Mobile-native motion. Sub-200ms feedback, physical iOS-grade easing. Cold paid traffic is mobile (Canada + Android convert best); design and test mobile-first; consider PWA if it buys smoother motion.
  4. Conversion-UX baseline (from the brief): never a dead end; reduce choices at the paywall; never lock the action chips at the wall.

Quality is the constant; style and density are the variables. The visual system should be derivable from the creator's brand, and we should ship several iterations so the team can tap through and the live A/B can read which shape wins.

Next step on design: I produce several real design directions in the actual lander stack (justsext-landers tokens / fonts: CHANEY-Wide, Funnel Display) — at minimum a casino-maximal and a clean-minimal, each at a couple of densities — built from scratch, not the old mock. You tap through and we pick what to productionize + A/B.

7Reuse map — what to lift, exactly

NeedLift from
Lander scaffold + deployjustsext-landers (Next 15/16, Vercel landers.justsext.com). New route app/lure/ (+ v1..vN for A/B).
Everflow attributionlib/attribution.ts (affid, ef_transaction_id, sub1-5, persisted) + lib/tracking.ts — verbatim.
Google auth + signuplib/auth.ts + app/auth/callback/page.tsx + components/signup-form.tsx.
Live voice logicfe-main/src/app/shared/services/elevenlabs-call-provider.service.ts (Angular → re-implement in React with @elevenlabs/client).
Photo slot-machine specD2C-4624 (spin timing, unlock, heat math) + shipped code in fe-main PR #1215 (D2C-4852).
Demo agent configclone Sophie Dee - Web (prompt, voice, RAG cards, evals) → new sophie-dee-voice-lander.
Call visual shell (placeholder)justsext-landers/app/valentine/_components/hero/ (caller-display, live-indicator) — presentation only; redesign per §6.
Handoffexchange-code flow (/auth/auth/exchange-code/create) + app/go/_components/call-cta-button.tsx pattern.
Analytics rigslib/gtm.ts, components/posthog-provider.tsx, components/segment-provider.tsx.

8Open decisions (with recommendations)

Each needs an owner sign-off. Recommendations are mine (Eric gave full latitude on Lure); the blockers need eng/EL confirmation.

💳 Payment gateway resolved
Gateway = OpenPay (Ilia confirmed; not Centrobill). Saved-card one-click exists.
Only open item: the prod checkout is broken (Jun 23).
Action: fix + verify the OpenPay prod checkout before paywall work. Repeat Ruslan's repro (Everflow offer-19 → register → buy cheapest plan).
Owner: Klemen + Eric · gating
⏱ Max demo duration
Fixed cap on the lander agent: 60s / 90s / 120s
Data: ≥120s calls convert ~33% vs ~1% under
Rec: 120s cap as the first arm (it's the proven hook threshold), A/B 90s later. Set as max_duration_seconds on the new agent.
Owner: Karen + Michael + Klemen (GTM-2240)
🤖 Demo agent
(a) Dedicated sophie-dee-voice-lander (Slack-decided, required for cap + opener)
(b) Branch off product agent (blocked by override whitelist)
Rec: (a). Karen creates it with prompt/first_message overrides + conversation_initiation_client_data enabled. Record the decision in GTM-2178.
Owner: Karen (EL admin)
🌐 Lander domain
(a) justsext.com/<path> — shares localStorage, no exchange-code needed
(b) landers.justsext.com — must use exchange-code handoff
Rec: (b) landers subdomain + exchange-code (clean separation, backend ready). Only go (a) if we want zero-redirect.
Owner: Ilia + Ruslan
🎬 Demo content = video
Skip photo-only testing — go straight to video (more engaging). Sophie Dee.
Test non-live (pre-gen clips, curated, safe) AND live (real-time gen) — both.
Rec: ship non-live curated clips first; A/B live against it. Source from Sophie's existing assets + new gen. Consent first.
Owner: Ilia + creator ops (Erin)
🎰 Mechanic density
Ship all 7 vs rank by impact on the 120s/4-photo hook
Rec: ship a Core set (chips + photo + token-wall + heat) as arm 1, A/B against full-7 via Statsig (GTM-2186). Cramming all 7 may bury the mechanic that works.
Owner: Ilia (GTM-2241) + Ruslan
💸 Pay-vs-register order
(a) Register → pay (supported today)
(b) Pay first, register after (NOT built; needs eng scoping)
Rec: launch with (a); scope (b) as an M3 A/B once payment is stable.
Owner: Eng scoping + Ilia
📺 Video: live vs non-live
Non-live: pre-rendered fal.ai clips (cheap, full control, no latency)
Live: real-time gen / streaming avatar (Anam / d-id; NSFW + cost risk; HeyGen banned)
Rec: test both. Non-live first as baseline, live as the A/B challenger. d-id / Rogue AI vendor reads pending (Eric/Dave).
Owner: Ruslan + Eric/Dave (vendors)
📡 Traffic entry
PornHub "talk with my AI" / Crak / TrafficJunky
Rec: PornHub button — cleanest intent match. Carry Everflow params throughout (UTMs are dead, <3%).
Owner: Ivan (GTM-2181)
📱 Demo phone capture (SMS)
(a) Add a lander phone field → wire /tools/send-sms funnel
(b) Drop SMS from the demo (web has no caller id)
Rec: (b) for v1; SMS funnel is a phone-call mechanic, low value on a web demo.
Owner: Ilia

9Risks & blockers

RiskSeverityMitigation
Prod checkout broken (ERT17-400/UCF18); high card-validation-failure rate Jun 1-22criticalFix before any paywall work; it's the entire monetization point. Confirm with Klemen.
Sophie-Web override whitelist blocks oversell prompt + quiz openercriticalNew agent with overrides enabled (Karen). Hard dependency before build.
Attribution join breaks (null creator_id D2C-4943 / no user_id D2C-5065)highPass a Lure-specific creator_id explicitly, or sequence the funnel after the fixes land.
Duplicate/colliding work with Ruslan's unpushed shellhighSync with him + pull his branch before writing build steps.
Cross-domain handoff latent bug (?code= vs exchange-code)mediumStandardize on exchange-code; confirm /exchange-code/create is deployed on prod.
Placeholder Cognito + Segment secrets in landers envmediumGet prod values from Ruslan / Vercel env before "live auth" claim.
Avatar NSFW/consent exposure (HeyGen bans; likeness sign-off)mediumM3 only; pre-rendered path + Sophie consent first.

10Build sequence

0
Unblock (parallel, not us)
Payment fix (Klemen) · create sophie-dee-voice-lander agent + duration value (Karen) · Ruslan pushes his shell · prod env secrets.
1
Design direction
2-3 redesign directions in the real stack → pick one. (§6)
2
M1 — Ship the demo
Lander route + live voice (ported) + Core mechanics + curated photos + gate → register (reused auth) → paywall (on fixed gateway) → exchange-code handoff. Everflow intact.
3
M2 — Instrument
Full event coverage to C78 dict, joined to funnel.tools, verified by Mac (after D2C-4943/5065).
4
M3 — Enrich
Avatar (pre-rendered), personalized quiz opener, price/mechanic A/B harness, buy-first A/B.

11Immediate next actions

  1. Sync with Ruslan — pull his GTM-2177 shell before any build. (I can draft the message; won't send without you.)
  2. Confirm payment with Klemen/Eric — which gateway processes a Lure buy, is one-click no-re-auth available, and is the Jun-23 prod failure fixed? This gates the paywall.
  3. Ask Karen to create sophie-dee-voice-lander with overrides + initiation enabled, and lock the max-duration value (rec 120s) in GTM-2178/2240.
  4. Get prod secrets — Cognito domain/client-id + Segment write key; add the lander callback to GOOGLE_LOGIN_REDIRECT_URLS_ADDITIONAL.
  5. Pick the demo creator + curate photos — Sophie Dee (matches the live agent + has the gallery); pull steps 1→4 URLs from the image-tags CSV.
  6. Approve the design direction — give me the go to produce 2-3 redesign directions in the lander stack.
Grounded in an 11-agent discovery across fe-main, the main Go monorepo, justsext-landers, the live ElevenLabs workspace, Linear (PROJECT LURE + SIREN tickets), and Slack (#eng / #war-room / #analytics). Code findings HIGH confidence; Slack decisions MEDIUM (decided in threads, not all mirrored in Linear). Identifiers and file paths cited inline are real as of 2026-06-23.