Pre-launch — Feature Flags & Rollout Plan
Audience
Onboarding managers, support, anyone fielding "why can't I see X?" questions during pre-launch.
Marketplace launch: May 15, 2026 All flags default to false (off). Verifluence fails closed — a misconfigured LaunchDarkly client or network outage leaves the platform in the safe pre-launch state.
TL;DR
Five LaunchDarkly flags gate everything pre-launch. Until they flip, streamers can sign up + complete profile + KYC, and operators can prepare + fund campaigns. Nobody can yet do anything that puts campaigns in front of streamers or money in motion.
| Flag | Audience | Default | Unlocks when ON |
|---|---|---|---|
streamer-marketplace-enabled | streamers | off | Inbox / Offers / Negotiations / Deals + browseable campaigns |
streamer-trust-score-visible | streamers | off | Trust Score page + sidebar + dashboard CTA |
streamer-public-profile-enabled | streamers + public | off | /s/:username public profile page + the Profile Visibility toggle on Personal Info |
operator-streamer-discovery-enabled | operators | off | /operator/streamers roster page |
operator-deals-enabled | operators | off | Inbox / Offers / Negotiations / Deals + "Invite to campaign" buttons |
What's open day 0 — no flag
Anyone we invite during pre-launch can do the following today, no flag flipping required:
Streamers
- Sign up via Kick OAuth (consent-first flow)
- Complete personal info (country + languages)
- Link payout wallet (USDC address)
- Submit KYC documents
- View tracked Kick stream sessions
- See their pre-launch onboarding checklist on the dashboard
Operators
- Redeem invitation, complete account setup
- Link wallet
- Create campaigns
- Fund campaigns (escrow deposits)
The amber pre-launch banner across the top of every authenticated page reminds users we're in pre-launch until May 15, 2026.
Recommended rollout sequence
You can flip flags in any order, but the natural progression is:
| Stage | Flags now ON | What it enables |
|---|---|---|
| Stage 0 — today | (none) | Onboarding only. Operators stockpile prepared+funded campaigns. Streamers complete profile + KYC. |
| Stage 1 — pre-launch teaser (optional) | operator-streamer-discovery-enabled | Operators can browse the streamer roster and plan target lists. No actions yet — invites still gated. |
| Stage 2 — internal beta (optional) | + operator-deals-enabled | Operators can send invites; only beta-test streamer accounts you've targeted will see them (since streamer-marketplace-enabled is still off). Invites silently queue against streamer inboxes. |
| Stage 3 — launch day | + streamer-marketplace-enabled + streamer-trust-score-visible | Streamers see the marketplace; queued invites surface; trust score becomes meaningful. Full two-sided flow live. |
Short-circuit option: flip all four together on launch day if you don't need the staged validation.
Per-user vs global rollout
Each flag in LaunchDarkly can be:
- Off for everyone (default — current state for all four)
- On for specific users — target by streamer/operator email or LD context attributes — useful for dogfooding + beta testers
- On globally — the launch-day flip
The frontend uses LD's user-context bridge, so flag evaluation is per-signed-in-user. Anonymous visitors fall through to the default (off) and get the public pre-launch splash.
What users see when flags are OFF
Streamers (streamer-marketplace-enabled off)
- Sidebar: only Dashboard / Personal Info / Wallet / KYC / My Streams (Inbox, Offers, Negotiations, Deals hidden)
- Top banner: "Verifluence is in pre-launch mode until May 15, 2026. Use this time to complete your streamer profile..."
- Dashboard shows a pre-launch onboarding checklist instead of marketplace earnings tiles
- Top-nav "Campaigns" disabled with a "Soon" badge
- Direct nav to
/campaigns,/campaign/:id,/profile/offersetc. → bounces to dashboard or splash
Streamers (streamer-trust-score-visible off)
- "Trust Score" sidebar item hidden
- "Trust score" CTA on the dashboard checklist hidden
- Direct nav to
/trust-scoreredirects to/profile/dashboard
Operators (either operator flag off)
- Sidebar: gated items (Streamers, Inbox, Offers, Negotiations, Deals) filtered out
- Top banner: "Use this time to prepare and fund your campaigns. Streamer discovery and dealmaking open closer to launch day."
- "Invite to campaign" buttons hidden on streamer profile pages and roster cards
- Direct nav to gated routes → bounces to
/operator/campaigns
Anonymous visitors (streamer-marketplace-enabled off)
- Landing page: hero shows "Pre-launch · Onboarding cohort opens May 15, 2026" pill instead of live campaign count
- "Campaigns Paying Right Now" section hidden
/campaigns→ splash with sign-up + sign-in CTAs (not a bare gate)/campaign/:id→ redirects to splash
Common onboarding scenarios
| User reports | What's actually happening | What to do |
|---|---|---|
| Streamer: "I don't see any campaigns" | Expected — streamer-marketplace-enabled is off | Show them the dashboard checklist + KYC path. Mention the launch date. |
| Streamer: "Nothing is happening after I uploaded KYC docs" | Expected — manual review | The dashboard now shows "Awaiting review" automatically once docs land. Reassure them; standard turnaround applies. |
| Operator: "I want to invite a streamer but don't see the button" | operator-deals-enabled still off | Confirm campaign is created + funded. Tell them invites open closer to launch. |
| Operator: "I revisited my invitation link and got 'expired'" | They already redeemed it; account exists | Send them to /signin with their email. The new smart-recovery message also surfaces this directly in the UI. |
| Streamer: "I started signing up via Kick but never got an email or finished" | Pending row from a 30-min OAuth window. We auto-email a resume link at the 20-min mark. | If >30 min has passed, ask them to start over at /streamer-signup. The new flow is two checkboxes + one click. |
| Streamer: "I clicked Remove on my Kick channel and now I'm locked out" | Was a real footgun pre-PR #45. Fixed: the Remove button on Kick rows is hidden and the server returns 405. | Should no longer happen. If it does on an old client, check streamer_channels.deleted_at IS NULL for that streamer and clear the timestamp. |
| Anyone: banner says May 15 but the date moved | Date is currently hard-coded | Open a ticket — engineering ships a one-line PR to update. |
Removing flags after launch
When a flag has been at 100% for 2+ weeks with no incidents, file a follow-up to:
- Delete the LD flag
- Remove the
useFlaghook fromfrontend/src/lib/flags.ts - Strip call sites and gating logic
- Drop the pre-launch banner once all gating flags are gone
Tracked in docs/engineering/infrastructure/feature-flags.md (engineering side).
Quick verification — am I correctly flagged?
Each flag is independently flippable per user from the LD admin. If a streamer or operator reports "I should see X but I don't":
- Check the LD project — flag list lives under
VITE_LD_CLIENT_ID=69db76a0e485fc0a7e52d0a7 - Confirm the flag is targeted to their email / user-id
- Have them refresh — flag changes propagate within ~30 seconds via the LD streaming connection
- If still wrong, check the worker dashboard for any LD-side errors: https://grafana.verifluence.io/d/vf-worker
Related docs
- Streamer Onboarding — full UC walkthrough
- Operator Onboarding — full UC walkthrough
- Engineering: feature-flags.md — implementation reference (LD setup, code patterns, removal mechanics)