Commit Graph

11 Commits

Author SHA1 Message Date
martbost 7e390aa48e Join: let chosen positions default to direct placement
The moving link is team-first by design: it routes a new join to whoever needs
directs next, so the position whose link was actually clicked earns no entry
reward. Measured on #21 that came to 80 joins in seven days and zero entry
rewards, while the traffic paying for those joins was the owner's.

For a position being deliberately built out, that default is backwards. Any ID
listed in the new directDefaultIds config now behaves as ?direct=1 on its own
/join/<id> link - including every promo tool, flyer QR and downline-builder
entry that resolves through it - without needing the parameter appended.

?direct=0 still forces rotation for a single share, so the team-first behaviour
stays available rather than being replaced.

Config rather than hard-coded, and editable from the admin settings form, so
which positions get this can change without a deploy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 10:29:55 -05:00
martbost 8858470244 stopwaiting angle: squeeze page on the lander (combined overview video) + handout QR now carries ?v=stopwaiting
The stop-waiting handout QR previously hit the plain join page with no angle continuation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 10:11:41 -05:00
martbost 4b53dd5326 Direct link option: opt out of moving-link rotation to build personal spillover (Team link default, Direct link alternate) 2026-08-26 14:24:32 -05:00
martbost 0839e58dd1 Angle links render a pure squeeze step: headline + hook video + one proceed button; click-through loads the full invite page 2026-08-22 08:45:11 -05:00
martbost 570a9bc4a4 Angle pages host the hook video itself: watch on-page, skip-ahead for repeat viewers, auto-advance to overview + join on video end 2026-08-22 08:42:39 -05:00
martbost c528a0a770 Angle pages advance to the overview video (bridge headline + rewatch link) instead of replaying the hook 2026-08-22 08:32:21 -05:00
martbost 4584d508be Angle-matched landing pages (?v=hook on the invite link)
/join/<id>?v=pocket|phone|two|graveyard swaps the hero headline and
the watch-first video to continue the curiosity hook that brought
the prospect, keeping the sponsor identity in the sub line. Tools
page: each angle card gains a "Copy matched invite link" button
(personalizes through the existing bare-domain swap); Posts 6/7
carry ?v=pocket. AI prompt knows to recommend matched links.
2026-08-22 08:21:52 -05:00
martbost 629df6336c Wire the join funnel to the live /join-now self-enroll page
/join-now now honors ?ref=<id> (resolves that member's moving-link joinTarget;
falls back to the global rotation sponsor). Repointed: /start 'Join With Current
Sponsor' -> /join-now; /my pitch buttons -> /join-now?ref=<id>; invite page
/join/<id> join button -> /join-now?ref=<id>; bare /join redirect -> /join-now.
'Get Started' learn CTAs still go to /start for onboarding. When the flag is off,
/join-now gracefully redirects to /start, so the wiring is safe either way.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 07:37:19 -05:00
martbost cce3b060b3 Fix join button label to show the resolved sponsor (was showing inviter)
The .inv-id-inline spans (join button + dApp-sponsor mention) were left on the
inviter's id; now they follow joinTarget like the header/href already did.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 13:05:43 -05:00
martbost f0ea4469a4 Self-rotating personal links: qualified member's join routes to next-to-qualify
Fixes the spillover leak where a qualified member promoting their own link had
joins land back on themselves (bonus reward) instead of qualifying their team.

- /api/public/member now returns joinTarget: unqualified member -> self;
  qualified -> next-to-qualify in their leg (reuses rotation-aligned nextInLine);
  whole leg qualified -> global rotation sponsor; else -> spillover (prior behavior)
- /join page: the Join button, "join under" header, sponsor-ID copy, and the
  submitted sponsorId all follow joinTarget; a note explains "invited by #X,
  joining to help #Y qualify" so the new member knows their real sponsor
- Member's SHARE link is unchanged (/join/<id>); resolution happens when a
  visitor opens it, so it self-corrects even for links already in the wild

Dry-run verified: /join/27 -> #34, /join/34 -> #34 (self), /join/21 -> #34.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 13:02:34 -05:00
martbost 29e0d6e791 Personal invite pages (/join/<id>) + auto-count queue directs from the chain
Prospects who clicked a member's shared /my link landed on a bare stats
dashboard with no explanation of the program. New /join/<id> page carries the
full bridge-page story (video, strategy, matrix, live on-chain payout proof)
personalized to one sponsor: their live position stats as proof, their ID
pinned on the dApp join button, and the submit-your-ID form locked to them
(source invite-<id>). Dashboard share buttons + QR codes now hand out the
invite page; /my stays the member dashboard. Invalid/unregistered invite ids
fall back to the /start rotation. Tracked as new 'join' event with an admin
traffic column.

Also: the chain indexer now auto-increments a rotation sponsor's directs when
a registration names them as referrer (same op as the admin ⊕), announcing it
on Telegram. At 2/2 it alerts to Qualify instead of auto-rotating — moving
the team focus stays a human decision.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 08:18:30 -05:00