SRS: Marketing Site — Resources (UC 1.8)
| Field | Value |
|---|---|
| BA in Charge / Author | Quynh Anh Hoang / Antigravity |
| Date Created | 2026-07-27 |
| Version | v2.1 |
| Document References | RFQ_ Website and Dashboard Implementation V7.pdf (Marketing)3rd_party_integrations_master.md (S12-Sanity, S13-GA4, S22-Cookiebot/Trustpilot, #24-Discord)QnA_MARKETING_WEBSITE.md (MKT-08, MKT-09, MKT-11, MKT-12, MKT-13, MKT-19, MKT-21, MKT-23, MKT-28, MKT-29, MKT-32, MKT-33, MKT-39) |
Changelog
| Date | Version | Updated item | Before | After | Notes |
|---|---|---|---|---|---|
| 2026-09-04 | v2.1 | UC_1.8.6 §1 Overview, §4 Post-conditions, §5.1 item 4, §5.1 item 7, BR_1.8.6.4, BR_1.8.6.6; UC Index row | §5.1 item 7 defined the share icons by reference to the Global Footer's follow-us profile links (X, Discord, LinkedIn, YouTube) and placed the row below the author/metadata block, while also calling them "share-intent" actions — never committing to which. BR_1.8.6.6 said all icons open in a new tab | Share row respecified as a plain blog share flow with exactly two targets: X (composer pre-filled with post title + post URL) and LinkedIn (share dialog with the post URL; LinkedIn builds its own preview card), both opening in a new tab, positioned at the foot of the Sticky TOC rail. Discord dropped; no Copy Link control on this screen. BR_1.8.6.6 rewritten as a share-target rule; BR_1.8.6.4's layout order folds Share into the TOC rail | Client decision relayed by user (BA session, 2026-09-04): bỏ share qua Discord, không có copy link ở màn này |
| 2026-07-27 | v1.0 | Initial document | — | Resources specs | |
| 2026-07-28 | v1.1 | Klaviyo mapping | Future_Newsletter_Welcome event | Future_Newsletter_Welcome (Ref: [KLA-02]...) event | Mapped Email sequences |
| 2026-07-29 | v1.2 | UC_1.8.1–1.8.8 §2 Trigger, §5 Basic Flow, §7 Business Rules | Trigger sections listed only a subset of known entry points; buttons/links had no same-tab/new-tab annotation | Added same-tab annotations across all navigation buttons/links (STAGE1-056 cited for all Checkout-opening buttons); added missing Trigger entry points, incl. UC_1.8.1's "See The Rules" cross-ref, UC_1.8.3's Header/Footer "Compare" cross-refs, UC_1.8.7's Footer "Company" column link, and UC_1.8.8's major supplementation (Header dropdown, Footer, and all View all FAQs/"Still Have Questions" cross-refs from UC_1.8.1/1.8.2/1.8.3/1.8.4); flagged a same-tab-vs-new-tab inconsistency on the Terms of Service/Privacy Policy links between UC_1.8.7 §5.2 item 5 and UC_1.8.8 §4.8 (BA action required) | User request: audit all UCs for missing same-tab/new-tab annotation and incomplete Trigger entry points |
| 2026-07-29 | v1.3 | UC_1.8.6 §5.1 item 1 (Back Button), UC_1.8.6 closing Open Note | Back button behavior (native history vs. hardcoded /insights link) was an unresolved Open Note | Confirmed: Back uses router.back() and restores the Hub's exact prior state (active category tab, search query, scroll position); added a hardcoded /insights fallback for the no-history-entry case (deep link/new tab); removed the now-resolved Open Note from the closing Open Note block | User confirmation: Back button must restore prior tab/scroll state |
| 2026-07-30 | v1.4 | E_1.8.2.3, E_1.8.3.4, E_1.8.4.4 (Trustpilot Widget Fetch Failure) | "Same fallback applies: widget hides itself or shows a static pre-approved rating on proxy failure." | Trustpilot score/count widget classified as required component: hides itself or keeps showing last cached score/count (never broken/empty state); no real-time listener, value refreshed on page load only and reusable from cache up to 60 minutes | Ref: Slack thread (Adam Culver/Adrian) + QnA_TRUSTPILOT_UIUX.md TP-A11/TP-A15 |
| 2026-07-30 | v1.5 | UC_1.8.5 §5.1 item 3 ("Most Popular" Widget), item 6 (Category Rails), §7 BR_1.8.5.8 | No mention of a post-count limit/Sanity setting for "Most Popular" or category rails | Confirmed no post-count cap: "Most Popular" widget and category rails load all curated/published entries (no Sanity setting to limit post count); arrow navigation is the only way to reach entries beyond the visible set; added BR_1.8.5.8 | Ref: Slack thread (Vivian/Duy/Quynh Anh) — dev to optimize later if post count grows large |
| 2026-07-30 | v1.6 | UC_1.8.5 §5.1 items 4–6 (Search), E_1.8.5.3, BR_1.8.5.6 | Search filtered the existing category rails in place; zero-result state hid all rails | Search now replaces the rails with a dedicated "Results for [query]" static grid (no arrow navigation); zero-result state shows its own empty-state message inside that grid | Search UX redesign |
| 2026-07-31 | v1.7 | UC_1.8.1 §1 Overview, §3 Pre-conditions, §5 item 5 ("Trader Advancement Parameters by Level"), §5 item 11 (Pre-Footer CTA), E_1.8.1.2, E_1.8.1.4, E_1.8.1.5, BR_1.8.1.1, BR_1.8.1.3, BR_1.8.1.8 (new); UC_1.8.3 §1 Overview, §3 Pre-conditions, §5 item 7 (Pre-Footer CTA), E_1.8.3.5, E_1.8.3.6, BR_1.8.3.2, BR_1.8.3.6 | "Trader Advancement Parameters by Level" table sourced from backend Table A/B/F via API; Pre-Footer CTA founder pricing fetched from Backend/DB (founder_count) | "Trader Advancement Parameters by Level" table and Pre-Footer CTA founder seat count/pricing now configured directly in Sanity CMS (manually updated by Marketing team); Table A/B/F retained only as the backend reference for manual alignment, no longer fetched for display; race conditions and fetch-failure exceptions reframed around Sanity fetch rather than Backend API fetch | Ref: CR-20260731-001 (client meeting, Adrian, 2026-07-31) — Marketing site pricing data migrates to Sanity CMS |
| 2026-08-17 | v2.0 | UC_1.8.3 §1 Overview, §3 Pre-conditions, §5 note, §5 items 4/5 (competitor grids), §5 item 7 (Pre-Footer data source), new E_1.8.3.1 + E_1.8.3.7, E_1.8.3.2/3.3/3.5 rewritten, E_1.8.3.6 removed, BR_1.8.3.1/3.2/3.6 rewritten, new BR_1.8.3.8, new UC_1.8.3-7 anchor; UC Index row | (a) Battle cards hardcoded: BR_1.8.3.1 stated "link labels are all hardcoded and not addable/removable via Sanity CMS"; E_1.8.3.2 framed an empty grid as the result of "a future code change"; BR_1.8.3.2 listed the competitor link grids among the fully-hardcoded sections. (b) Pricing on Sanity: per CR-20260731-001, the Pre-Footer CTA's founder seat count/prices were read from Sanity (BR_1.8.3.6, E_1.8.3.5 "Marketing team has not yet updated Sanity", E_1.8.3.6 "founder_count Sanity Fetch Failure") | (a) Competitor link grids renamed battle-card grids and reclassified as the page's sole Sanity-managed element: each card exposes exactly 2 editable fields (display name + link target), cards are freely addable/renamable/reorderable/removable in any quantity, and the frontend auto-lays-out whatever set it receives (new BR_1.8.3.8; new E_1.8.3.7 for large card counts; new E_1.8.3.1 for a Sanity fetch failure on the card set). All other page data — the 2 comparison tables, Ask Three Questions, Why Real Capital Matters — stays hardcoded. (b) All pricing data on this page reverts to hardcode: BR_1.8.3.6 rewritten as a hardcoded-source rule (copy/labels unchanged, only the data source differs), E_1.8.3.5 reframed around a deploy-bound state flip with its longer exposure window stated openly, E_1.8.3.6 marked [Removed] as no Sanity fetch exists to fail. ⚠️ Open item flagged in-doc at §5 item 7: with a hardcoded source there is no runtime State 1→State 2 trigger on this page — needs client confirmation on whether to ship State 1 only | Ref: CR-20260817-002 (client decision relayed by user, BA session, 2026-08-17). Scope confirmed by user: this revert applies only to Comparison Hub — CR-20260731-001 remains in force on every other Marketing page (Homepage Pre-Footer, UC_1.8.1 Trader Advancement table, UC_1.5.2 24-level table, About Us…) |
| 2026-08-17 | v1.9 | UC_1.8.8 new §4.9 (Page-FAQ Mapping — canonical), §4.4 scope note, new E_1.8.8.5, new BR_1.8.8.5; UC_1.8.1 §5 item 10 Sanity-config bullet + BR_1.8.1.7; UC_1.8.2 §5 item 7 bullet + BR_1.8.2.5; UC_1.8.4 §5 item 8 bullet + BR_1.8.4.7; UC_1.8.6 §5.1 item 10 + its Sanity-config bullet, E_1.8.6.7, BR_1.8.6.7; UC Index row for UC_1.8.8 | Every on-page FAQ block was populated by category query: each screen had its own FAQ category and the page rendered "all items tagged with my category" (BR_1.8.1.7 Rules & Parameters; BR_1.8.2.5 a "Trading Floor/Community-relevant category"; BR_1.8.4.7 "this page's relevant category"; BR_1.8.6.7 a per-post category mapping). Nothing described a page-level selection mechanism | Replaced site-wide with per-item selection: Sanity gets a new dedicated settings tab listing every static page with an FAQ block; for each page an editor picks individual items from the single master "All FAQ list", in an arbitrary order, and one item may be reused by any number of pages (stored once, never duplicated). Defined once in the new UC_1.8.8 §4.9 + BR_1.8.8.5 — all consuming UCs now reference it instead of restating a category rule. Category tabs survive only as the Help Center sidebar's own grouping (§4.4 note); the Help Center itself always renders the full master list, independent of the mapping. New E_1.8.8.5 covers a missing/unfetchable page entry. ⚠️ 3 open items flagged in §4.9 for the client: per-page heading override, max item count per page, and behavior when a selected item is deleted from the master list | Ref: CR-20260817-001 (client decision relayed by user, BA session, 2026-08-17) |
| 2026-07-31 | v1.8 | UC_1.8.1 §5 item 1 (Hero Start Associate Track), UC_1.8.1 §5 item 11 (Pre-Footer CTA button fallback), UC_1.8.1 BR_1.8.1.3 (Pre-Footer Price/Copy), UC_1.8.2 §5 item 1 (Join the Associate Track), UC_1.8.2 §5 item 7 (Pre-Footer Start Associate Track), UC_1.8.2 E_1.8.2.4, BR_1.8.2.3; UC_1.8.3 §3 Pre-conditions, §5 item 7 (Pre-Footer Waitlist mode), E_1.8.3.5–3.6, BR_1.8.3.5–3.6; UC_1.8.4 §3 Pre-conditions, §5 item 7/9 (conditional Start the Associate Track/Join the Waitlist), E_1.8.4.5, BR_1.8.4.4; UC_1.8.6 §3 Pre-conditions, E_1.8.6.8, BR_1.8.6.5 | CTA "Join Waitlist" button-mode switching described as reading the cached Global_Var_Allow_New_Signups flag from Backend via ISR/API (MKT-001/MKT-36) | FE team creates a Sanity CMS config variable the Stack Trading team manually updates; FE reads this Sanity variable to decide CTA button text/action. Backend Checkout Gate 1 (UC_2.1.3) real-time enforcement unchanged. Exceptional Flow "API Failure" entries for signup-gate flag reworded to "Sanity variable unavailable/stale". | Ref: CR-20260731-002 (FE Dev team confirmation, relayed by user, 2026-07-31); supersedes MKT-001/MKT-36 display-layer wording. |
Glossary
For all shared project terminology, please refer to the single source of truth: Project Glossary.
Document References
| # | Original Document | Key Sections Used |
|---|---|---|
| 1 | RFQ_ Website and Dashboard Implementation V7.pdf | Marketing — Sitemap, Template System, Comparison and Insights Hub (Media Hub), Community Page Implementation |
| 2 | 3rd_party_integrations_master.md | S12-Sanity, S13-GA4, S22-Cookiebot/Trustpilot, #24-Discord (Server Widget) |
| 3 | QnA_MARKETING_WEBSITE.md | MKT-05, MKT-06, MKT-08, MKT-09, MKT-11, MKT-12, MKT-13, MKT-19, MKT-21, MKT-23, MKT-28, MKT-29, MKT-32, MKT-33, MKT-39 |
UC Index
| Module | UC_ID | Use Case Name | Business Description |
|---|---|---|---|
| Resources | UC_1.8.1 | The Rules Page | In-depth page covering drawdown philosophy (static vs. trailing), payout verification (on-chain/Polygon), per-Level advancement table, Six Rules, failure/recovery flow, rules comparison, and page FAQ (Hardcoded; Table A/B/F; FAQ via Sanity CMS). |
| Resources | UC_1.8.2 | The Trading Floor Page | Community showcase page: Hero, market-open teaser, "Trade the Open" hover cards, public Discord Server Widget ("The Pit"), Pod mentorship compensation explainer, DFW Locals physical desk teaser, role-progression cards, page FAQ, Pre-Footer CTA (Hardcoded; FAQ via Sanity CMS). |
| Resources | UC_1.8.3 | Comparison Hub | Hero ("Conflict of Interest"), "Ask Three Questions" cards, "Stack vs. Paper Trading Firms" / "Stack vs. The Legacy Firms" comparison tables with competitor battle-card grids, "Why Real Capital Matters" cards, Pre-Footer CTA (Hardcoded incl. all pricing; battle cards via Sanity CMS — Ref: CR-20260817-002). |
| Resources | UC_1.8.4 | View Specific Competitor Pages | Hero, Quick Comparison table, tabbed Detailed Comparison, "Business Model Difference" toggle, career-cost table, "The Stack Difference" cards, page FAQ, Pre-Footer CTA (Sanity CMS). (Design status: Checking) |
| Resources | UC_1.8.5 | Insights Hub | Media Library index: Hero (video/image, inline play), category tabs (Trading Education/Firm Updates/Industry Commentary), client-side search, "Most Popular" widget, category rails with arrow navigation, Newsletter registration form with inline success state (Sanity CMS, Klaviyo, ActiveCampaign). |
| Resources | UC_1.8.6 | Detail View (Single Post) | Article/Video detail page — Back button, Video First, Key Takeaways box, Sticky TOC (hover/scroll-spy) with an X · LinkedIn share row at its foot, Start the Associate Track CTA, page-scoped FAQ, "Continue Reading" rail, Newsletter form (Sanity CMS). |
| Resources | UC_1.8.7 | Partners Page | Affiliate program info and "Submit Application" form (parallel APIs + AWS SES). |
| Resources | UC_1.8.8 | Help Center / FAQ | FAQ page with category tabs, client-side search, deep linking logic. Also hosts §4.9 — the canonical page-FAQ mapping model (Sanity settings tab, per-item selection per static page) consumed by every other FAQ block on the site. |
1.8. Resources
UC_1.8.1 — The Rules Page
1. Overview
| Field | Content |
|---|---|
| ID | UC_1.8.1 |
| Use Case | The Rules Page |
| Description | Provides a dedicated, in-depth page explaining Stack Trading's risk/drawdown philosophy (static vs. trailing drawdown), the payout verification process (on-chain/Polygon), the per-Level Trader Advancement progression, the "Six Rules" evaluation framework, the Defense Protocol failure/recovery flow, and a head-to-head rules comparison against industry-standard prop firms. Per the client-confirmed Sanity/hardcoded split (MKT-05), "The Rules" is a natively hardcoded Next.js page; its content is a mix of hardcoded marketing copy and Sanity CMS-configured content, with the page FAQ (Sanity-managed content reused from the shared FAQ collection, MKT-06) and, as of the 2026-07-31 client meeting, the "Trader Advancement Parameters by Level" table (item 5) also Sanity-managed (Ref: CR-20260731-001) rather than backend-sourced. |
| Zapier Flow | — |
| Zapier Table | Table A (Forex Configuration Matrix) / Table B (Futures Configuration Matrix) / Table F (Defense Configuration Matrix) — reference only, for the BA/Marketing team to manually keep the Sanity-configured Trader Advancement table aligned; not fetched by the Marketing site for display (Ref: CR-20260731-001, supersedes prior backend-API sourcing). |
| 3rd Party | Sanity CMS, Polygon PoS (via Alchemy, read-only reference for the verification modal) |
2. Trigger
User navigates to the Rules page (/rules), e.g. via the Resources dropdown, the Footer "The Rules" link, the See the Rules button on the Homepage (Ref: UC_1.3.1), or the See The Rules button on the Career Path page (Ref: UC_1.5.1 §5 "Hero Section").
3. Pre-conditions
- Rules explanatory content (Hero, Trailing Drawdown explainer, Payout process steps, Six Rules cards, Defense flow, Comparison table, Ecosystem cards) is hardcoded in Next.js, consistent with the client-confirmed taxonomy (MKT-05). The page FAQ dataset and, as of CR-20260731-001, the "Trader Advancement Parameters by Level" table are populated in Sanity CMS.
- The "Trader Advancement Parameters by Level" table (Level/Stage, Notional Capital, Profit Target, Max Drawdown, Defense figures) is configured directly in Sanity CMS (Ref: CR-20260731-001); Table A/B/F remain the backend reference the BA/Marketing team must manually keep the Sanity content aligned with, but the Marketing site itself does not fetch them for display.
- Global Header and Footer are retained.
4. Post-conditions
- User views the full Rules page content (drawdown philosophy, payout verification, Level progression table, Six Rules, failure/recovery flow, comparison table, FAQ). This is a read-only page; no data mutation occurs, except for the
Begin Evaluation/Talk to UsCTAs which route the user off-page into Checkout or a mailto action.
5. Basic Flow & UI Rules
-
Hero Section (Hardcoded): Heading "Prop Trading Rules That Protect You, Not Trap You" with supporting subtext.
- Button
Start Associate Track: Click opens the Checkout flow (same tab) via a dedicated Next.js route (Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056), or changes toJoin Waitlist, opening the Waitlist form (same tab), if the Sanity-configured signup-gate variable indicates signups are closed (Ref: CR-20260731-002, supersedesGlobal_Var_Allow_New_Signups = FALSEBackend-flag-driven wording), consistent with BR_1.3.1.4 and the same CTA pattern already described at UC_1.3.1 §5 / UC_1.8.2 §5 item 7.
- Button
-
Institutional Infrastructure: Displays the scrolling logo ticker, Trustpilot Micro Combo widget, and NFA ID text — same block, layout, and marquee motion as the Homepage. Ref: UC_1.3.1 §5 "Institutional Infrastructure & Regulatory Footer" (Motion reference). No hover/click interaction on the Trustpilot widget, consistent with the same rule at UC_1.3.1.
-
"Why Trailing Drawdowns Exist and Why We Don't Use Them" (Hardcoded): Explanatory section with a "Trailing vs. Static Drawdown" comparison chart visual, contrasting the industry-standard trailing drawdown model (drawdown floor rises with every new equity high, silently shrinking a trader's usable risk buffer) against Stack Trading's static drawdown model (the drawdown floor is fixed at the starting balance and never moves). Ties into the "Static Drawdown" and "Zero Artificial Constraints" positioning already introduced on the Homepage (Ref: UC_1.3.1) and the Associate Track's comparison table (Ref: UC_1.4.1 §3 "Zero Artificial Constraints").
-
"How Prop Firm Payouts Work at Stack" (Hardcoded): A numbered step-by-step flow explaining the payout process end-to-end (e.g. "Step 1: Hit Your Profit Target" through the final payout-clearing step). Steps animate in sequentially on scroll (Motion reference).
- Button
View Cryptographic Verification Process: Opens a popup modal titled "Cryptographic Payout Verification", with a close[X]button in the top-right corner. Modal body (static content, confirmed from client wireframe screenshot):"Stack Trading utilizes the Polygon blockchain as a public, immutable receipt printer. When a fiat payout clears our US banking partners, an automated trigger logs the event and the internal bank reference hash to the public network."
"While the blockchain cannot see our bank accounts, it forces us to maintain a permanent, unalterable public record of our operations. As an NFA-registered US entity, this public ledger serves as our ultimate accountability mechanism. We cannot edit, backdate, or delete these records. Every payout is publicly verifiable on an independent block explorer and auditable. This ensures our 100% fulfillment rate is cryptographically secured and permanently auditable, not just a corporate promise."
- This modal follows the same modal documentation pattern as the "How Verification Works" modal already defined for the Live Payout Ledger — Ref: UC_1.3.2 §5 item 7 "How Verification Works (Modal)". Conceptually both refer to the same Polygon PoS / Alchemy on-chain payout logging mechanism.
- Dismissal: closes only via the
[X]button or standard modal-close affordances (overlay click, Esc key); does not auto-close, consistent with BR_1.3.2.4.
- Button
-
"Trader Advancement Parameters by Level" (Sanity CMS Managed, Ref: CR-20260731-001): A table showing the per-Level progression of trading parameters, configured directly in Sanity CMS: Level/Stage, Notional Capital, Profit Target, Max Drawdown ("Market Loss When Stopped"), and (for Levels 9+) Defense Notional Multiplier/Defense Profit Target %/Defense Stop Loss % per Table F. These figures mirror the backend Level-configuration data (Table A — Forex Configuration Matrix / Table B — Futures Configuration Matrix / Table F — Defense Configuration Matrix, Source:
zapier_v7_full.txt§3 Appendix A/B/F) but are no longer fetched from it for display; the BA/Marketing team is responsible for manually keeping the Sanity-authored table aligned with Table A/B/F whenever those change, as there is no automatic sync between Sanity and the Backend/Zapier tables. -
"Prop Firm Trading Rules: Six Rules, No Hidden Clauses" (Hardcoded): Displays 6 rule cards, each with an icon, title, and short description: Static Drawdown (drawdown floor is fixed, never trails equity highs — Ref: item 3 above), The Circuit Breaker (temporarily pauses trading privileges to protect mental capital during a losing streak — Ref: UC_1.5.1 §3 item 5 "We Protect Careers, Not Just Accounts"), No Consistency Rules (no penalty for an outlier winning day, consistent with "Zero Artificial Constraints" — Ref: UC_1.4.1 §3), Overnight and News Trading (permitted, no blackout windows, consistent with the "News Trading Allowed" comparison — Ref: UC_1.4.1 §3), Deterministic Payouts (payout amount/eligibility is rule-based and predictable, not discretionary — Ref: item 4 above), and The 90-Day Standard (per-Level performance clock — trader has a maximum of 90 days to hit the profit target and advance to the next tier, consistent with UC_1.5.1 §3 item 3 "Level 6: Welcome to the Payroll" — "The 90-Day Standard").
- "Radical Transparency" text: Supporting subtext beneath the 6 cards reinforcing the "no hidden clauses" positioning — reuses the same "Radical Transparency" banner copy already used in the Homepage teaser (Ref: UC_1.3.1 §5).
- Button
Read the Full Terms & Conditions: Click navigates (same tab) to the Terms of Service page (/terms-of-service), consistent with UC_1.3.1 §5 and UC_1.8.8 §4.8.
-
"What Happens When You Fail And Why It's Not the End" (Hardcoded): A 4-step explanatory flow describing the failure/recovery path: Didn't Pass the Associate Track (trader failed the evaluation; per Business Rules, must purchase a new Challenge to restart from Level 0 — Ref: Re-Buy, common_rules.md) → Risk Parameters Breached (Daily Loss Limit or Max Drawdown hit on a Live account — Ref: common_rules.md) → Drawdown Defense Activated (for Level 9+ traders: instead of immediate termination, a 48-hour cooling-off period begins — Ref: Defense Protocol, common_rules.md) → Defense Credit Exhausted (trader resumes trading post cooling-off with reduced parameters — capital ×0.25, target 6%, stop 5%, per the Defense Configuration Matrix Table F — Source:
zapier_v7_full.txt§3.4). -
"Prop Firm Rules Comparison: Stack Trading vs Industry Standard" (Hardcoded): A comparison table contrasting Stack Trading's rules against generic industry-standard prop firm rules, structurally consistent with the "Zero Artificial Constraints" comparison table already defined at UC_1.4.1 §3 (Trailing Drawdown vs. Static Floor, Consistency Rule Violation vs. No Outlier Penalty, News Trading Prohibited vs. News Trading Allowed), extended here to cover the full rule set introduced in item 6 above.
-
"Complete Stack Trading Ecosystem" (Hardcoded): Displays 4 cards — Solutions, Use Cases, Strategies, Resources. Cards animate in on scroll (Motion reference).
-
"Prop Trading Rules Frequently Asked Questions" (Sanity CMS Managed): A page-specific FAQ subset (sample questions per wireframe: "What is a static stop loss and how does it work?", "What happens if I hit the daily loss limit at Stack?"). Reuses the identical accordion states, hover, and single-open-at-a-time interaction pattern already defined for the Help Center — Ref: UC_1.8.8 §4.5 "FAQ Accordion — Sanity CMS Managed":
- Collapsed (default): Question text only, dark card background.
- Hover: Subtle highlight (brightness/border change).
- Expanded (clicked): Reveals the Answer content; opening a new item collapses the previously opened one.
- Collapsed again: Clicking an already-expanded item closes it.
- Sanity CMS configuration (Ref: CR-20260817-001): This section renders the FAQ items an editor has explicitly selected for the
rulespage in the Sanity page-FAQ settings tab — Ref: UC_1.8.8 §4.9 "Page-FAQ Mapping". Items are picked one by one from the single master "All FAQ list" (the same collection the Help Center renders), in the editor's chosen order; the same item may also be selected by other pages. This page does not query a category, and does not render the category sidebar. (Superseded: the previous model scoped this block to theRules & Parameterscategory.) - Button
View all FAQs: Click navigates (same tab) to the Help Center / FAQ page (Ref: UC_1.8.8), landing on the default "All" tab (no deep-link/auto-expand is applied from this button, distinct from the deep-link cards described in UC_1.8.8 §4.7).
-
Pre-Footer CTA Card ("Transparent Prop Firm Rules. A Trading Career You Can Trust"): Reuses the identical motion, layout, and founder-promo text-switching behavior as the Homepage's "Stop Gambling. Start Your Career." Pre-Footer CTA — Ref: UC_1.3.1 §5 "Pre-Footer CTA" (Motion reference) — faint text scrolls right-to-left in the background of the card, with the middle text highlighted. Data Source (Ref: CR-20260731-001): The founder seat count and prices used by this card's State 1/State 2 switching logic are configured in Sanity CMS (manually updated by the Marketing team), not fetched from the Backend/DB; see UC_1.3.1 §5 "Pre-Footer CTA" for the full data-source note.
- Layout & Content (State 1: Founder Slots < 500): Glassmorphism box text reads: "Founding member pricing: $499 (normally $650). Every rule above applies from day one." Button text:
Begin Evaluation - \$499. - Layout & Content (State 2: Founder Slots >= 500): Glassmorphism box text reads: "Join the only prop firm built for trader success, not trader failure." Button text:
Begin Evaluation(price removed), consistent with BR_1.3.1.3/BR_1.3.1.4 and the same State 1/State 2 switching logic already defined at UC_1.3.1 §5. - Button
Begin Evaluation - \$499/Begin Evaluation: Click opens the Checkout flow (same tab) (orJoin Waitlist, same tab, if signups are disabled), same race-condition/fallback handling as E_1.3.1.2/E_1.4.1.1/E_1.4.1.2. - Button
Talk to Us: Opens the user's default mail client in a new tab (mailto:support@stacktrading.com), same pattern as the Associate Track page's Pre-Footer CTA — Ref: UC_1.4.1 §7 / BR_1.3.1.2. Includes the same small motion effect running beneath the card container (faint right-to-left scroll text) already described above in this item.
- Layout & Content (State 1: Founder Slots < 500): Glassmorphism box text reads: "Founding member pricing: $499 (normally $650). Every rule above applies from day one." Button text:
6. Exceptional Flows
| Exception ID | Condition | System Handling / Fallback |
|---|---|---|
| E_1.8.1.1 | Sanity CMS API Failure (FAQ) | Next.js fails to fetch the page FAQ content (item 10) from Sanity. All other sections on this page are hardcoded and unaffected. |
| E_1.8.1.2 | Sanity Fetch Failure (Trader Advancement Table) (Ref: CR-20260731-001, supersedes prior "Table A/B/F Fetch Failure") | Next.js fails to fetch the "Trader Advancement Parameters by Level" table content from Sanity CMS. |
| E_1.8.1.3 | Cryptographic Verification Modal Fails to Load | The "Cryptographic Payout Verification" modal content fails to render (e.g. content fetch error). |
| E_1.8.1.4 | Race Condition on 500th Slot (MKT-34) | User views the Pre-Footer CTA with the discounted price/copy because the Sanity-configured founder seat count shows <500. The 500th slot is filled before the user clicks Begin Evaluation - \$499, but the Marketing team has not yet updated Sanity to reflect it. |
| E_1.8.1.5 | founder_count Sanity Fetch Failure (Ref: CR-20260731-001, supersedes prior "founder_count API Failure") | Frontend fails to fetch the founder seat count from Sanity CMS on page load (network error, timeout, or Sanity outage). |
7. Business Rules
| BR_ID | Rule Description |
|---|---|
| BR_1.8.1.1 | Sanity Global Editing Rule (FAQ + Trader Advancement Table): Per the client-confirmed taxonomy (MKT-05), "The Rules" is a hardcoded Next.js page — Sanity CMS on this page is scoped to the page FAQ (item 10), which reuses the shared FAQ collection, and, as of CR-20260731-001, the "Trader Advancement Parameters by Level" table (item 5) and the Pre-Footer CTA's founder seat count/pricing. Within those sections, only text/image/icon/data content is editable via Sanity CMS; the core structural layout (section order, table structures, card grids) elsewhere on the page remains hardcoded in Next.js, consistent with BR_1.3.4.1. |
| BR_1.8.1.2 | Cryptographic Verification Modal Dismissal: The "Cryptographic Payout Verification" modal must be dismissible only via its explicit [X] close button or standard modal-close affordances (overlay click, Esc key), and must not auto-close, consistent with BR_1.3.2.4. |
| BR_1.8.1.3 | Pre-Footer Price/Copy Calculation: The Pre-Footer CTA must dynamically check the Sanity-configured founder seat count (Ref: CR-20260731-001). If slots < 500, display "Founding member pricing: $499 (normally $650). Every rule above applies from day one." with button text Begin Evaluation - \$499. If slots >= 500, display "Join the only prop firm built for trader success, not trader failure." with button text Begin Evaluation, consistent with BR_1.3.1.3/BR_1.3.1.4. |
| BR_1.8.1.8 | Trader Advancement Table Sanity Sourcing (Ref: CR-20260731-001): The "Trader Advancement Parameters by Level" table must source its values from Sanity CMS, not the Backend API. The BA/Marketing team must manually keep the Sanity-authored values aligned with Table A/B/F whenever those backend tables change — there is no automatic sync between Sanity and the Backend/Zapier tables. |
| BR_1.8.1.4 | Mailto Link: The Talk to Us button must trigger a mailto: action with destination support@stacktrading.com, opened in a new tab, consistent with BR_1.3.1.2. |
| BR_1.8.1.5 | Terms & Conditions Navigation: The Read the Full Terms & Conditions button must navigate (same tab) to the Terms of Service page (/terms-of-service), consistent with UC_1.3.1 §5 and UC_1.8.8 §4.8. |
| BR_1.8.1.6 | Comparison Hub Navigation: The Compare Stack to Specific Firms button must navigate (same tab) to the Comparison Hub page, consistent with UC_1.8.3. |
| BR_1.8.1.7 | FAQ Item Selection (Ref: CR-20260817-001, supersedes the prior "FAQ Category Scoping" rule): The on-page FAQ accordion must display exactly the FAQ items selected for this page in the Sanity page-FAQ settings tab, in the editor's configured order — Ref: UC_1.8.8 §4.9/BR_1.8.8.5. It must not query by category and must not render the category sidebar available on the full Help Center page. |
UC_1.8.2 — The Trading Floor Page
1. Overview
| Field | Content |
|---|---|
| ID | UC_1.8.2 |
| Use Case | The Trading Floor Page |
| Description | Provides the "Community Vibe" page template: Hero ("You Are No Longer Trading Alone"), a market-open teaser image, the "Trade the Open" 3-card feature grid, the "Mentorship Driven by Capital, Not Charity" pod-compensation explainer, the "DFW Locals: Trade From HQ" physical-desk teaser, the "From Trader to Leader" role progression cards, a page-scoped FAQ, and a Pre-Footer CTA. Embeds the Discord Server Widget iframe (for "The Pit"). Per the client-confirmed Sanity/hardcoded split (MKT-05), "The Trading Floor" is a natively hardcoded Next.js page, with the sole exception of the page FAQ, which is Sanity-managed content reused from the shared FAQ collection (MKT-06). |
| Zapier Flow | — |
| Zapier Table | — |
| 3rd Party | Discord (Server Widget) |
2. Trigger
User navigates to the Trading Floor page (/trading-floor), e.g. via the Resources dropdown, the Footer "The Trading Floor" link, or the View Community button on the Homepage (Ref: UC_1.3.1).
3. Pre-conditions
- Marketing copy/image/icon content for all sections below (Hero, Trade the Open cards, Mentorship explainer, DFW Locals cards, From Trader to Leader cards, Pre-Footer CTA) is hardcoded in Next.js, consistent with the client-confirmed taxonomy (MKT-05) — except the monetary figures inside the Mentorship and DFW Locals sections, which are Sanity-configured per BR_1.8.2.6. Besides those figures, only the page FAQ dataset is populated in Sanity CMS.
- The Discord server's "the-pit" channel widget is enabled and configured for public embedding (Ref: 3rd_party_integrations_master.md #24).
- Global Header and Footer are retained.
4. Post-conditions
- User views the public Community Vibe showcase and can see live Discord server activity (online count / voice channel activity) via the embedded widget.
- Clicking through the Discord widget or CTA buttons navigates the user off-site (Discord) or into Checkout/Waitlist.
5. Basic Flow & UI Rules
Sanity CMS Scope for this page: Per the client-confirmed taxonomy (MKT-05), "The Trading Floor" is a hardcoded Next.js page — Sanity CMS is scoped to (a) the page FAQ (item 8 below), a filtered view of the shared FAQ collection (MKT-06), and (b) the monetary figures only inside "Mentorship Driven by Capital, Not Charity" (item 5) and "DFW Locals: Trade From HQ" (item 6), per BR_1.8.2.6 — a narrow carve-out from the MKT-05 taxonomy confirmed by the BA. Every other section on this page (Hero, Institutional Infrastructure, Trade the Open, Discord Widget, From Trader to Leader, Pre-Footer CTA), and all non-numeric copy/layout within items 5 and 6, is hardcoded in Next.js and is NOT managed via Sanity CMS. Within the FAQ section itself, Sanity CMS only allows editing content (text, image, icon), consistent with BR_1.3.4.1.
-
Hero Section — "You Are No Longer Trading Alone" (Hardcoded): Heading "You Are No Longer Trading Alone" with supporting subtext: "Retail trading is isolated. Stack Trading operates as an integrated ecosystem of funded professionals. Access live squawk, dedicated Pod mentorship, and real-time market prep, no matter where you live."
- Button
Join the Associate Track: Click opens the Checkout flow (same tab) via a dedicated Next.js route (Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056), or changes toJoin Waitlist, opening the Waitlist form (same tab), if the Sanity-configured signup-gate variable indicates signups are closed (Ref: CR-20260731-002), consistent with BR_1.3.1.4. - Market-Open Teaser Image (right side): Static image captioned "Trade the open with Stack Trading." Contains a small text motion effect: the string "08:00 AM CST — THE OPEN (Live Analysis)" scrolls from left to right across the image.
- Button
-
Institutional Infrastructure: Displays the scrolling logo ticker, Trustpilot Micro Combo widget, and NFA ID text — same block, layout, and marquee motion as the Homepage. Ref: UC_1.3.1 §5 "Institutional Infrastructure & Regulatory Footer" (Motion reference). No hover/click interaction on the Trustpilot widget, consistent with the same rule at UC_1.3.1.
-
"Trade the Open with Stack Trading" (Hardcoded): Section heading with subtext "Windows available to: Associates | Funded | Employed". Displays a 3-card grid, each card following the same hover-reveal interaction as the Leadership Team cards on the About Us page — Ref: UC_1.6.2 §2 item 3 "Card Interaction (Hover Flow)": default state shows the card title only; hover reveals the supporting description text beneath it. Touch devices toggle the reveal state on tap instead of hover, consistent with E_1.6.2.5.
- Live Squawk Box: "Direct audio feed broadcasting breaking news, economic data releases, and institutional order flow chatter." Hover reveal: "React to news immediately instead of waiting for delayed retail headlines."
- The Stack Discord: "Secure, structured community channels segmented by asset class and trader level." Hover reveal: "Real time collaboration with operators who are actually trading live capital."
- Pre Market Prep: "Daily video briefings streamed from our broadcast studio detailing key levels and macro events." Hover reveal: "Start your session with a defined institutional game plan."
-
"Mentorship Driven by Capital, Not Charity" (Hardcoded layout/copy; monetary figures = Sanity, Ref: BR_1.8.2.6): Heading and subtext: "We do not hand you capital and hope you survive. When you pass the Associate Track, you may opt-in to be assigned to a Trading Pod led by a proven Stack Trader. This is not casual advice. We pay our leaders to make you profitable." Includes a motion-animated orbital diagram (Motion reference) showing a central "Pod Leader" node connected to surrounding "Associate Trader" nodes, each linked by an animated "$" bounty-payout icon, with a "Total Class Earnings: $15,750" summary card.
- "The Math" subsection: "We are entirely transparent about our compensation. A standard Pod Leader manages up to 7 Traders. As you hit your profit targets and advance, your mentor earns direct cash bounties. To ensure they are invested in your long-term survival, these fees accrue and are paid out in tranches. They receive a $250 payout when you reach Level 3, a $500 payout when you reach Level 5, and a massive $1,500 payout when you prove your independence by reaching Level 7." Highlighted callout below: "A mentor earns up to $2,250 for every single trader they successfully guide to graduation. Their W-2 income is directly tied to your profitability." (Motion reference)
- 3 supporting info blocks (icon + title + description), no hover interaction specified: Aligned Incentives ("Your success pays your mentor. They actively monitor your metrics to catch psychological tilt before it hits your daily stop."), Weekly Reviews ("Direct, ruthless breakdown of your week's executions, risk management, and sizing. Weekly Pod Team Meeting."), Scaling Strategy ("Collaborative planning on exactly how to attack the profit target to reach your W-2 transition at Level 6.").
-
"DFW Locals: Trade From HQ" (Hardcoded layout/copy; desk prices = Sanity, Ref: BR_1.8.2.6): Heading and subtext: "Stack Trading is a capitalized, onshore firm headquartered in Frisco, Texas. If you are local to the Dallas Fort Worth metroplex, you can upgrade your digital environment to a physical trading desk at our live trading floor." Includes a motion effect (Motion reference). Displays 2 pricing cards:
- The Associate Desk: "$800/month" / "3 month minimum". Eligibility: "Trading History Review Required. Limited Availability. Contact Us for More Details." The Setup: "Dedicated physical desk, CME Level 2 or Institutional Forex data, Platform access, Trade with Peers, and Friday BBQ."
- The Stack Trader Desk (badged "The Goal"): "$0/month" / "Firm absorbs all costs". Eligibility: "W-2 Level 6 and Above". The Setup: "The firm absorbs all overhead as a dedicated business expense. Includes opportunities to be featured in official Stack Trading media, recurring interviews and marketing segments for our top operators."
- Bottom subtext: "Reach Level 8 to earn your permanent desk at headquarters—zero cost, just execution."
-
"From Trader to Leader" (Hardcoded): Heading "From Trader to Leader" with subtext "Prove your edge. Get funded with real capital. Build a career." Displays 3 role-progression cards (icon + title + short description, no hover interaction specified per wireframe): Trader ("Join a pod, learn from your leader"), Pod Member ("Contribute to pod discussions, share trade reviews"), Pod Leader ("Lead your own pod of 7 traders from their success"). These 3 roles are the same Trading Pod progression already introduced at UC_1.5.1 §3 item 4 "Community, Not Competition".
- Button
Explore the Career Path: Click navigates (same tab) to the Career Path page (Ref: UC_1.5.1).
- Button
-
"Trading Floor Questions" (Sanity CMS Managed): A page-specific FAQ subset (sample questions per wireframe: "Do I need to be a funded trader to access The Trading Floor?", "Is Pod mentorship mandatory or optional?"). Reuses the identical accordion states, hover, and single-open-at-a-time interaction pattern already defined for the Help Center — Ref: UC_1.8.8 §4.5 "FAQ Accordion — Sanity CMS Managed":
- Collapsed (default): Question text only, dark card background.
- Hover: Subtle highlight (brightness/border change).
- Expanded (clicked): Reveals the Answer content; opening a new item collapses the previously opened one.
- Collapsed again: Clicking an already-expanded item closes it.
- Sanity CMS configuration (Ref: CR-20260817-001): Renders the FAQ items an editor has explicitly selected for the
trading-floorpage in the Sanity page-FAQ settings tab — Ref: UC_1.8.8 §4.9 "Page-FAQ Mapping". Items are picked individually from the single master "All FAQ list", in the editor's chosen order, and may be shared with other pages. This page does not query a category and does not render the category sidebar. (Superseded: the previous model scoped this block to a Trading Floor/Community category.) - Button
View all FAQs: Click navigates (same tab) to the Help Center / FAQ page (Ref: UC_1.8.8), landing on the default "All" tab.
-
Pre-Footer CTA Card ("Trade Global, Grow the Same Way"): Reuses the identical motion and layout as the Homepage's "Stop Gambling. Start Your Career." Pre-Footer CTA — Ref: UC_1.3.1 §5 "Pre-Footer CTA" (Motion reference) — faint text scrolls right-to-left in the background of the card, with the middle text highlighted. Subtext: "Whether you are logging in from London or sitting in our Frisco headquarters, the capital backing and the payout structure are exactly the same. Prove your edge, scale to Level 6, and earn your career."
- Button
Start Associate Track: Click opens the Checkout flow (same tab), or changes toJoin Waitlist, opening the Waitlist form (same tab), if the Sanity-configured signup-gate variable indicates signups are closed (Ref: CR-20260731-002), consistent with BR_1.3.1.4.
- Button
6. Exceptional Flows
| Exception ID | Condition | System Handling / Fallback |
|---|---|---|
| E_1.8.2.1 | Sanity CMS API Failure (FAQ) | Next.js fails to fetch the page FAQ content (item 8) from Sanity. All other sections on this page are hardcoded and unaffected. |
| E_1.8.2.2 | Discord Widget Fetch/Load Failure | The Discord Server Widget iframe fails to load (Discord API/network error, or widget disabled server-side). |
| E_1.8.2.3 | Institutional Infrastructure / Trustpilot Widget Fetch Failure | The ticker/Trustpilot micro-combo block (item 2) reuses the same fetch logic as UC_1.3.1. |
| E_1.8.2.4 | Sanity Signup-Gate Variable Unavailable / Stale (CR-20260731-002, supersedes prior "API Failure" framing) | Frontend fails to fetch the Sanity signup-gate config variable on page load, or the Stack Trading team has not yet updated it to reflect the current Backend state, for any of the page's CTA buttons (Join the Associate Track, Start Associate Track). |
7. Business Rules
| BR_ID | Rule Description |
|---|---|
| BR_1.8.2.1 | Public Widget Only (No Authenticated Community Features): This public marketing page only embeds the read-only Discord Server Widget iframe ("The Pit") and static hardcoded teaser copy for the "Trade the Open" cards, Mentorship, and DFW Locals sections. Live Broadcast Player, Live Chat Feed, Pod Mentorship data (GET /community/my-pod), and the live Newsquawk audio stream are exclusive to the authenticated Dashboard Community Page and are NOT rendered here. |
| BR_1.8.2.2 | Sanity Global Editing Rule (FAQ only): Per the client-confirmed taxonomy (MKT-05), Sanity CMS on this page is scoped solely to the page FAQ (item 8); only text/image/icon content within that section is editable via Sanity CMS. The core structural layout and all other sections (section order, card counts/grids, widget position) remain hardcoded in Next.js, consistent with BR_1.3.4.1. |
| BR_1.8.2.3 | Checkout/Waitlist Consistency (CR-20260731-002): All CTA buttons on this page that open the Checkout flow (Join the Associate Track in the Hero, Start Associate Track in the Pre-Footer CTA) must read the Sanity-configured signup-gate variable; if it indicates signups are closed, button text changes to Join Waitlist and routes to the Waitlist Lead Capture form instead of Checkout, consistent with BR_1.3.1.4. |
| BR_1.8.2.4 | Career Path Navigation: The Explore the Career Path button must navigate (same tab) to the Career Path page, consistent with UC_1.5.1. |
| BR_1.8.2.5 | FAQ Item Selection (Ref: CR-20260817-001, supersedes the prior "FAQ Category Scoping" rule): The on-page FAQ accordion must display exactly the FAQ items selected for this page in the Sanity page-FAQ settings tab, in the editor's configured order — Ref: UC_1.8.8 §4.9/BR_1.8.8.5. It must not query by category and must not render the category sidebar available on the full Help Center page. |
| BR_1.8.2.6 | Pod Bounty & Desk Pricing Figures Are Sanity-Configured: The monetary figures inside "Mentorship Driven by Capital, Not Charity" (§5 item 5) and "DFW Locals: Trade From HQ" (§5 item 6) are Sanity CMS fields, editable without an engineering deploy — specifically: the Pod Leader Carry tranche bounties ($250 at Level 3, $500 at Level 5, $1,500 at Level 7), the "Total Class Earnings: $15,750" summary card, the "$2,250 for every single trader" highlighted callout, and the two desk prices (Associate Desk $800/month, Stack Trader Desk $0/month). This is a deliberate carve-out from the MKT-05 "Trading Floor is fully hardcoded" taxonomy, confirmed by the BA — it narrows, but does not otherwise replace, the page-level hardcode classification in BR_1.8.2.4 and the §5 Sanity-scope note. Scope is values only: all surrounding copy, the orbital motion diagram, card layout, eligibility text, and "The Setup" bullet lists remain hardcoded, consistent with BR_1.3.4.1. The bounty figures must stay consistent with the Pod Leader Carry values documented in the Dashboard-side Level-Up flow, which are sourced from the same Zapier tables. |
UC_1.8.3 — Comparison Hub
1. Overview
| Field | Content |
|---|---|
| ID | UC_1.8.3 |
| Use Case | Comparison Hub |
| Description | Provides the Comparison Hub page: a "Conflict of Interest" hero, an "Ask Three Questions" framework, two head-to-head comparison tables ("Stack vs. Paper Trading Firms" and "Stack vs. The Legacy Firms") each with a competitor battle-card grid, a "Why Real Capital Matters" explainer, and a founder-promo Pre-Footer CTA ("Done Comparing? Start Trading"). Per the client-confirmed Sanity/hardcoded split (MKT-05), the Comparison Hub index is a natively hardcoded Next.js page, distinct from the Sanity-driven Competitor Comparison matrix pages (Ref: UC_1.8.4) that it links out to. This page has no embedded FAQ collection. As of CR-20260817-002 there is exactly one Sanity-managed element on this page — the battle cards in the two competitor grids (card name + link target, addable/removable, auto-laid-out by the frontend, Ref: BR_1.8.3.8); all pricing data on this page, including the Pre-Footer CTA's founder seat count/price, reverts to hardcode (CR-20260817-002 partially supersedes CR-20260731-001 for this page only — every other Marketing page keeps its Sanity pricing). |
| Zapier Flow | — |
| Zapier Table | — |
| 3rd Party | — |
2. Trigger
User navigates to the Comparison Hub page (/compare), e.g. via the Header Resources dropdown's "Compare" item (Ref: UC_1.1.1 §6 "Resources Dropdown"), the Footer "Compare" column (Ref: UC_1.1.1 §6 "Footer"), or the Compare Stack to Specific Firms button on the Rules page (Ref: UC_1.8.1 §5 item 8).
3. Pre-conditions
- Hero, "Ask Three Questions" cards, comparison-table row content, and "Why Real Capital Matters" cards are hardcoded in Next.js, consistent with the client-confirmed taxonomy (MKT-05).
- The competitor battle cards in both grids (§5 items 4/5) are authored in Sanity CMS — each card carries a display name and a link target (Ref: CR-20260817-002, BR_1.8.3.8).
- Individual competitor pages (UC_1.8.4) exist and are published in Sanity CMS for each battle card rendered in the grids.
- Global Header and Footer are retained.
- The founder seat count and both prices ($499 / $650) used by the Pre-Footer CTA's promo-price logic are hardcoded in Next.js (Ref: CR-20260817-002) — this page does not read the Sanity founder-count/pricing config used on the other Marketing pages.
4. Post-conditions
- User understands Stack Trading's differentiation from both "Casino"-style simulated-capital firms and legacy/Tier-1 prop firms, can jump directly to either comparison table, click through to any listed competitor comparison page, and enter the Checkout flow (or Join Waitlist) from any of this page's CTA buttons.
5. Basic Flow & UI Rules
Hardcoded Page — one Sanity carve-out: Per the client-confirmed taxonomy (MKT-05), the Comparison Hub index is built natively in Next.js. This is distinct from the individual Competitor Comparison matrix pages it links out to (Ref: UC_1.8.4), which ARE Sanity CMS-driven. Unlike UC_1.8.1/UC_1.8.2, this page has no embedded FAQ collection. Sanity CMS on this page is scoped to exactly one thing: the competitor battle cards in the two grids (items 4 and 5) — name + link target only, per BR_1.8.3.8 (Ref: CR-20260817-002). Everything else — Hero, "Ask Three Questions" cards, both comparison tables (rows, cell values, highlight text), "Why Real Capital Matters" cards, and all pricing data including the Pre-Footer CTA's founder seat count/prices — is hardcoded in Next.js and changeable only by a dev deploy.
-
Hero ("The Prop Industry is a Conflict of Interest") (Hardcoded): Heading text: "The Prop Industry is a Conflict of Interest." Subtext: "Simulated capital. Payout delays. Trailing drawdowns. We built the antidote."
- Button
Earn Your Seat: Click opens the Checkout flow (same tab) via a dedicated Next.js route (Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056), orJoin Waitlist(same tab) if signups are disabled, consistent with BR_1.3.1.4. - Button
Jump to Comparison Matrix: Click smooth-scrolls the page down to the "Stack vs. Paper Trading Firms" table (§5 item 4) on the same page (in-page, no navigation); no navigation/route change occurs.
- Button
-
Institutional Infrastructure: Displays the scrolling logo ticker, Trustpilot Micro Combo widget, and NFA ID text — reuses the identical motion and widget behavior already defined at UC_1.3.1 §5 (Motion reference).
-
"When Comparing Prop Firms, Ask Three Questions": Section heading with right-aligned subtext: "If they can't answer these, you aren't a trader — you're the product." and a
Begin Your Evaluationbutton.- Button
Begin Your Evaluation: Click opens the Checkout flow (same tab), orJoin Waitlist(same tab) if signups are disabled, consistent with BR_1.3.1.4. - Card 1 — "Is the Capital Real?": "If the firm never deploys real money, their business model relies on your failure. At Stack, you trade DMA real capital the moment you pass."
- Card 2 — "Are You A Prop Trader Or Just Highly Leveraged?": "Legacy firms often require expensive mandatory training or a $5,000+ risk deposit just to get in the door. If you are depositing your own money to cover first losses, you are simply a retail trader paying for leverage. Stack operates a true meritocracy with zero capital contribution. You bring the talent, we bring the capital."
- Card 3 — "Is There a Career — Or Just a Transaction?": "Most prop firms offer a one-time evaluation and a profit split. There's no progression, no employment, no long-term relationship. Ask: what happens after I'm funded? At Stack, you're on a path to W-2 employment."
- Button
-
"Stack vs. Paper Trading Firms" (Comparison Table + Link Grid) (Hardcoded): Section subtext: "You cannot build a professional trading career on simulated profits. The retail prop space is flooded with unregulated entities operating out of offshore tax havens that gamble against you on your inevitable failure. Stack Trading operates with US banking, enforces rigorous compliance standards, and provides direct market access the moment you pass. We capture the market's alpha, not endless evaluation fees." Highlight text: "Stop Playing Against The House. We Monetize Your Success."
-
Table (Feature | Simulated Prop Firms | Stack Trading):
Feature Simulated Prop Firms Stack Trading Payouts Manual review, chance of pay for marketing purposes Automated cycle processed when you hit target Employment Status None W-2 + Benefits (Health/Dental) Execution B-Book / Internal Desk Full DMA (Post Challenge) Trader Recourse None. Good luck suing an offshore entity Full legal protection under US law Drawdown Defense Account Blown Yes (Account Protection) Regulation Majority Unregulated / Grey List NFA / CFTC Registered Market Data Simulated B-Book Feed, CME L1 routed by them Institutional-Raw Forex, CME L2 routed by the firm Trading Platform Weekly proprietary or pay for real EMS ATAS, Quantower, MT5, Motivewave, NinjaTrader, etc. paid for by the firm Membership None or Limited Pod Membership Max National Capped, Unknown, or Simulated Scale to $75M -
Competitor Battle-Card Grid ("Compare Stack to Individual Casino Firms") — Sanity CMS Managed (Ref: CR-20260817-002, BR_1.8.3.8): Current cards per wireframe —
Stack vs Topstep,Stack vs FTMO,Stack vs Apex,Stack vs Lucid— but the card set is not fixed: editors can add, rename, reorder, or remove cards in Sanity without a deploy, and the frontend auto-lays-out whatever number of cards exists (4 today, 20+ if the editor adds them). Each card routes (same tab) to that competitor's dedicated page — Ref: UC_1.8.4.
-
-
"Stack vs. The Legacy Firms" (Comparison Table + Link Grid) (Hardcoded): Section subtext: "Both Stack and legacy firms offer the same destination: a professional career path backed by real institutional capital. The difference is the toll booth. Historically, accessing a true prop floor required an Ivy League pedigree, a trust fund, or a mandatory training course from a friend or colleague. Even if your deposit exceeds $25,000, you're still the one taking the risk. At Stack, you don't pay to cover your own losses — you bring the edge, we bring the firm." Highlight text: "Why pay to work? We pay you to perform."
-
Table (Barrier to Entry | Legacy Prop (SMB, Maverick, etc.) | Stack Trading):
Barrier to Entry Legacy Prop (SMB, Maverick, etc.) Stack Trading Capital Deposit $5,000 to $25,000+ $0.00 Training Cost $2,000 to $10,000+ Upfront Fees Included (Unlocked) Mandatory Desk Fees $200 to $1,000+ / Month $0.00 (Optional desk fee for Frisco, TX Office) Location Physical Office Often Required Remote Digital Floor or Frisco, TX Office Loss Liability Trader Absorbs First Losses (Varies) Firm Absorbs Losses Licenses Required (IE, Series 57 Required (Equities)) None Required (Futures & Forex) Getting a Seat Ivy League Recruitment or Cash Buy-in Prove your edge to earn your seat -
Competitor Battle-Card Grid ("Compare Stack to Legacy Firms") — Sanity CMS Managed (Ref: CR-20260817-002, BR_1.8.3.8): Current cards per wireframe —
Stack vs Maverick,Stack vs SMB,Stack vs T3— same editable/auto-layout behavior as the grid in item 4. Each card routes (same tab) to that competitor's dedicated page — Ref: UC_1.8.4.
-
-
"Why 'Real Capital' Matters" (Hardcoded): Section subtext: "The difference between simulated capital and real capital isn't just operational — it changes the firm's entire incentive structure."
- Card 1 — "Simulated Capital Model": Bulleted copy contrasting a fee-driven, failure-incentivized business model (the firm profits from evaluation fees and trader failure, not trading performance).
- Card 2 — "Real Capital Model (Stack)": Bulleted copy contrasting an aligned-incentive model (the firm profits when the trader profits; rules manage risk rather than manufacture failure; leads to a W-2 career path with benefits).
-
Pre-Footer CTA Card ("Done Comparing? Start Trading"): Reuses the identical motion as the Homepage's "Stop Gambling. Start Your Career." Pre-Footer CTA — Ref: UC_1.3.1 §5 "Pre-Footer CTA" (Motion reference) — faint text scrolls right-to-left in the background of the card, with the middle text highlighted. Data Source (Ref: CR-20260817-002, supersedes CR-20260731-001 for this page): The founder seat count and both prices used by this card's State 1/State 2 switching logic are hardcoded in Next.js — this page does not read the Sanity founder-count/pricing config. Consequence: switching this card from State 1 to State 2 requires a dev deploy, unlike UC_1.3.1/UC_1.8.1 where Marketing flips it in Sanity. ⚠️ BA note (needs client confirmation): the two states below are retained as the documented design, but with a hardcoded source there is no runtime switching trigger on this page — Marketing must raise a dev request when the 500th seat fills. Confirm whether this page should instead ship only State 1 until a deploy changes it.
- Layout & Content (State 1: Founder Slots < 500): Glassmorphism box text reads: "Founding member pricing: $499 (normally $650). Real capital. Simple rules. A career path." Button text:
Begin Evaluation - \$499. - Layout & Content (State 2: Founder Slots >= 500): Glassmorphism box text reads: "Join the only prop firm built for trader success, not trader failure." Button text:
Begin Evaluation(price removed), consistent with BR_1.3.1.3/BR_1.3.1.4 and the same State 1/State 2 switching logic already defined at UC_1.3.1 §5/UC_1.8.1 §5 item 11. - Button
Still Have Questions: Click navigates (same tab) to the Help Center / FAQ page — Ref: UC_1.8.8. - Button
Begin Evaluation - \$499/Begin Evaluation: Click opens the Checkout flow (same tab) (orJoin Waitlist, same tab, if signups are disabled), same race-condition/fallback handling as E_1.3.1.2/E_1.4.1.1/E_1.4.1.2.
- Layout & Content (State 1: Founder Slots < 500): Glassmorphism box text reads: "Founding member pricing: $499 (normally $650). Real capital. Simple rules. A career path." Button text:
-
"All Comparisons" Link: Consistent with the Footer's "Compare" column rule, the Hub must expose a way to view the full competitor list — Ref: UC_1.1.1 §4 Footer (Footer "Compare" column max 6 items + "All Comparisons" link, Source: MKT-23).
6. Exceptional Flows
| Exception ID | Condition | System Handling / Fallback |
|---|---|---|
| E_1.8.3.1 | Sanity CMS Fetch Failure (Battle Cards) (Ref: CR-20260817-002) | Next.js fails to fetch the battle-card set for either grid from Sanity (network error, timeout, or Sanity outage). |
| E_1.8.3.2 | Zero Battle Cards Configured in a Section | The Sanity-authored card list for either the "Paper Trading Firms" or "Legacy Firms" grid is empty (editor removed all cards, or none published yet). |
| E_1.8.3.3 | Competitor Page Not Yet Published (Broken Link) | A battle card in either grid points to a competitor page (UC_1.8.4) that has not yet been published in Sanity CMS. |
| E_1.8.3.4 | Institutional Infrastructure / Trustpilot Widget Fetch Failure | The ticker/Trustpilot micro-combo block (§5 item 2) reuses the same fetch logic as UC_1.3.1. |
| E_1.8.3.5 | Race Condition on 500th Slot (MKT-34) (Ref: CR-20260817-002 — reframed around hardcoded pricing) | User views the Pre-Footer CTA with the discounted price/copy because this page's hardcoded founder-pricing state still shows State 1. The 500th slot is filled before the user clicks Begin Evaluation - \$499, and no deploy has yet flipped the page to State 2. |
| E_1.8.3.6 | No longer applicable: this page's founder seat count/pricing is hardcoded, so there is no Sanity fetch that can fail. The equivalent exception remains live on the Sanity-driven pages — Ref: E_1.8.1.5/E_1.4.1.2. | |
| E_1.8.3.7 | Large Battle-Card Count (Auto-Layout) (Ref: CR-20260817-002) | An editor adds far more cards than the wireframe's 4/3 (e.g. 20+) to either grid. |
7. Business Rules
| BR_ID | Rule Description |
|---|---|
| BR_1.8.3.1 | Two Comparison Tables Structure: The Comparison Hub must always render exactly two comparison tables — "Stack vs. Paper Trading Firms" and "Stack vs. The Legacy Firms" — each with its own fixed row set, highlight text, and dedicated competitor battle-card grid. Row labels/order and table cell values are hardcoded and not addable/removable via Sanity CMS. The battle cards inside the two grids are the exception — they are Sanity-authored and freely addable/removable (Ref: BR_1.8.3.8, CR-20260817-002). |
| BR_1.8.3.2 | Hardcoded Content: Per the client-confirmed taxonomy (MKT-05), all sections on the Comparison Hub index page (Hero, "Ask Three Questions" cards, comparison tables, "Why Real Capital Matters" cards, and all pricing data including the Pre-Footer CTA's founder seat count/prices) are hardcoded in Next.js and are NOT managed via Sanity CMS, consistent with BR_1.8.7.3. The sole exception is the competitor battle-card grids, per BR_1.8.3.8. As of CR-20260817-002 this page is explicitly carved out of CR-20260731-001's Marketing-wide pricing→Sanity migration; that CR remains in force everywhere else. This is distinct from the individual Competitor Comparison matrix pages (Ref: UC_1.8.4) that this page links to, which ARE Sanity CMS-driven. |
| BR_1.8.3.3 | Footer "Compare" Column Cap (MKT-23): Consistent with UC_1.1.1 — the Footer's "Compare" column displays a maximum of 6 items plus an "All Comparisons" link routing back to this Hub. |
| BR_1.8.3.4 | Jump-to-Anchor Scroll: The Jump to Comparison Matrix button must perform an in-page smooth scroll (in-page, no navigation) to the "Stack vs. Paper Trading Firms" table anchor; it must not trigger a route change or full page reload. |
| BR_1.8.3.5 | Checkout/Waitlist Consistency (CR-20260731-002): Every button on this page that opens the Checkout flow (Earn Your Seat, Begin Your Evaluation, Begin Evaluation - \$499/Begin Evaluation) must read the Sanity-configured signup-gate variable and switch to Join Waitlist, routing to the Waitlist Lead Capture form when signups are closed, consistent with BR_1.3.1.4. |
| BR_1.8.3.6 | Pre-Footer Price/Copy — Hardcoded on This Page (Ref: CR-20260817-002, supersedes the CR-20260731-001 wording for UC_1.8.3 only): The Pre-Footer CTA's seat count and both price points are hardcoded in Next.js — the frontend must not read the Sanity founder-count/pricing config here. State 1 (< 500 slots) displays "Founding member pricing: $499 (normally $650). Real capital. Simple rules. A career path." with button text Begin Evaluation - \$499; State 2 (>= 500) displays "Join the only prop firm built for trader success, not trader failure." with button text Begin Evaluation. Copy/labels stay identical to BR_1.3.1.3/BR_1.3.1.4; only the data source differs, and moving between the two states requires a code deploy (see the ⚠️ BA note at §5 item 7). |
| BR_1.8.3.7 | FAQ Navigation: The Still Have Questions button must navigate (same tab) to the Help Center / FAQ page, consistent with UC_1.8.8. |
| BR_1.8.3.8 | Battle Cards Are Sanity-Configured (Ref: CR-20260817-002): Each competitor battle card in the two grids (§5 items 4/5) is a Sanity CMS entry exposing exactly two editable fields — display name (e.g. "Stack vs Topstep") and link target (the UC_1.8.4 competitor page slug). Editors may add, rename, reorder, or remove cards at will, in any quantity, without an engineering deploy; the frontend must auto-lay-out whatever card set it receives (wrapping to additional rows as needed, per E_1.8.3.7) rather than assuming the wireframe's 4+3 count. Scope is strictly the cards: no other Comparison Hub data becomes Sanity-editable — card styling, grid heading text, the two comparison tables, and all other page content remain hardcoded, consistent with BR_1.3.4.1's "content is Sanity-editable, structural layout is hardcoded" split. |
UC_1.8.4 — View Specific Competitor Pages
⚠️ Design Status: Checking. Per the WBS, this UC's wireframe mapping is still under client Q&A confirmation (status "Checking" — client note: "Đang Q&A với khách, nma có vẻ là màn này vì thấy để tiêu đề keyword 'Static vs Trailing Drawdown' ở màn Nav Bar"). This section should be re-validated against the final client-confirmed wireframe screens before development sign-off.
1. Overview
| Field | Content |
|---|---|
| ID | UC_1.8.4 |
| Use Case | View Specific Competitor Pages |
| Description | Displays a direct, named-competitor comparison page (e.g., "Stack Trading vs Topstep"): a Hero, a "Quick Comparison" summary table, a tabbed "Detailed Comparison" data table, a tabbed "Business Model Difference" narrative section, a career-cost comparison table, "The Stack Difference" cards, a page-scoped FAQ, and a Pre-Footer CTA. Content is a mix of Sanity CMS-managed copy and hardcoded comparison-table structure. |
| Zapier Flow | — |
| Zapier Table | — |
| 3rd Party | Sanity CMS |
2. Trigger
User navigates to a specific competitor page (e.g., /compare/topstep) by clicking a competitor link from the Comparison Hub's link grid (Ref: UC_1.8.3 §5 item 4/5), the Footer "Compare" column, or the Global Header Resources Dropdown's "Featured Article" slot (Ref: UC_1.1.1).
3. Pre-conditions
- Hero copy, Quick/Detailed Comparison table row content, Business Model Difference narrative, career-cost table, "Stack Difference" card copy, and FAQ items are populated in Sanity CMS.
- Global Header and Footer are retained.
- The Sanity-configured signup-gate variable is available for the Pre-Footer CTA's checkout-vs-waitlist button logic (Ref: CR-20260731-002).
4. Post-conditions
- User understands Stack Trading's feature, business-model, and career-cost differentiation against the named competitor, and can enter the Checkout flow (or Join Waitlist), jump to the Rules page, or reach the FAQ page from this page's CTA buttons.
5. Basic Flow & UI Rules
Sanity CMS Scope for this page: Consistent with BR_1.3.4.1, Sanity CMS on this page only allows editing content (text, image, icon) within the existing layout below. It cannot add/remove sections, change section order, add/remove table rows or tabs, or alter the structural layout — this applies per-competitor (each competitor slug reuses the same fixed template).
-
Hero ("Stack Trading vs Topstep: Two Business Models, One Decision"): Heading text follows the pattern "Stack Trading vs. [Competitor]: Two Business Models, One Decision". Subtext: "Both firms want to fund traders. The difference is in the capital, structure, and what happens after you get funded."
- Button
Start Level-Based Funding: Click opens the Checkout flow (same tab) via a dedicated Next.js route (Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056), orJoin Waitlist(same tab) if signups are disabled, consistent with BR_1.3.1.4. - Button
View the Rules: Click navigates (same tab) to the Rules page — Ref: UC_1.8.1.
- Button
-
Institutional Infrastructure: Displays the scrolling logo ticker, Trustpilot Micro Combo widget, and NFA ID text — reuses the identical motion and widget behavior already defined at UC_1.3.1 §5 (Motion reference).
-
"Stack vs. [Competitor] Quick Comparison" (Sanity CMS, hardcoded row set): Section subtext: "Every claim is based on publicly available information. We update this matrix quarterly." Single non-tabbed summary table (Feature | [Competitor] | Stack Trading), rows: Capital Type, Drawdown Type, Career Path, Risk Protection, Payout Speed, Employment Status, Evaluation Cost, Platform.
Feature Topstep Stack Trading Capital Type Simulated / proprietary platform Institutional (Real) via DMA Drawdown Type Trailing (follows your equity high) Static (does not trail) Career Path No structured career path 24 levels → W-2 employment Risk Protection Daily loss limit + trailing drawdown Circuit Breaker + static stops Payout Split Up to 90% (after first $10K at 100%) Up to 90% Employment Status 1099 independent contractor W-2 at Level 6+ Evaluation Cost ~$49–165/month subscription (Recurring) $499 Founding / $650 Standard Platform Topstep proprietary + TSTrader Rithmic / Trading Technologies -
"Stack vs. [Competitor] Detailed Comparison" (Sanity CMS, hardcoded tab set): Section subtext: "Every claim is based on publicly available information. We update this matrix quarterly." A 4-tab switcher —
Risk Management/Execution & Infrastructure/Trading Rules/Career & Payouts— each tab swaps the visible comparison table (Feature | [Competitor] | Stack Trading) without a full page reload.-
Tab Hover/Interaction Flow: On desktop/pointer devices, hovering over a non-active tab applies a subtle highlight state (background lightens slightly) as a click affordance, distinct from the darker "active/selected" tab background already shown in the wireframe; the table content does not change on hover, only on click/tap. Clicking a tab commits the switch and immediately swaps the table below to that tab's row set. On touch devices (no true hover state), tapping a tab directly performs the switch, consistent with the touch-fallback pattern already defined at E_1.4.1.4 for hover-only interactions.
-
Business Model tab table (confirmed from screenshot, Feature | Topstep | Stack Trading):
Feature Topstep Stack Trading Evaluation Cost $49–165/month subscription One-time fee (projected $150–500) Ongoing Cost After Funding None (subscription ends at funding) None Reset Policy Monthly re-subscription One-time reset options Primary Revenue Source Evaluation fees and subscriptions Profit splits from funded traders Revenue From Trader Failure Failed traders re-subscribe None Payout Method ACH, Wire ACH, Wire, Crypto options Footnote text: "Follow the money. Stack's only revenue from funded traders comes from profit splits on real capital. Topstep's lower monthly cost ($49 to $165) makes it genuinely more accessible for traders testing the waters. Stack's model is designed for traders ready to commit to a career path with real capital."
-
Career Development tab table (confirmed from screenshot, Feature | Topstep | Stack Trading):
Feature Topstep Stack Trading Progression System No structured progression 24 defined levels Employment Status Independent contractor (1099) W-2 employee at Level 6+ Base Salary No Yes (Level 6+) Health Benefits No Yes (Level 6+) PTO No Yes (Level 6+) Mentorship Community forums Pod Leadership (Level 10+) Maximum Capital Fixed allocation tiers $50M+ notional (Partner level) Footnote text: "This is where the two models diverge most dramatically. Topstep is a funded account program where funded status is the ceiling. Stack is a career path with progression through 24 levels toward W-2 employment, Pod Leadership, and Partner status managing institutional capital."
-
Risk Management tab table (confirmed from screenshot, Feature | Topstep | Stack Trading):
Feature Topstep Stack Trading Maximum Drawdown Trailing (rises with equity high) Static (does not move) Drawdown Amount (50K account) $2,000 trailing $3,000 static floor End of Day Reset Trailing resets to EOD equity high Drawdown does not adjust at EOD Daily Loss Limit $1,000, hard stop $1,000, triggers Circuit Breaker Circuit Breaker Behavior N/A (account can fail) Account pauses until next session Loss Limit on Account Status Can contribute to account failure No impact, come back tomorrow Consistency Rules Profit consistency requirements None Footnote text: "Stack's risk management is designed around capital preservation and trader development. Static drawdowns give traders the same room on day 30 as day 1. The Circuit Breaker treats a bad day as a pause, not a failure. Topstep's trailing drawdown is a tighter model that reduces room as traders profit, which statistically increases the probability of account failure over time."
-
-
"The Business Model Difference: How Stack and Topstep Make Money": Heading with subtext: "Understanding how a prop firm generates revenue reveals whose interests it is designed to serve. Topstep and Stack represent two fundamentally different approaches." A 2-option toggle —
Topstep's Model/Stack's Model— swaps a two-column narrative+visual panel below.- Tab Hover/Interaction Flow: Same hover/click/touch behavior as the Detailed Comparison tabs in §5 item 4 above — hovering the inactive option applies a subtle highlight affordance without switching content; clicking (or tapping, on touch devices per E_1.4.1.4) commits the switch to that model's panel.
- "Stack's Model" panel (confirmed from screenshot): Left column heading "Stack: The Capital Allocation Model" with body text: "Stack's revenue from funded traders comes from profit splits on real capital. The firm puts real money behind your trades with Direct Market Access to CME. When you profit, the firm takes its share of the split. When you lose, the firm loses. There is no reset fee revenue. There is no monthly subscription after evaluation." followed by: "Static drawdowns reflect this alignment directly. Your drawdown floor on day 30 is the same as day 1. The firm has no financial incentive for the floor to tighten because account failures do not generate revenue. The Circuit Breaker locks your account at the daily loss limit without failing it because preserving your account preserves the firm's investment in your development." — a highlighted callout box reads: "Stack's 24-level career path is the structural proof that the firm's incentives are aligned with yours. It would make no sense to build a progression system from Associate to Partner if the business model depended on traders failing out and restarting." — closing paragraph: "The trade-off is accessibility. Stack's one-time evaluation fee (projected $150 to $500) is higher than Topstep's monthly entry point. Stack's rules, while fairer for serious traders, assume a level of discipline and readiness that not every trader has yet. This is by design." Right column: a static visual card showing an "Eval fee $150–500" chip, a "Stack Trading" badge, and a "Static drawdown floor" mini equity-curve chart (Day 1 room = Day 30 room), consistent conceptually with the Static Drawdown card already defined at UC_1.8.1 §5 item 6.
- "Topstep's Model" panel (confirmed from screenshot): Left column heading "Topstep: The Subscription Model" with body text: "Topstep generates revenue through monthly evaluation subscriptions ($49 to $165/month depending on account size) and from traders who fail and re-subscribe. The model is straightforward: more evaluations sold equals more revenue, regardless of whether those traders eventually succeed." followed by: "This is not inherently predatory. The low monthly cost makes Topstep genuinely accessible. A trader who is unsure about prop trading can test the waters for $49/month with no long-term commitment. That accessibility has value, and Topstep has built a large community around it." — a highlighted callout box reads: "Credit where it is due: Topstep popularized the idea that retail traders could access prop firm capital without putting up $25K+ of their own money. That opened the door for an entire generation of traders." — closing paragraph: "The tension appears in the rules. Trailing drawdowns move your risk floor up every time your equity reaches a new high. After a winning streak, your remaining room shrinks permanently. A normal losing streak that would have been survivable on day 1 can fail your account on day 15 because the floor has trailed up. Statistically, this increases the probability of eventual account failure, which means another evaluation subscription." Right column: a static visual card showing a "Monthly subscriptions $49 to $165/month" chip, a "TOPSTEP" badge, and a "Trailing drawdown floor" mini equity-curve chart (How shrinking room leads to failure).
-
"What This Means for Your Trading Career" (career-cost table, confirmed from screenshot): Section subtext: "The difference between running a business and investing in a career. Stop paying monthly rent on your trading floor." Table (Feature | Topstep | Stack Trading):
Feature Topstep Stack Trading Evaluation Fee $49 to $149 Monthly $0 One-Time Funded Activation Fee $149 One-Time $0 Professional Platform Fee (e.g. NinjaTrader, Rithmic) $34 to $88 Monthly $0 (Firm Covered) DME Level 2 Data $34.25 Monthly $0 (Firm Covered) Total Cost at Month 1 $182 to $382+ $0 Total Cost at Month 6 $1,092 to $2,292+ $0 Total Cost at Month 12 $2,184 to $4,584+ $0 -
"The Stack Difference": Section heading with 3 static feature cards below (icons + short labels legible in screenshot: e.g. "Static Drawdown Floor", "24-Level Career Path", "Circuit Breaker") reinforcing the differentiators already established in §5 items 4–5, consistent with the "Six Rules, No Hidden Clauses" card pattern at UC_1.8.1 §5 item 6.
- Button:
Join the WaitlistorStart the Associate Track— this button's label is conditional on signup mode: it displaysStart the Associate Trackunder normal operation, and switches toJoin the Waitlistonly when the Sanity-configured signup-gate variable indicates signups are closed (Ref: CR-20260731-002, supersedesGlobal_Var_Allow_New_Signups = FALSEBackend-flag-driven wording), consistent with BR_1.3.1.4. Click opens the Checkout flow (same tab) via a dedicated Next.js route (Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056), or the Waitlist Lead Capture form (same tab, waitlist mode), accordingly.
- Button:
-
"Prop Trading Rules Frequently Asked Questions":
- Sanity CMS configuration (Ref: CR-20260817-001): This section renders the FAQ items an editor has explicitly selected for this competitor page in the Sanity page-FAQ settings tab — Ref: UC_1.8.8 §4.9 "Page-FAQ Mapping" — picked individually from the single master "All FAQ list", in the editor's chosen order, not by category query. (Superseded: the previous model scoped this block to a "Rules & Parameters"/"Comparisons" category.) ⚠️ Each competitor slug is a separate page entry in the mapping tab, so different competitor pages can (and normally will) show different item sets. Click-to-expand interaction on each question card follows the identical accordion pattern already defined at UC_1.8.8 §4.5 (Collapsed → Hover → Expanded → Collapsed-again, single-open-at-a-time).
- Button
View all FAQs: Click navigates (same tab) to the Help Center / FAQ page (Ref: UC_1.8.8), landing on the default "All" tab (no deep-link/auto-expand applied from this button, distinct from the deep-link cards described in UC_1.8.8 §4.7).
-
Pre-Footer CTA Card ("Ready to Trade Real Capital With Rules That Make Sense?"): Reuses the identical motion, layout, and small scrolling background text as the Homepage's "Stop Gambling. Start Your Career." Pre-Footer CTA — Ref: UC_1.3.1 §5 "Pre-Footer CTA" (Motion reference) — faint text scrolls right-to-left in the background of the card, with the middle text highlighted.
- Button:
Join the WaitlistorStart the Associate Track— same conditional label logic as §5 item 7 above: displaysStart the Associate Trackunder normal operation, switches toJoin the Waitlistonly when the Sanity-configured signup-gate variable indicates signups are closed (Ref: CR-20260731-002), consistent with BR_1.3.1.4. Click opens the Checkout flow (same tab) or the Waitlist Lead Capture form (same tab, waitlist mode) accordingly, same race-condition/fallback handling as E_1.3.1.2/E_1.4.1.1/E_1.4.1.2.
- Button:
-
SEO Article-Depth Copy (Sanity CMS): Supporting long-form text sections interspersed between the tables/tabs above to satisfy SEO content-depth requirements, per the original "Product Battle Card" style requirement — Source: RFQ_ Website and Dashboard Implementation V7.pdf, "The Specific Competitor Pages (Template 07)" — content requires the SEO text depth of a full article, but must NOT be laid out like a blog post; Data Tables and tabbed sections are used to break up the content instead of long-form prose blocks.
6. Exceptional Flows
| Exception ID | Condition | System Handling / Fallback |
|---|---|---|
| E_1.8.4.1 | Sanity CMS API Failure | Next.js fails to fetch Hero, Quick/Detailed Comparison table content, Business Model Difference narrative, career-cost table, "Stack Difference" card copy, or FAQ data from Sanity. |
| E_1.8.4.2 | Unpublished / Non-Existent Competitor Slug | User navigates directly to a competitor URL slug that does not exist in Sanity CMS (e.g., typo, unpublished draft). |
| E_1.8.4.3 | Detailed Comparison / Business Model Difference Tab Content Missing | The competitor's Sanity entry has an empty/missing payload for one of the 4 Detailed Comparison tabs, or for either side of the Business Model Difference toggle. |
| E_1.8.4.4 | Institutional Infrastructure / Trustpilot Widget Fetch Failure | The ticker/Trustpilot micro-combo block (§5 item 2) reuses the same fetch logic as UC_1.3.1. |
| E_1.8.4.5 | Sanity Signup-Gate Variable Unavailable / Stale (CR-20260731-002, supersedes prior "API Failure" framing) | Frontend fails to fetch the Sanity signup-gate config variable on page load, or the variable has not yet been updated by the Stack Trading team. |
7. Business Rules
| BR_ID | Rule Description |
|---|---|
| BR_1.8.4.1 | Non-Blog Layout Constraint: Regardless of SEO copy depth, competitor pages must use Data Tables, Winner Banners, and Feature Matrices as the primary content-breaking mechanism — a continuous blog-post-style long-form layout is not permitted. |
| BR_1.8.4.2 | Sanity Global Editing Rule: Only text/image/icon content (hero copy, table cell values, FAQ text) is editable via Sanity CMS; the core structural layout (section order, table/tab structure, card grids) remains hardcoded in Next.js and applies uniformly to every competitor slug, consistent with BR_1.3.4.1. |
| BR_1.8.4.3 | Design Confirmation Pending: This UC's exact screen mapping is in "Checking" status pending client Q&A confirmation of the wireframe. Any discrepancy between this document and the final confirmed wireframe must be resolved in favor of the client-confirmed wireframe once available. |
| BR_1.8.4.4 | Checkout/Waitlist Consistency (CR-20260731-002): Every button on this page that opens the Checkout flow (Start Level-Based Funding, and the conditional Start the Associate Track/Join the Waitlist button in §5 items 7 and 9) must read the Sanity-configured signup-gate variable and switch to Join the Waitlist, routing to the Waitlist Lead Capture form when signups are closed, consistent with BR_1.3.1.4. |
| BR_1.8.4.5 | Tab/Toggle Content Swap Without Reload: Both the Detailed Comparison's 4-tab switcher (§5 item 4) and the Business Model Difference 2-option toggle (§5 item 5) must swap their content panel client-side without a full page reload or route change. |
| BR_1.8.4.6 | Rules Page Navigation: The View the Rules button must navigate (same tab) to the Rules page, consistent with UC_1.8.1. |
| BR_1.8.4.7 | FAQ Item Selection and Navigation (Ref: CR-20260817-001, supersedes the prior "FAQ Category Scoping" rule): The on-page FAQ accordion must display exactly the FAQ items selected for this competitor page in the Sanity page-FAQ settings tab, in the editor's configured order — Ref: UC_1.8.8 §4.9/BR_1.8.8.5; category queries are not used. The View all FAQs button must navigate (same tab) to the Help Center / FAQ page, consistent with UC_1.8.8. |
UC_1.8.5 — Insights Hub
1. Overview
| Field | Content |
|---|---|
| ID | UC_1.8.5 |
| Use Case | Insights Hub |
| Description | Provides the Insights Hub index page — a "Media Library" (Netflix/Slack Resources-style), high-visual layout with a Hero (video, clickable to play inline), a category tab bar (All / Trading Education / Firm Updates / Industry Commentary) with a client-side search box, a "Most Popular" widget, horizontal rails per category with arrow navigation, and a Newsletter registration form (Invalid email state, inline success state). Data is fetched from Sanity CMS; Newsletter submissions go to BOTH Klaviyo and ActiveCampaign. |
| Zapier Flow | — |
| Zapier Table | — |
| 3rd Party | Sanity CMS, Klaviyo, ActiveCampaign |
2. Trigger
User navigates to the Insights Hub page (/insights), e.g. via the Header Resources dropdown's "Insights" item (Ref: UC_1.1.1 §6 "Resources Dropdown"), the Footer "Resources" column (Ref: UC_1.1.1 §6 "Footer"), or the View all News button on the Homepage (Ref: UC_1.3.4)/Trading Floor page (Source: MKT-11). All entry points route in the same tab.
3. Pre-conditions
- Article/video entries (Blog posts, Video Library) are populated in Sanity CMS, each tagged to one of the three categories (
Trading Education/Firm Updates/Industry Commentary). - Global Header and Footer are retained.
4. Post-conditions
- User can browse (via category tab, search, or rail scroll) and click into any listed article/video to reach its Detail View (UC_1.8.6).
- On successful Newsletter submission, the user's email is registered with BOTH Klaviyo and ActiveCampaign, a confirmation/welcome email is sent automatically by Klaviyo, and an inline success state is shown on the card.
5. Basic Flow & UI Rules
Sanity CMS Scope for this page: Consistent with BR_1.3.4.1, Sanity CMS on this page only allows editing content (post entries, text, images, icons) within the existing layout below. It cannot add/remove sections, change section order, add/remove/rename the category tabs, or alter the structural layout (Hero, tab bar, "Most Popular" widget, rail mechanism, Newsletter card).
5.1 Hub / Index Layout
- Concept — Media Library (Source: RFQ_ Website and Dashboard Implementation V7.pdf, "Insights Hub Page (Index)"): The page is not a traditional blog index — it is built as a high-visual Media Library (Netflix / Slack Resources-style) using a Hero, a category tab bar with search, a "Most Popular" widget, and horizontal rails, rather than a vertical list.
- Hero — Featured Slot ("Stack Trading Insights"): A large featured slot at the top of the page highlighting the latest entry (Sanity CMS-managed selection), with a category badge (e.g. "Marketing Analysis") shown top-right of the panel. The featured entry may be a video or a static image, per its Sanity entry type.
- Video entry: A center play-button overlay is shown on the thumbnail. Clicking the play button plays the video inline on this same screen (the embedded player replaces/overlays the thumbnail in place) — this is in-page playback, not a navigation.
- Image entry: Clicking anywhere on the hero panel navigates (same tab) to that post's Detail View page (UC_1.8.6), consistent with the rail card click behavior in item 6 below.
- "Most Popular" Widget: Below the Hero, renders a stacked/layered card visual representing the top-ranked entries, with left/right circular arrow buttons beneath it to cycle through the ranked entries one at a time. Arrow hover/click behavior follows the same pattern defined for the category rails in item 7 below. The ranking mechanism is manually curated by the Admin via Sanity CMS. There is no post-count cap (no Sanity setting to limit the number of entries) — the widget loads and cycles through every entry the Admin has curated.
- Category Tabs & Search: Directly below the Hero/"Most Popular" widget, a tab bar renders four tabs —
All(default active) /Trading Education/Firm Updates/Industry Commentary— alongside a client-side search input box.- Tab click: Selecting a category tab client-side filters the rails below to show only that category's rail (a single rail with its cards); selecting
Allrestores all three category rails in a fixed order (Trading Education,Firm Updates,Industry Commentary). Switching tabs does not trigger a page navigation/reload, consistent with the tab-switch pattern at UC_1.8.8 §4.4. - Search: The search box performs a live, client-side substring match against post titles across all categories, independent of which tab is currently active. Typing a query replaces the category rails below with a single
Results for "[query]"section — a static grid (no rail/arrow navigation) listing every matching card across all three categories, using the same card design as §5.1 item 6. Clearing the search box restores the previously active tab's rail view.
- Tab click: Selecting a category tab client-side filters the rails below to show only that category's rail (a single rail with its cards); selecting
- Zero Search Results: If the query matches no post title in any category, the
Results for "[query]"section shows the empty-state message "No articles found. Try a different search term." in place of the grid. - Category Rails — Trading Education / Firm Updates / Industry Commentary (Sanity CMS, shown when no search query is active): Each rail shows 3 cards visible at a time per the wireframe, but loads all published posts of that category (no post-count cap/no Sanity setting to limit the number of posts) — the user reaches the remaining posts via the rail's arrow navigation (§5.1 item 7). Each card displays a cover image/video thumbnail, category label, title, short description snippet, and either a "X min read" badge (article/image-type post) or a play-button overlay + duration badge (e.g., "12:42") for video-type posts — consistent with the general card-data pattern already defined at UC_1.3.4 §5.
- Card click: Clicking any rail card (video or article type) navigates (same tab) to that post's Detail View page (UC_1.8.6) — unlike the Hero's video (item 2 above), rail cards never play inline.
- Card hover: Hovering over a card triggers a slight lift/scale effect (Ref: UC_1.3.4 §5).
- Arrow Slider Behavior: Both the "Most Popular" widget and the category rails share the same horizontal slider mechanism. Left/right arrows are positioned below or to the sides of the visible cards.
- Click: Shifts the visible card set horizontally. The slider shifts 1 card at a time.
- Disabled State: When shifted to the extreme left (first card) or right (last card), the corresponding arrow becomes dimmed/disabled (cannot scroll further in that direction), consistent with standard carousel patterns.
5.2 Newsletter Registration Form
-
Placement: Rendered as a dedicated block on the Insights Hub page (per WBS description).
-
Field (Ref: CR-09 §9.1 Email Field):
Field Type Placeholder Constraint Email * Textbox "Enter email" Max 100 characters. Must match [local-part]@[domain].[tld]. Auto-trim leading/trailing spaces on out-click. -
Validation Rules & Error Messages (Ref: CR-09 §9.1, validation timing: on out-click):
Condition Error Message Left blank "Please enter email" Invalid format "Please enter a valid email address" Exceeds 100 characters "Email must not exceed 100 characters" -
Button:
Subscribe— disabled until the email field passes validation. On click, executes the submission flow (see §5.3). -
Card Container Motion: The "Subscribe to Our Future Newsletter" card container reuses the identical background motion as the Homepage's "Stop Gambling. Start Your Career." Pre-Footer CTA — Ref: UC_1.3.1 §5 "Pre-Footer CTA" (Motion reference): a faint background gradient-blur text scrolls right-to-left with the middle text highlighted, and a separate small continuous marquee text row runs right-to-left underneath, consistent with the Pre-Footer CTA's "Subtext Motion" (Ref: UC_1.3.1 §5). The background text displays:
"NFA, CFTC, Risk Disclosure, Privacy Policy"with center icons.
5.3 Newsletter Submission Flow
- Client-side Validation: If the email fails validation → display inline red error message below the field per §5.2.3 (red border on the input, as shown in the wireframe's invalid-email state: e.g.,
user@invalid.com→ "Please enter a valid email address"). No API call is made; theSubscribebutton remains disabled. - Klaviyo and ActiveCampaign Submission: On a valid email, clicking
Subscribedisables the button and shows a loading state while the frontend pushes the email (with UTM parameters) directly to BOTH the Klaviyo and ActiveCampaign APIs — this bypasses the Zapier/BE middleware, consistent with the Newsletter/Waitlist email-handling rule (Source: MKT-19, MKT-21, MKT-41). - Klaviyo-Side Processing: Klaviyo fires the
Future_Newsletter_Welcome(Ref: KLA-02) event against the subscriber's profile and automatically sends a welcome/confirmation email from the Klaviyo-managed email flow tied to that event (no AWS SES / backend email service is involved). - Success State (Inline Swap): On a successful API response, the email input +
Subscribebutton row is replaced in place, within the same card container by a pill-shaped element reading "You are subscribed!" with a green checkmark icon — this is not a separate corner Toast/popup, and no page navigation occurs. - Post-Success Field State: Once the success pill is shown, the email field and
Subscribebutton are not restored on the same page load; a page refresh/revisit renders the form in its default (non-subscribed) state, since subscription status is not tracked client-side.
6. Exceptional Flows
| Exception ID | Condition | System Handling / Fallback |
|---|---|---|
| E_1.8.5.1 | Sanity CMS API Failure (Hub Content) | Next.js fails to fetch the Hero, "Most Popular" widget, or rail content from Sanity. |
| E_1.8.5.2 | Zero Articles Published in a Rail | Sanity CMS returns an empty array for a given category rail. |
| E_1.8.5.3 | Zero Search Results | The user's search query does not match any post title in any category. |
| E_1.8.5.4 | Category Tab With No Published Posts | A category tab (Trading Education / Firm Updates / Industry Commentary) has zero published posts. |
| E_1.8.5.5 | Hero Entry Missing / Unpublished | Sanity CMS has no entry marked as the featured Hero selection. |
| E_1.8.5.6 | Newsletter — Invalid Email State | User enters an email that fails the CR-09 format/length checks and clicks out of the field or clicks Subscribe. |
| E_1.8.5.7 | Newsletter — CRM API Failure / Network Error (Ref: TE-SYS-01) | Either direct API call (Klaviyo or ActiveCampaign) fails (network error, 5xx, or timeout). |
| E_1.8.5.8 | Newsletter — Duplicate Email | The email submitted is already an active subscriber. |
7. Business Rules
| BR_ID | Rule Description |
|---|---|
| BR_1.8.5.1 | Media Library Layout: The Insights Hub index must use a Hero + category-tab-bar-with-search + "Most Popular" widget + horizontal-rail layout (not a traditional vertical blog list). |
| BR_1.8.5.2 | Newsletter Bypasses Middleware (MKT-19, MKT-21, MKT-41): The Newsletter form submits the email + UTM parameters directly to BOTH the Klaviyo and ActiveCampaign APIs from the frontend (dual-send). It does not route through the Node.js backend middleware or AWS SES. |
| BR_1.8.5.3 | Email Field Rules Follow CR-09: The Newsletter email field's placeholder, max length (100 chars), character rules, and validation-error copy must follow CR-09 §9.1 exactly, overriding the generic CR-02 textbox defaults. |
| BR_1.8.5.4 | Sanity Global Editing Rule: Only text/image/icon content (rail cards, Hero, tab labels) is editable via Sanity CMS; the core structural layout (Hero, tab bar, "Most Popular" widget, rail mechanism, Newsletter card) remains hardcoded in Next.js, consistent with BR_1.3.4.1. |
| BR_1.8.5.5 | Category Taxonomy Fixed: The three content categories (Trading Education, Firm Updates, Industry Commentary) plus the All tab are hardcoded; Sanity CMS can tag a post into an existing category but cannot create, rename, or remove a category. |
| BR_1.8.5.6 | Search Is Client-Side and Cross-Category: The search box filters already-fetched post titles client-side (no server round-trip per keystroke) and matches across all three categories regardless of the currently active tab, per §5.1 item 4. A non-empty query replaces the rails with a single static Results for "[query]" grid (no arrow navigation); clearing the query restores the rail view. |
| BR_1.8.5.7 | Newsletter Success Is Inline, Not a Corner Toast: The Newsletter card's success state must render as an in-card pill ("You are subscribed!" + green checkmark) replacing the input/button row in place, per §5.3 item 4 — not the top-right corner Toast pattern used elsewhere on the site. |
| BR_1.8.5.8 | No Post-Count Cap: Neither the "Most Popular" widget nor the category rails have a Sanity setting to limit the number of posts/entries — all curated (Most Popular) or published (rails) entries are loaded, with arrow navigation as the only mechanism to reach entries beyond the visible set. |
UC_1.8.6 — Detail View (Single Post Page — Article/Video)
1. Overview
| Field | Content |
|---|---|
| ID | UC_1.8.6 |
| Use Case | Detail View (View Single Post Page — Article/Video) |
| Description | Renders the Single Post detail page following Siege Media's "Reco (Article)" structure: a Back button, Video First (YouTube embed at top) or a static image for text-only posts, a "Key Takeaways" box, a Sticky Table of Contents with scroll-spy highlighting and an X/LinkedIn share row at its foot, an author/metadata block, a mid-page Start the Associate Track CTA, a page-scoped FAQ accordion, a "Continue Reading" rail, and a Newsletter registration form at the bottom of the content. Content is fetched via Sanity CMS. |
| Zapier Flow | — |
| Zapier Table | — |
| 3rd Party | Sanity CMS, YouTube (embed), Klaviyo, ActiveCampaign |
2. Trigger
User clicks an article/video card from the Insights Hub (UC_1.8.5), the "From The Trading Floor" carousel (Ref: UC_1.3.4), or navigates directly to a post's URL slug (e.g., /insights/[slug]).
3. Pre-conditions
- The post's content (video ID, Key Takeaways text, body content, Table of Contents structure, related content, FAQ tags) is populated in Sanity CMS.
- Global Header and Footer are retained.
- The Sanity-configured signup-gate variable is available for the
Start the Associate TrackCTA's checkout-vs-waitlist logic (Ref: CR-20260731-002).
4. Post-conditions
- User reads/watches the full post content, may click through to the FAQ, "Continue Reading" posts, or the Associate Track checkout flow (or Join Waitlist), may share the post to X or LinkedIn, and may subscribe via the bottom Newsletter form.
5. Basic Flow & UI Rules
Reference: Siege Media's Best Practices, "Reco (Article)" approach (Source: RFQ_ Website and Dashboard Implementation V7.pdf, "The Single Post Page (Article/Video)").
Sanity CMS Scope for this page: Consistent with BR_1.3.4.1, Sanity CMS on this page only allows editing content (post text, images, video ID, icons) within the single template layout described below. It cannot add/remove sections, change section order, or alter the structural layout — this applies uniformly to every post slug (whether Trading Education, Firm Updates, or Industry Commentary).
5.1 Post Layout — Reco (Article) Structure
BackButton (top of page, above the H1): Click uses the browser's native history (router.back()), navigating (same tab) the user back to the Insights Hub index page (Ref: UC_1.8.5) and restoring the Hub's exact prior state (active category tab, search query, and scroll position) as the user left it, rather than resetting to the Hub's defaultAlltab/top-of-page state.- Fallback (no prior history entry): If the user arrived at this Detail View directly (e.g. deep link, new tab, external referrer) and there is no browser history entry to return to,
Backfalls back to a hardcoded link to/insights, landing on the Hub's defaultAlltab with no search query applied.
- Fallback (no prior history entry): If the user arrived at this Detail View directly (e.g. deep link, new tab, external referrer) and there is no browser history entry to return to,
- Hero — Video or Image: Below the
Backbutton and page title (example title shown in wireframe: "Static vs Trailing Drawdown: The Complete Guide"), the featured media renders as either a YouTube video embed or a static image, depending on the post's Sanity content type — consistent with the same video/image duality already defined for Hub cards (Ref: UC_1.8.5 §5.1 item 2).- Video posts: A YouTube embed is rendered at the top of the page, above/alongside the H1 title. The embed follows the same parameter pattern as the Dashboard's Live Broadcast Player (
?rel=0&modestbranding=1, restricting suggested videos to the firm's channel and hiding the YouTube logo) — Ref: 3rd_party_integrations_master.md. - Image posts: The hero renders a static image in the same layout position; no embed/play controls are shown.
- Video posts: A YouTube embed is rendered at the top of the page, above/alongside the H1 title. The embed follows the same parameter pattern as the Dashboard's Live Broadcast Player (
- "Key Takeaways" Box: A distinct background-colored block placed immediately under the H1/Video, summarizing the post's key points in a scannable bulleted list (optimized for Featured Snippets). Content is authored in Sanity CMS.
- Companion card (confirmed from screenshot): Alongside the Key Takeaways box, a secondary card renders a CTA (e.g., "Ready to Trade Static Drawdown?") with a
Start The Associate Trackbutton — see §5.1 item 8 for this button's checkout/waitlist behavior, and a "Related content" mini-list (e.g., "Static vs Trailing", "Leverage Prop Trading", "Swing Trading Prop Firm") linking to other posts, using the same click-to-Detail-View behavior as the "Continue Reading" rail (§5.1 item 9).
- Companion card (confirmed from screenshot): Alongside the Key Takeaways box, a secondary card renders a CTA (e.g., "Ready to Trade Static Drawdown?") with a
- Left Rail (Table of Contents): A sticky left sidebar displaying the article's
h2/h3headings as a vertical list. The active section heading (the section currently intersecting the viewport) receives a distinct "active" visual treatment (e.g., color change, font weight, or indicator line), differentiated from the standard hover state (specific visual details to be determined by FE dev/Design). Clicking a heading smooth-scrolls the page to that section. The rail's foot carries the Share row (item 7). - Body Content (Sanity CMS rich text): Main article body, rendered below/alongside the Key Takeaways box and Table of Contents rail. Structured with intermediate callout/example cards (e.g., "Pro Tip", "Did You Know?", side-by-side comparison table, "Best For You" cards, "Real-World Example" scenario cards, "The Bottom Line" summary) per the article's Sanity-authored content blocks.
- Author/Metadata Block: Publication date, read time, and author info (avatar, name, role) — consistent with the card metadata pattern used on the Hub (Ref: UC_1.8.5 §5.1 item 6).
- Social Share Row (X · LinkedIn): A
Share:label followed by two icon buttons — X and LinkedIn — at the foot of the Sticky TOC rail (§5.1 item 4). Both share the post's own URL (/insights/<slug>) and open in a new tab. No Discord icon and no Copy Link control on this screen (Ref: BR_1.8.6.6).- X: Opens X's post composer in a new tab, pre-filled with the post title and the post URL. The user edits and publishes the post inside X.
- LinkedIn: Opens LinkedIn's share dialog in a new tab with the post URL. LinkedIn builds the preview card (image, title, description) from the post page itself. The user adds their own comment and publishes inside LinkedIn.
Start The Associate TrackButton (mid-page CTA, per §5.1 item 3's companion card, and/or repeated elsewhere in the body): Click opens the Checkout flow (same tab) via a dedicated Next.js route (Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056), or the Waitlist Lead Capture form (same tab, waitlist mode) if signups are disabled, consistent with BR_1.3.1.4.- "Continue Reading": A rail of other posts (confirmed from screenshot: 3 cards shown, e.g. "What is a Funded Trading Account?", "What is Combine?", "What is Static Drawdown?"), each showing a cover image, title, and author info (avatar, name, role) — same card-data pattern as the Hub's rails (Ref: UC_1.8.5 §5.1 item 6). This section is Sanity CMS-managed (content only; the rail mechanism/layout is fixed).
- Card click: Clicking a "Continue Reading" card navigates (same tab) to that post's own Detail View page (this same UC, re-rendered for the new slug).
- Card hover: Hovering over a card triggers a slight lift/scale effect, consistent with UC_1.3.4 §5 "Interaction (Cards)"/UC_1.8.5 §5.1 item 6.
- Arrow Navigation: Left/right circular arrow buttons below the rail (confirmed from screenshot) navigate through additional "Continue Reading" posts beyond the initial 3 shown. Hover and click behavior are identical to the Hub's rail arrows — Ref: UC_1.8.5 §5.1 item 7 "Rail Arrow Navigation": hovering over either arrow changes its opacity/color as a hover affordance; clicking the right arrow shifts the visible cards left with a smooth slide animation, revealing the next card(s); clicking the left arrow shifts in the opposite direction; each arrow disables/hides once the rail reaches its respective end.
- Frequently Asked Questions (Sanity CMS Managed): A page-specific FAQ subset drawn from the same master FAQ list used on the Help Center page, populated by per-item selection for this post in the Sanity page-FAQ settings tab (Ref: CR-20260817-001, UC_1.8.8 §4.9) — consistent with the FAQ-subset pattern already defined at UC_1.8.1 §5 item 10/UC_1.8.4 §5 item 8. Reuses the identical accordion states, hover, and single-open-at-a-time interaction pattern already defined for the Help Center — Ref: UC_1.8.8 §4.5 "FAQ Accordion — Sanity CMS Managed":
- Collapsed (default): Question text only, dark card background.
- Hover: Subtle highlight (brightness/border change).
- Expanded (clicked): Reveals the Answer content, smoothly animating the accordion panel open (height transition); opening a new item collapses the previously opened one.
- Collapsed again: Clicking an already-expanded item closes it, smoothly animating the panel shut.
- Sanity CMS configuration (Ref: CR-20260817-001): This section renders the FAQ items an editor has explicitly selected for this post in the Sanity page-FAQ settings tab — Ref: UC_1.8.8 §4.9 "Page-FAQ Mapping". Items are picked one by one from the single master "All FAQ list", in the editor's chosen order, and may be reused by any other page. (Superseded: the previous model had the editor pick a category per post and rendered every item in it.) The category sidebar is never rendered here.
5.2 Newsletter Registration Form (Bottom of Content)
Placed at the bottom of the post content, per the WBS description, below the FAQ section. Uses the identical field, validation, and submission behavior — including the card container's Pre-Footer-CTA-style motion — as the Insights Hub's Newsletter form. Ref: UC_1.8.5 §5.2 and §5.3 in full:
- Email field per CR-09 §9.1 (placeholder "Enter email", max 100 chars, format regex, auto-trim), with the same 3 validation error messages.
- Card container motion identical to the Pre-Footer CTA ("Stop Gambling. Start Your Career.") — Ref: UC_1.3.1 §5 "Pre-Footer CTA"/UC_1.8.5 §5.2 item 5: faint background text scrolling right-to-left with the middle text highlighted, plus a separate small marquee text row running underneath.
- Direct dual-send submission to BOTH Klaviyo and ActiveCampaign bypassing the Zapier/BE middleware per MKT-19/MKT-21/MKT-41, firing the
Future_Newsletter_Welcome(Ref: KLA-02) event and triggering Klaviyo's automatic welcome/confirmation email. - Success state renders as the same inline in-card pill ("You are subscribed!" + green checkmark, replacing the input/button row in place) — not the corner Toast TS-01 — per UC_1.8.5 §5.3 item 4, consistent with BR_1.8.6.3's identical-behavior requirement below.
6. Exceptional Flows
| Exception ID | Condition | System Handling / Fallback |
|---|---|---|
| E_1.8.6.1 | Sanity CMS API Failure (Post Content) | Next.js fails to fetch the post's content from Sanity. |
| E_1.8.6.2 | Unpublished / Non-Existent Post Slug | User navigates directly to a post URL slug that does not exist or is unpublished in Sanity CMS. |
| E_1.8.6.3 | Post Has No Associated Video | The Sanity entry for this post has no video ID (i.e., it is an image-type post). |
| E_1.8.6.4 | YouTube Embed Load Failure | The YouTube iframe fails to load (network error, video removed/private). |
| E_1.8.6.5 | Table of Contents — No Sections Defined | The post body has fewer than 2 headings, so no meaningful Table of Contents can be generated. |
| E_1.8.6.6 | Zero "Continue Reading" Posts Available | Sanity CMS returns an empty/insufficient array for the "Continue Reading" rail (e.g., this is the only published post). |
| E_1.8.6.7 | Zero Page-Scoped FAQ Items (Ref: CR-20260817-001) | This post's entry in the Sanity page-FAQ settings tab has no items selected, or the entry does not exist yet. |
| E_1.8.6.8 | Start The Associate Track — Sanity Signup-Gate Variable Unavailable / Stale (CR-20260731-002) | Frontend fails to fetch the Sanity signup-gate config variable on page load, or the variable has not yet been updated. |
| E_1.8.6.9 | Newsletter — Invalid Email / API Failure / Duplicate Email | Same conditions as E_1.8.5.6 / E_1.8.5.7 / E_1.8.5.8. |
7. Business Rules
| BR_ID | Rule Description |
|---|---|
| BR_1.8.6.1 | Sticky TOC Never Hidden on Desktop: On desktop viewports, the Table of Contents must remain a persistently visible Sticky Rail and must NOT be collapsed into an accordion, per the RFQ's explicit content-depth visibility requirement. Mobile viewports use an Accordion instead. |
| BR_1.8.6.2 | Video-First Placement: When a post has an associated video, the YouTube embed must be positioned at the top of the page, above the "Key Takeaways" box; image-type posts render a static image in the same position, per E_1.8.6.3. |
| BR_1.8.6.3 | Newsletter Form Reuse: The bottom-of-content Newsletter form on this page — including the card container's Pre-Footer-CTA-style motion and its inline in-card success pill — must use identical field rules, validation, and submission behavior as UC_1.8.5 §5.2–5.3 — no divergent copy or logic is permitted between the two placements. |
| BR_1.8.6.4 | Sanity Global Editing Rule: Only text/image/video-ID content is editable via Sanity CMS; the core structural layout (Back → Hero → Key Takeaways → Sticky TOC (with the Share row at its foot) → Body → FAQ → Continue Reading → Newsletter order) remains hardcoded in Next.js and applies uniformly to every post slug, consistent with BR_1.3.4.1. |
| BR_1.8.6.5 | Checkout/Waitlist Consistency (CR-20260731-002): The Start The Associate Track button must read the Sanity-configured signup-gate variable and switch to Join the Waitlist, routing (same tab) to the Waitlist Lead Capture form when signups are closed, consistent with BR_1.3.1.4. |
| BR_1.8.6.6 | Share Targets: Exactly two share targets — X and LinkedIn — both opening in a new tab (target="_blank"), consistent with BR_1.1.1.3. Discord is excluded and there is no Copy Link control on this screen (client decision, 2026-09-04). |
| BR_1.8.6.7 | FAQ Item Selection (Ref: CR-20260817-001, supersedes the prior "FAQ Category Scoping" rule): The on-page FAQ accordion must display exactly the FAQ items selected for this post in the Sanity page-FAQ settings tab, in the editor's configured order — Ref: UC_1.8.8 §4.9/BR_1.8.8.5. Per-post category mapping is no longer used, and the category sidebar is never rendered here. |
| BR_1.8.6.8 | "Continue Reading" Arrow Navigation: The "Continue Reading" rail's arrow hover/click behavior must be identical to the Insights Hub's rail arrow pattern, consistent with UC_1.8.5 §5.1 item 7. |
UC_1.8.7 — Partners Page
1. Overview
| Field | Content |
|---|---|
| ID | UC_1.8.7 |
| Use Case | Partners Page |
| Description | Provides affiliate program information (hardcoded) and a dedicated "Affiliate Partner Application" page. On form submit, triggers parallel APIs: webhook to Klaviyo and POST to BE Node.js middleware (AWS SES). |
| Zapier Flow | — |
| Zapier Table | — |
| 3rd Party | Everflow, Klaviyo, AWS SES |
2. Trigger
User navigates to the Partners page (/partners), e.g. via direct URL entry or the Footer "Company" column's "Partners" link (Ref: UC_1.1.1 §6 "Footer"). Entry routes in the same tab.
3. Pre-conditions
- User accesses a public page with Global Header and Footer retained.
4. Post-conditions
- On successful submission: Application data is sent to Klaviyo (lead + confirmation email) and internal Backend (AWS SES notification to
partners@stacktrading.com). - User is redirected to the success confirmation screen.
5. Basic Flow & UI Rules
5.1 Landing Page — Partners (/partners) — Hardcoded
- Hero Section:
- Header: "The Stack Trading Partner Network: A Regulated Prop Firm Affiliate Program".
- Subtext: "The era of funneling your students to unregulated offshore prop firms is over. Stack Trading offers elite trading education and financial content creators a safe, highly lucrative pipeline to monetize their audience with zero reputational risk."
- Button:
Apply to Partner Network— Clicking navigates (same tab) to the dedicated Affiliate Partner Application page (/partners/apply), which retains Global Header and Footer (Source: MKT-38).
- Institutional Infrastructure:
- Displays the scrolling logo ticker, Trustpilot Micro Combo widget, and NFA ID text.
- For detailed layout, logo marquee motion, Trustpilot real-time fetching logic and NFA ID handling, refer to UC_1.3.1.
- Trading Educator Partnerships & Revenue Pipeline (Hardcoded):
- Section Header: "Trading Educator Partnerships & Revenue Pipeline".
- Left Panel — "The Ultimate Educator Pipeline":
- Heading: "The Ultimate Educator Pipeline".
- Text Block: "If you run a premium trading Discord, mentorship group, or educational platform, your reputation is your most valuable asset. Pushing your graduates to offshore bucket shops that routinely deny payouts is a massive liability."
- Sub-heading: "The Solution:".
- Text Block: "Stack Trading provides a regulatory-safe harbor. We are an NFA-regulated Introducing Broker offering real Davis Market Access to your audience. You co-brand and refer your traders into the Associate Track. They get a regulated environment to prove their edge, and you receive top-line revenue share for producing capable traders."
- Button:
Apply to the Partner Network— Clicking navigates (same tab) to the dedicated Affiliate Partner Application page (/partners/apply), retaining Global Header and Footer.
- Right Panel: Displays an org-chart diagram illustrating the relationship flow from Discord Operators / Course Creators → Trading Coaches / Community Leaders → Associate Track Revenue Share Model → Stack Trading API Infrastructure.
- Proprietary Trading Affiliate Commission Tiers (Hardcoded):
- Section Header: "Proprietary Trading Affiliate Commission Tiers".
- Subtext: "We treat our partners like institutional vendors. Our commission structure aggressively rewards high-quality volume and consistent lead generation."
- Three Tier Cards (Standard, Pro, Elite):
- Standard Partner (15%):
- Heading: "15% Standard Partner".
- Requirement label: "Requirement".
- Requirement value: "Approved Application".
- Description: "Earn an aggressive 15% baseline commission on all initial Associate Track purchases. Progress to boosting revenue by maintaining consistent conversions. Offer a legitimate career path to your audience and refer the #1 prop firm from every qualified conversion."
- Pro Partner (20%):
- Heading: "20% Pro Partner".
- Requirement label: "Requirement".
- Requirement value: "50+ Conversions / Month".
- Description: "Unlock recurring revenue. Established mentor commission designed for active converting leaders with a strong, motivated following, and growing roster interests. Associate Track purchases are the trader's first key assets."
- Elite Partner (25%):
- Heading: "25% Elite Partner".
- Eligibility label: "Eligibility".
- Eligibility value: "200+ Conversions / Month".
- Description: "Reserved for social industry influencers and institutional finance facing vetting verticals. Unlocks the highest revenue tier available to Associate Track partners. Hit 8% on the trader's first two weeks. Includes a custom co-branded landing page for the fastest gain generation in the prop trading live extension."
- $500 Performance Bonus Banner:
- Sub-Heading: "Affiliate Performance Bonus"
- Text: "For most quality. Regardless of your tier, earn an additional $500 bonus every time you refer someone who successfully reaches Level 6 and secures a W2 employment offer or international monthly retainer. Build a pipeline of professional markets and multiply your payouts."
- Standard Partner (15%):
- Enterprise Affiliate Tracking & Reliable Payouts (Hardcoded):
- Section Header: "Enterprise Affiliate Tracking & Reliable Payouts".
- Subtext: "Affiliates are tired of scrubbed leads, broken tracking links, and delayed crypto payouts. We operate a professional vendor infrastructure."
- Comparison Table (Industry Flow vs. Stack Standard):
Feature Industry Flow Stack Standard Enterprise Tracking Proprietary tracking dashboards that quality-scrub leads to boost firm margins. We utilize enterprise-grade, third-party attribution software. You see every click and conversion in real-time. We cannot manipulate the data. Reliable Payouts Delayed payments routed through shady 3rd-party crypto wallets. Commissions are paid out directly on a Net-30 schedule via US Bank wire or ACH. Marketing Assets Generic banners and fake "lifestyle" marketing material that currently poorly. Access high-converting, compliant media kits: live studio clips, and verified metrics to prove legitimacy to your audience.
- Apply for the Stack Trading Affiliate Program (Hardcoded — Pre-Footer CTA):
- Section Header: "Apply for the Stack Trading Affiliate Program".
- Subtext: "To protect our brand and ensure the highest quality order flow, the Stack Trading Partner Process is strictly vetted. Submit your platform metrics, community size, and content strategy for review by our distribution team."
- Motion: Applies the exact same scrolling text highlight motion effect as the "Stop Gambling. Start Your Career." Pre-Footer CTA. For full motion details, refer to UC_1.3.1 — Pre-Footer CTA. (Link motion).
- Button:
Submit Partner Application— Clicking navigates (same tab) to the dedicated Affiliate Partner Application page (/partners/apply), retaining Global Header and Footer.
5.2 Affiliate Partner Application Page (/partners/apply) — Hardcoded
-
Page Header: "Affiliate Partner Application".
-
Subtext: "Please fill out the form below to submit your partnership application".
-
Form Fields (Ref: CR-02): All validation errors are triggered on out-click (on blur) or when
Submit Applicationis clicked.Field Type Placeholder Default State Constraint Full Name * Textbox "Enter full name" Enabled (Auto-focus) Max 255 characters. Trim whitespace. Email * Textbox "Enter email address" Enabled Max 255 characters. Trim whitespace. Select Country * Dropdown (Single-selection) (Ref: CR-03) "Select country" Enabled (No pre-selection) Select 1 value from the country list. OFAC-sanctioned and FATF Blacklisted countries are removed from the list by the frontend. Estimated Audience Size * Dropdown (Single-selection) (Ref: CR-03) "Select audience size" Enabled (No pre-selection) Options: "Under 10,000", "10,000 to 50,000", "50,000 to 100,000", "More than 100,000". Primary Promotion Channel * Textbox "Enter channel URL (YouTube, Discord, Website, X/Twitter)" Enabled Max 255 characters. Trim whitespace. Promotion Strategy * Textarea "Tell us a bit about how you plan to share Stack Trading with your audience" Enabled Max 500 characters. Trim whitespace. -
Validation Rules & Error Messages:
Full Name:
Condition Error Message Left blank / whitespace only "Please enter your full name" Exceeds 255 characters "Full name must not exceed 255 characters" Email (Regex:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$— Note: Application level validation must ensure domains do not start or end with a hyphen):Condition Error Message Left blank "Please enter your email address" Exceeds 255 characters "Email address must not exceed 255 characters" Fails format check (e.g., missing @, missing domain, missing TLD, multiple@, spaces, illegal special chars)"Invalid email format" Domain starts with a hyphen (e.g., user@-mydomain.com)"Invalid email format" Domain ends with a hyphen (e.g., user@mydomain-.com)"Invalid email format" Country:
Condition Error Message Not selected when Submit is clicked "Please select a country" Primary Promotion Channel (Regex:
^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$):Condition Error Message Left blank "Please enter your channel URL" Exceeds 255 characters "Channel link must not exceed 255 characters" Fails URL format check (e.g., plain text, missing TLD, contains spaces) "Invalid URL format" Valid URL structure but missing http/httpsscheme (e.g.,youtube.com/c/abc)System automatically prepends https://before validating/saving. No error shown.Estimated Audience Size:
Condition Error Message Not selected when Submit is clicked "Please select your audience size" Promotion Strategy:
Condition Error Message Left blank / whitespace only "Please enter your promotion strategy" Exceeds 500 characters "Promotion strategy must not exceed 500 characters" General Note: All error messages are displayed below their respective input field. No trailing period at the end of any error message.
-
Compliance Checkbox: "By submitting this application, you agree to Stack Trading's Terms of Service and Privacy Policy." The
Terms of ServiceandPrivacy Policyhyperlinks open in the same tab, consistent with every other entry point to these pages (Global Footer, Homepage/Rules PageRead the Full Terms & Conditions, Help Center's "Still Have a Question?" card — Ref: §4.8; UC_1.9.2 §8 BR-1.9.2-04, UC_1.9.1 §8 BR-1.9.1-03). The checkbox must be checked to enable theSubmit Applicationbutton. -
Buttons:
Cancel: See Exceptional Flows E_1.8.7.2 / E_1.8.7.3 for behavior based on form dirty state (Ref: CR-05).Submit Application: Disabled (greyed out) until all required fields are valid and the compliance checkbox is checked. Specifically, it remains disabled (unclickable) until a valid email address is input (including basic@domaincheck without leading/trailing hyphens). On click, executes the submission flow (see 5.3).
5.3 Form Submission Flow (Parallel APIs)
- Client-side Validation: System validates all fields. If any errors exist → Scroll to and focus the first failing field, display red border and inline error message. No API call is made.
- Loading State: If all fields are valid → Disable the entire form (all inputs, dropdowns, textarea, Cancel and Submit buttons). The Submit button transitions to a Loading State: displays a spinner and changes button text to
Submitting...(Source: wireframe Partners-4). - Parallel API Calls:
- (1) Klaviyo Webhook: Frontend calls the Klaviyo API directly to log the lead and trigger an automated confirmation email to the applicant.
- (2) Internal Backend API: Frontend POSTs form data to the Node.js middleware → Backend constructs an email payload and sends it via AWS SES to
partners@stacktrading.com:- Subject:
New Partner Application: [Full Name] - Body: Full Name, Email, Country, Primary Promotion Channel, Estimated Audience Size, Promotion Strategy (Source: MKT-20, MKT-35).
- Subject:
6. Exceptional Flows
| Exception ID | Condition | System Handling / Fallback |
|---|---|---|
| E_1.8.7.1 | Compliance Checkbox Not Checked | User has not checked the compliance checkbox. |
| E_1.8.7.2 | Unsaved Changes — Cancel While Form Has Data (Dirty) (Ref: CR-05) | User clicks Cancel after entering data in at least one field. |
| E_1.8.7.3 | Cancel While Form Is Empty (Clean) | User clicks Cancel without having entered any data in the form. |
| E_1.8.7.4 | Successful Submission (API 200/201) | All fields valid, checkbox checked, CAPTCHA passed, both API calls succeed. |
| E_1.8.7.5 | Duplicate Email (API 409 Conflict) | Backend detects the submitted email already has a pending application. |
| E_1.8.7.6 | Network Error (Ref: TE-SYS-01) | Cannot reach the server. |
| E_1.8.7.7 | Server Error (5xx) | Server is unavailable or encounters an internal error. |
| E_1.8.7.8 | Spam / Bot Submission | User fails the CAPTCHA / Cloudflare Turnstile check. |
7. Business Rules
| BR_ID | Rule Description |
|---|---|
| BR_1.8.7.1 | B2B Geo-Compliance: The Select Country dropdown ONLY removes OFAC-sanctioned and FATF Blacklisted countries from the list. FATF Greylist countries are permitted. If a country is not visible in the dropdown, the user cannot apply. (Source: MKT-38). |
| BR_1.8.7.2 | Dedicated Page (No Overlay): The Affiliate Partner Application is hosted on a dedicated Next.js route (/partners/apply) to support B2B marketing deep linking. The Global Header and Footer are retained on this page. (Source: MKT-38). |
| BR_1.8.7.3 | Hardcoded Content: All sections on the Partners landing page (Hero, Trading Educator Partnerships, Commission Tiers, Enterprise Tracking, Pre-Footer CTA) are hardcoded in Next.js and are NOT managed via Sanity CMS — except the commission figures carved out by BR_1.8.7.4 below, which supersedes this rule for those specific values. |
| BR_1.8.7.4 | Affiliate Commission Figures Are Sanity-Configured: Within "Proprietary Trading Affiliate Commission Tiers" (§5.1 item 4), the following values are Sanity CMS fields editable without an engineering deploy: each tier's commission percentage, its requirement threshold, its description text, and the $500 bonus banner amount. This is the Partners page's "Pricing Data" section per the index.md Pricing Data section map, and is a deliberate carve-out from BR_1.8.7.3's page-level hardcode classification. Scope is the tier values and bonus amount only — the tier table layout, section heading, and every other section on the page remain hardcoded, consistent with BR_1.3.4.1. Commission percentages published here must match the rates actually configured in the affiliate tracking platform; a mismatch is a Compliance/Marketing issue, not a frontend fallback case. |
UC_1.8.8 — Help Center / FAQ
1. Overview
| Field | Content |
|---|---|
| ID | UC_1.8.8 |
| Use Case | Help Center / FAQ |
| Description | Provides a full-page FAQ experience with a left-side category sidebar, client-side keyword search, accordion-style Q&A, deep-link URL navigation, and supporting CTA blocks. Per MKT-05 (QnA confirmed answer), Sanity CMS manages the FAQ collection (categories/questions/answers) consumed here, while this page's chrome (Hero, Search bar, Institutional ticker, "Are You Looking For More" cards, "Still Have a Question" CTA) is hardcoded in Next.js like the rest of the site's non-Sanity-driven pages. |
| Zapier Flow | — |
| Zapier Table | — |
| 3rd Party | Sanity CMS |
2. Trigger
User navigates to the Help Center page (/help-center), e.g. via direct URL entry, the Header Resources dropdown's "Help Center/FAQ" item (Ref: UC_1.1.1 §6 "Resources Dropdown"), the Footer "Company" column's "Help Center / FAQ" link (Ref: UC_1.1.1 §6 "Footer"), the Rules Page's View all FAQs button (Ref: UC_1.8.1 §5 item 10), the Trading Floor page's View all FAQs button (Ref: UC_1.8.2 §5), the Comparison Hub's "Still Have Questions" link (Ref: UC_1.8.3 §5 / BR_1.8.3.7), or the Competitor Page's View all FAQs button (Ref: UC_1.8.4 §5 item 8 / BR_1.8.4.7). All entry points route in the same tab. Deep-link query parameters (?category=&question=) may also be appended by any of these entry points or by a shared URL, per §4.7/BR_1.8.8.2.
3. Pre-conditions
- FAQ data (categories, questions, answers) is populated in Sanity CMS.
- Global Header and Footer are rendered.
4. Basic Flow & UI Rules
Sanity CMS Scope for this page: Per MKT-05 (Source: QnA_MARKETING_WEBSITE.md — "Sanity CMS quản lý: ... FAQ & Team members. Các trang còn lại ... code cứng Next.js") and MKT-06 (Source: QnA_MARKETING_WEBSITE.md — "FAQ và Team Members sẽ nằm trong trang About Us và được quản lý qua Sanity CMS"), the client-confirmed split is at the collection level, not the page level: the FAQ dataset itself (categories, questions, answers — §4.4/§4.5 below) is Sanity-managed content reused across multiple pages (this Help Center, UC_1.3.4 Homepage, UC_1.5.4 Career Path, UC_1.8.1/UC_1.8.2/UC_1.8.4/UC_1.8.6) — ⚠️ but not About Us, which hosts only the Team Members collection and has no FAQ section (Ref: BR_1.6.2.2, superseding the FAQ half of MKT-06) — while every other block making up this page's shell (§4.1, §4.2, §4.6, §4.7, §4.8) is hardcoded in Next.js, consistent with BR_1.3.4.1's "content is Sanity-editable, structural layout is hardcoded" rule applied site-wide. This page is the housing for the FAQ collection in the same way About Us is the housing for the Team Members collection — it is not itself one of the client's named "Driven by Sanity" page templates (SEO Vertical/Strategy, Competitor Comparison, Insights Hub/posts).
4.1 Hero Section — Hardcoded
- Breadcrumb: "FAQ" pill label displayed above the heading.
- Heading: "Help Center" (with italic/accent treatment on one word as per design).
- Subtext: "Answers to common questions about the Associate Track, the Career Path, platforms, and your account."
4.2 Search Bar — Hardcoded
- Placeholder: "Search".
- Behavior: Client-side, real-time keyword filter. As the user types, the FAQ accordion list in the main area is instantly filtered to show only Q&A items whose Question or Answer text contains the typed keyword (case-insensitive).
- No match: If no questions match the keyword, the main content area displays an empty state (no items shown). Category tabs in the sidebar remain visible but the accordion list is empty for the active tab if nothing matches.
- Clear: When the search field is cleared (empty), the accordion list reverts to the full category view.
4.3 "Frequently Asking Questions" — Section Heading
- Heading: "Frequently Asking Questions" (with italic/accent treatment on "Questions" as per design).
- Layout: Left sidebar (category tabs) + right main area (accordion list).
4.4 Category Sidebar Tabs — Sanity CMS Managed
Scope of categories (Ref: CR-20260817-001 — see §4.9): Categories exist only to organise this Help Center page's sidebar. They are not the mechanism by which other pages pick their FAQ items — since CR-20260817-001, each static page selects individual FAQ items from the master list via a dedicated Sanity settings tab (§4.9). A page's FAQ block is therefore an explicit item list, not a category query.
The left sidebar lists all FAQ categories fetched from Sanity CMS. Categories displayed (as per wireframe):
- All — shows every question across all categories.
- The Associate Track
- The Career Path
- Rules & Parameters
- Platforms & Technology
- Billing & Payments
- Account & Compliance
Interaction:
- Default active tab on page load: All.
- Hover: Tab item shows a highlighted/underlined state.
- Click: Selected tab becomes the active state (highlighted background). The main accordion area instantly updates (client-side filter, no page reload) to display only questions belonging to the clicked category.
4.5 FAQ Accordion — Sanity CMS Managed
Each FAQ item renders as an accordion row in the main content area.
States:
- Collapsed (default): Displays the Question text only. Background: dark card.
- Hover: Accordion row shows a subtle hover highlight (brightness/border change).
- Expanded (clicked): Accordion expands below the question to reveal the Answer content. Background: slightly highlighted (warmer/lighter dark tone as per wireframe). Only one accordion item can be open at a time — clicking a new question collapses the previously opened one.
- Collapsed again: Clicking an already-expanded item closes it.
Answer content:
- Renders plain text body.
- May include a Source citation line, e.g., "(Source: Terms Section 3)".
- Source text is styled smaller/muted below the answer body.
"View More" button:
- Appears below the accordion list when a category has more questions than the initial display limit (number TBD by CMS).
- Click: Loads and renders the remaining questions for the current category into the accordion list without a page reload. The "View More" button disappears once all questions are displayed.
- Deep-link behavior: If the target question is currently hidden behind "View More", the system bypasses the limit and renders it immediately (see §4.7).
4.6 Institutional Infrastructure — Logo Ticker — Hardcoded
- Text: "Backed by institutional infrastructure".
- Logos scroll in a continuous horizontal marquee motion. Motion behavior follows the same specification as UC_1.1.1 — Ref: UC_1.1.1 §4 Institutional Infrastructure.
- Motion reference.
- Logo list (as per MKT-39): RV Chart, Mastercard, TradeSea (replacing NinjaTrader), ATAS, Quantower, Sierra (partial visible).
4.7 "Are You Looking For More?" Section — Hardcoded
- Section Heading: "Are You Looking For More" (italic/accent treatment on "Looking For More" as per design).
- Displays a 3×2 grid of category cards.
Card definitions:
| Card Label | Destination / Behavior |
|---|---|
| The Associate Track | Navigates (same tab) to the Associate Track page (/associate-track). |
| The Career Path | Navigates (same tab) to the Career Path page (/career-path). |
| Rules and Parameters | Navigates (same tab) to the Rules page (/rules). |
| Platforms & Technology | Deep-links to a specific question within this page. Triggers the deep-link flow: smooth scroll to FAQ accordion → auto-select "Platforms & Technology" tab → expand the question "What is Rithmic / Trading Technologies?" (Source: MKT-32). |
| Billing and Payments | Deep-links to a specific question within this page. Triggers the deep-link flow: smooth scroll to FAQ accordion → auto-select "Billing & Payments" tab → expand the question "Can I pay with crypto?" (Source: MKT-32). |
| Account & Compliance | Deep-links to a specific question within this page. Triggers the deep-link flow: smooth scroll to FAQ accordion → auto-select "Account & Compliance" tab → expand the question "What is the NFA?" (Source: MKT-32). |
Deep-link flow detail (applies to the 3 inline-page cards and any external URL share):
- Frontend performs an immediate smooth scroll to the FAQ accordion section.
- Auto-selects the correct category tab in the left sidebar.
- If the target question is currently hidden behind "View More", the system bypasses pagination and renders it immediately.
- The target question's accordion is automatically expanded to display the answer.
- The URL is updated with hash/query parameters (e.g.,
?category=billing&question=35) so the user can copy and share a direct deep link that re-creates the same expanded state on load. (Source: MKT-32).
All 6 cards are implemented as URL links (anchor tags with href) so they are crawlable, shareable, and support browser navigation (back/forward). The first 3 cards link to internal pages; the last 3 link to this same page with deep-link query parameters.
4.8 "Still Have a Question?" Card — Hardcoded
- This card uses the same motion effect as the Pre-Footer CTA "Stop Gambling. Start Your Career." block — faint text scrolls right-to-left in the background with a center highlight.
- Ref: UC_1.1.1 §4 Pre-Footer CTA — Motion reference.
- Heading: "Still Have a Questions?" (as per wireframe).
- Subtext: "Our support team is available to help with anything not covered here."
- Button
Contact Support: Opens the user's default email client viamailto:support@stacktrading.com. Behavior follows the same pattern as the "Talk to us" button — Ref: UC_1.3.1 §4. - Terms of Service link: "Or review the full Terms of Service →"
- The
Terms of Servicetext is underlined and styled as a hyperlink. - Hover behavior: Text color changes to the accent color (gold/orange), underline persists. Cursor changes to
pointer. - Click: Navigates to the Terms of Service page (
/terms-of-service) in the same tab, consistent with the Global Footer link, the Homepage/Rules PageRead the Full Terms & Conditionsbutton, and the Partners Page application form'sTerms of Service/Privacy Policyhyperlinks (Ref: UC_1.8.7 §5.2 item 5; UC_1.9.2 §8 BR-1.9.2-04).
- The
4.9 Page-FAQ Mapping — Sanity Settings Tab (Ref: CR-20260817-001)
This section is the single canonical definition of how every on-page FAQ block across the Marketing site is populated. All UCs whose FAQ block draws on the shared collection (UC_1.3.4 Homepage, UC_1.5.4 Career Path, UC_1.8.1, UC_1.8.2, UC_1.8.4, UC_1.8.6) reference this section rather than restating it.
⚠️ Not covered here — SEO vertical pages: the Trading & Strategy SEO templates (UC_1.7.x) currently author their own inline FAQ array per page (field S12 – FAQ Items, Question + Answer authored directly in that page's Sanity document), not a selection from the shared master list. CR-20260817-001 did not state whether those pages join the new page-FAQ mapping tab or keep their inline arrays — left as-is pending client confirmation (see Open items below).
Superseded model (do not implement): previously each screen had its own FAQ category, and a page rendered "all items tagged with my category". That model is replaced — categories no longer drive page-level FAQ selection.
Current model:
- Sanity CMS exposes a new dedicated settings tab ("FAQ per page" / page-FAQ mapping) alongside the FAQ collection itself.
- That tab lists every static page on the Marketing site that has an FAQ block (home, career-path, rules, trading-floor, competitor pages, insight posts, SEO pages…). Each page is one row/entry.
- For each page entry, an editor picks individual FAQ items from the single master "All FAQ list" — the same collection rendered on this Help Center page (§4.4/§4.5). Selection is per-item, not per-category.
- The same FAQ item may be selected by any number of pages — items are referenced, never duplicated. Editing the Question/Answer once in the master list updates it everywhere it is shown.
- Display order on a page follows the order the editor arranged the selected items in that page's entry (not the master-list order, not category order).
- A page whose entry has no items selected renders no FAQ block — see each page's zero-items exception (e.g. E_1.8.6.7, E_1.3.4.4).
- The Help Center page itself is not driven by this mapping — it always renders the full master list grouped by category (§4.4/§4.5), regardless of what any page entry selects.
Unchanged by this CR: the FAQ item schema (Question / Answer / optional Source citation), the accordion interaction pattern (§4.5), category tabs on this page (§4.4), deep-linking (§4.7), and the "content Sanity-editable, layout hardcoded" split (BR_1.3.4.1).
⚠️ Open items for the client (not assumed in this doc): (a) whether a page entry can also override the FAQ section heading per page, or headings stay hardcoded per page as today; (b) whether there is a max item count per page entry; (c) what happens to a page entry's list when a selected FAQ item is deleted from the master list (silently dropped vs. blocking the delete); (d) whether the SEO vertical pages (UC_1.7.x) migrate from their inline S12 – FAQ Items array to this mapping tab.
5. Exceptional Flows
| Exception ID | Condition | System Handling / Fallback |
|---|---|---|
| E_1.8.8.5 | Page-FAQ Mapping Entry Missing / Unfetchable (Ref: CR-20260817-001) | A static page's entry in the Sanity page-FAQ settings tab does not exist yet, or fails to fetch on page load. |
| E_1.8.8.1 | Sanity CMS API Failure on Load | Next.js fails to fetch FAQ data from Sanity. |
| E_1.8.8.2 | Deep-Link with Invalid Parameters | User arrives via a URL with ?category= or ?question= values that do not exist in the CMS. |
| E_1.8.8.3 | Search Returns No Results | User types a keyword that does not match any question or answer in the current category tab. |
| E_1.8.8.4 | "View More" Load Failure | User clicks "View More" and the system cannot load additional questions (e.g., network interruption). |
6. Business Rules
| BR_ID | Rule Description |
|---|---|
| BR_1.8.8.1 | Content Ownership (Sanity CMS): The FAQ categories, questions, and answers (§4.4/§4.5) are managed by Marketing Ops via Sanity CMS — no hardcoded FAQ copy exists in the Next.js codebase for these two sections, consistent with MKT-05/MKT-06. |
| BR_1.8.8.2 | URL-Based Deep Linking: Every expanded FAQ state must be reflected in the URL (?category=&question=) to support sharing, bookmarking, and deep linking from external pages (Source: MKT-32). |
| BR_1.8.8.3 | Logo Ticker — TradeSea Replaces NinjaTrader: The institutional infrastructure ticker on this page uses TradeSea in place of NinjaTrader, consistent with MKT-39 applied site-wide. |
| BR_1.8.8.4 | Page Chrome Is Hardcoded (MKT-05): The Hero (§4.1), Search bar (§4.2), Institutional Infrastructure ticker (§4.6), "Are You Looking For More" cards (§4.7), and "Still Have a Question?" CTA card (§4.8) are hardcoded in Next.js, not Sanity-managed — only the FAQ collection consumed by §4.4/§4.5 is Sanity-driven on this page. |
| BR_1.8.8.5 | Page-FAQ Selection Is Per-Item, Not Per-Category (Ref: CR-20260817-001): Every on-page FAQ block across the Marketing site must be populated from the Sanity page-FAQ settings tab defined at §4.9 — the editor selects individual items from the single master "All FAQ list" for each static page, and the frontend renders exactly that selection in the editor's order. Querying "all items in category X" to populate a page's FAQ block is no longer permitted; categories are scoped to this Help Center page's sidebar only (§4.4). One FAQ item may be selected by any number of pages and is stored once — never duplicated per page. |