StackTrading Docs

SRS: Marketing Site (UC 1.1.1 – 1.6.2)

FieldValue
BA in Charge / AuthorQuynh Anh Hoang / Antigravity
Date Created2026-07-26
Versionv1.17
Document ReferencesRFQ_ Website and Dashboard Implementation V7.pdf (Marketing)3rd_party_integrations_master.md (S12-Sanity, S13-GA4, S22-Cookiebot/Trustpilot)QnA_MARKETING_WEBSITE.md (MKT-42 — Cloudflare edge access block)

Changelog

DateVersionUpdated itemBeforeAfterNotes
2026-07-26v1.0Initial documentFull Marketing UX/UI specs
2026-07-28v1.1Klaviyo mappings(e.g., confirmation email)(Newsletter: Ref: [KLA-02]... / Waitlist: Ref: [KLA-22]...)Mapped Email sequences
2026-07-30v1.2Trustpilot integration (UC_1.1.1, UC_1.3.1, UC_1.3.3, UC_1.4.1, UC_1.4.2, UC_1.5.1, UC_1.5.3, UC_1.6.1)Testimonial max count = 12; single "hide widget on proxy failure" fallback for all Trustpilot elements; no documented fetch/cache timing; no long-text UI rule; no language scope ruleTestimonial max count = 20 (backend-only filter/cap, FE renders as-is); fetch is on-page-load only with up to 60-min cache reuse, no real-time listener anywhere (manual reload needed to see updates); fallback split into required component (score/count widget — hide or keep last cached value, never a broken state) vs optional component (testimonial slider — hide section or show static pre-approved fallback set); added "Read More" button rule for long review text; added English-only Day-1 language scope ruleRef: Slack thread (Adam Culver/Adrian) + QnA_TRUSTPILOT_UIUX.md TP-A11–TP-A16
2026-07-30v1.3UC_1.3.1 §5 "NFA ID" text; UC_1.6.1 §3 item 6 "Regulated Ambition" text + E_1.6.1.5Placeholder text with [Insert ID] / [INSERT DELAWARE FILE NUMBER] / [INSERT TEXAS FILE NUMBER] / [INSERT NFA ID]Replaced with confirmed real values — NFA ID: 0580183; Delaware File No.: 10426411; Texas File No.: 806337378. Also updated copy per client's approved wording: "Stack Trading" → "Stack Trading Corporation" (Delaware formation sentence), and "We are fully registered..." → "Stack Trading Brokerage LLC is fully registered..."Client confirmation (Slack, Adrian, 2026-07-30) — square brackets removed per client instruction ("Remove the square brackets, those are just part of the placeholder"); wireframe already updated by BA to match
2026-07-30v1.4UC_1.3.4 "From The Trading Floor" section + E_1.3.4.6 + BR_1.3.4.4No linkage to Insights Hub's "Most Popular" widgetHomepage "From The Trading Floor" slider shows the same posts curated in the Insights Hub's "Most Popular" widget (UC_1.8.5) — manually curated by the Admin via Sanity CMSMapped to UC_1.8.5 §5.1 item 3
2026-07-30v1.5UC_1.1.1 §6 Global Footer (Discord link, NFA Membership Statement, Legal Links cross-refs)Outdated Discord invite link; no dedicated NFA membership statement line; Legal Links block had no cross-refs to the Utility pagesUpdated Discord invite link; added a standalone NFA Membership Statement line; Legal Links block now cross-links to UC_1.9.1/UC_1.9.2/UC_1.9.3Footer content sync
2026-07-30v1.6UC_1.3.1 §5 "Built for Your Market" card contentCard copy/bullets not yet specified per market cardAdded full bullet content for the Futures Traders, Forex Traders, and Crypto Traders cardsContent finalized
2026-07-30v1.7UC_1.3.2 §5 Payout Ledger — dedup logic, initial load, mobile interaction, row cap (BR_1.3.2.1)Dedup/initial-load behavior underspecified; no mobile/tablet interaction mode documented; row cap listed as 100Clarified tx_hash-based dedup and full-render initial load behavior; added a tap-to-pause mobile/tablet interaction mode; corrected the row cap to 50 to match the API's top-50 payloadAlignment with backend payload size
2026-07-31v1.9UC_1.1.1 (§4 Post-conditions, §5 Basic Flow step 3/4, E_1.1.1.1), UC_1.3.1 (§1 Overview Zapier Table/3rd Party, §5 Hero Waitlist Mode, Comparison Table Start Associate Track, Pre-Footer Begin The Associate Track, BR_1.3.1.4), UC_1.4.1 (§1 Overview Zapier Table/3rd Party, BR_1.4.1.1), UC_1.5.1 (§1 Overview Zapier Table/3rd Party, §3 Hero Start Associate Track, §3 Pre-Footer Waitlist Mode, E_1.5.1.1, BR_1.5.1.1), UC_1.6.1 (§1 Overview 3rd Party, §3 Pre-Footer Waitlist Mode, E_1.6.1.4)CTA "Join Waitlist" button-mode switching (i.e., Start Associate Track/Earn Your Seat/Begin Evaluation/Begin The Associate TrackJoin Waitlist) described as reading the cached Global_Var_Allow_New_Signups flag from the Backend via ISR fetch of /system/status (Zapier Table C, Ref: MKT-001/MKT-36)FE team creates a Sanity CMS config variable that the Stack Trading team manually updates to open/close signups; FE reads this Sanity variable to decide CTA button text/action. The Backend's actual Global_Var_Allow_New_Signups (Zapier Table C, enforced at Checkout Step 3b by UC_2.1.3) is not changed — Checkout Gate 1 real-time enforcement is unchanged. E_1.1.1.1 reworded from "ISR cache lag" to "Sanity variable not yet manually updated"; Checkout App's real-time fail-safe redirect behavior unchanged.FE Dev team confirmation (relayed by user, BA session, 2026-07-31) — CR-20260731-002; supersedes MKT-001/MKT-36 display-layer wording.
2026-08-11v1.10UC_1.6.1 §3 items 1/3/4/5/6/7 (copy + newly documented components), new §3 section-order note, new E_1.6.1.6, E_1.6.1.4 updated, BR_1.6.1.1 + BR_1.6.1.2 (both rewritten from [Removed]), new BR_1.6.1.5; UC_1.6.2 §2 items 2/3, E_1.6.2.1/3/5, BR_1.6.2.1/2/3; UC Index row for UC_1.6.2; UC_1.8.md §UC_1.8.8 Sanity-scope note; QnA_MARKETING_WEBSITE.md MKT-06 row(a) Copy had no source. §3 items 1/3/4/5 carried BA-authored placeholder copy ("We are Stack Trading", "Most prop firms are marketing companies pretending to be trading floors…", "We are not looking for gamblers…", "Trading isolated is a disadvantage…") that matches no file in References/ — the only client source for this page is the one-line RFQ V7 §Page 10 entry ("Trust. Founder story, 'Why Us?', Regulatory pursuit. Real people, real office etc."). (b) Three components were undocumented entirely: the Radical Transparency 2-up comparison cards, the "A Return to Standards" Founder's Letter (portrait, 3 paragraphs + bold close, signature block, guilloché certificate frame), and the Regulated Ambition credential card. (c) BR_1.6.1.2 asserted "There is no Verify status link in the design" — the button exists. (d) UC claimed an About Us FAQ section (§2 item 4, E_1.6.2.3, BR_1.6.2.2, BR_1.6.2.3, UC Index row) on the strength of QnA MKT-06. (e) Pre-Footer button was documented as Begin The Associate Track - $499 with the price inside the label, copied from the Homepage pattern. (f) Team hover was documented as a "dark glassmorphism overlay"; grid columns and placeholder-entry handling were unspecified(a) All four copy blocks replaced with the real on-page copy, plus the Hero eyebrow badge/photo and the mixed-serif accent treatment per header. (b) All three missing components fully specified, and a section-order note added recording that the Sanity Leadership Team block sits between "A Return to Standards" and "A Real Floor". (c) BR_1.6.1.1/BR_1.6.1.2 rewritten: credential card is hardcoded with NFA ID 0580183; Verify Status links to the NFA BASIC public record for Stack Trading Brokerage LLC in a new tab (rel="noopener noreferrer"), URL change requires deploy + Compliance review; new E_1.6.1.6 covers an unreachable destination. (d) FAQ removed from all 5 locations — supersedes QnA MKT-06 (2026-07-24, ★★★). Only the Team Members half of MKT-06 still holds. Recorded as a positive rule (BR_1.6.2.2, "no FAQ here") so the claim cannot silently reappear; MKT-06 itself amended in place with a strike-through + correction note; UC_1.8.md's shared-FAQ-collection list corrected to exclude About Us. E_1.6.2.3 freed up and reused for placeholder (TBD) team entries. (e) Button corrected to the static label Start Associate Track (identical in both pricing states) with pricing moved to a separate bar below it ("$650/month $499 — Founding Member Pricing" / "Evaluations starting at $650"); sub-header copy added; hover motion tied to the UC_1.3.1 Pre-Footer button (Ref: MKT-03). New BR_1.6.1.5 pins this as a deliberate divergence — price outside the button here, inside it on the Homepage — that must not be normalized, while confirming the Sanity founder_count read, price-state switch, revert-to-original-price and Waitlist label swap all follow UC_1.3.1 unchanged. (f) Hover corrected to a light frosted-glass overlay with card lift; 4-column grid documented; TBD placeholder cards specified as pure content (no frontend special-casing); new BR_1.6.2.3 states badge values are unvalidated free-text (Compliance owns accuracy, covering the "Series 34" vs "Series 24" discrepancy)User confirmation (BA session, 2026-08-11) — UC reviewed page-by-page against the live About Us build. User directed the FAQ removal ("Chỉ có team member có trong about us thôi, không có FAQ") and confirmed Verify Status → NFA site, the Pre-Footer button being correct as-built, and that its hover motion + Waitlist/Sanity price-state behavior mirror the UC_1.3.1 Pre-Footer CTA button
2026-08-11v1.11New CMS Editability field in §1 Overview of UC_1.1.1, UC_1.3.1, UC_1.4.1, UC_1.5.1, UC_1.6.1; index.md rewritten from a 13-line stub to add two new sections — "Marketing Site — CMS Editability Scope (Overall)" and "Pricing Data — Section nào trên từng màn Hardcode chứa Sanity pricing"No consolidated Hardcode-vs-Sanity scope existed anywhere in the UC set. Each page's Overview table stated its 3rd-party/Sanity usage in isolation, so there was no single place answering "which parts of which Marketing page can Marketing edit without a dev deploy", and "Pricing Data = Sanity" was asserted per page without ever naming which section on that page actually carries the Sanity pricingAdded the page-by-page Overall Scope table (19 pages × Layout / Pricing Data / FAQ / Insight Hub / Other Content / Mode Waitlist), plus a second table mapping each Hardcode page to the exact named section holding its Sanity pricing data. Each of the 5 UCs above now carries a CMS Editability row cross-linking into those tables and naming its own Pricing Data section. About Us specifics: FAQ column set to N/A with footnote ⁴ recording the MKT-06 supersession (consistent with BR_1.6.2.2); Pricing Data corrected N/A → Sanity, mapping to the Team Members block rather than the Pre-Footer CTA. Scope-boundary note carried into both tables: Pre-Footer CTA / Hero founder-pricing ($499↔$650) and Mode Waitlist are a sitewide CTA-pricing pattern tracked separately, not counted as page "Pricing Data"Authored fresh on this branch per user instruction (BA session, 2026-08-11) — content matches the previously-confirmed scope decisions, but written anew rather than restored/cherry-picked from another branch. ⚠️ 2 open gaps flagged in-doc, not silently filled: (1) the client source [Internal] Pricing Data Display - Marketing Site.docx and its MKT_PRICING_DISPLAY_SCOPE manifest entry are not present in References/ on this branch, so the scope table's citation cannot be verified in place; (2) 3 confirmed Sanity classifications (Career Path "Level 6: Welcome to the Payroll", Trading Floor "Mentorship…"/"DFW Locals", Partners $500 bonus banner) have no Business Rule written on this branch — the tables therefore link to sections by name instead of to BR anchors, to avoid dead links. Gap (2) closed in v1.12 below
2026-08-11v1.12New BR_1.5.1.3 (UC_1.5.1); new BR_1.8.2.6 + §3 Pre-conditions + §5 Sanity-scope note + §5 items 5/6 labels (UC_1.8.2, in UC_1.8.md); new BR_1.8.7.4 + amended BR_1.8.7.3 (UC_1.8.7, in UC_1.8.md); index.md Pricing Data table now links BR anchors instead of section names, and notes (a)/(b)/(c) rewrittenCloses gap (2) flagged in v1.11. The three Sanity pricing-data classifications had no Business Rule, so the section map could only reference sections by name. Worse, two of them directly contradicted existing rules: BR_1.8.7.3 stated the Partners Commission Tiers were hardcoded and NOT Sanity-managed, and UC_1.8.2's §3 Pre-conditions / §5 Sanity-scope note / §5 item 5–6 "(Hardcoded)" labels all asserted the Mentorship and DFW Locals sections were fully hardcoded per MKT-05 — the opposite of what the Pricing Data map claimedWrote the three carve-out BRs, each scoped to numeric values only with heading/copy/layout/motion staying hardcoded per BR_1.3.4.1: BR_1.5.1.3 (Level 6 comp figures $2,578 / 9.4% / $2,350, cross-checked against the UC_1.5.2 24-Levels table), BR_1.8.2.6 (Pod Leader Carry $250/$500/$1,500, Total Class Earnings $15,750, $2,250 callout, desk prices $800/$0 per month), BR_1.8.7.4 (tier commission %, requirement thresholds, description text, $500 bonus banner). Resolved both contradictions rather than leaving competing rules: BR_1.8.7.3 now names BR_1.8.7.4 as its explicit exception, and UC_1.8.2's pre-condition, scope note, and both section labels now state "Hardcoded layout/copy; monetary figures = Sanity". index.md notes (a)/(b)/(c) rewritten from "BR chưa được viết" into a carve-out summary, with the BR_1.8.7.3 conflict recorded openlyUser approval (BA session, 2026-08-11) — "3 phân loại Sanity đã confirm nhưng chưa có BR trên nhánh này: Oke nhé". The BR_1.8.7.3 contradiction was found while writing and is flagged rather than silently overwritten
2026-08-11v1.13_SOURCE_MANIFEST.yaml — new MKT_PRICING_DISPLAY_SCOPE entry; new extract References/Customer supplies/Marketing site/[Internal] Pricing Data Display - Marketing Site.docx.md; index.md source note + footnote ⁴; UC_1.3.1/1.4.1/1.5.1/1.6.1 CMS Editability rows (citation restored); BR_1.6.1.5; BR_1.6.2.2Closes gap (1) flagged in v1.11 — the client scope document was not in References/ and had no manifest entry, so the scope tables cited a source that could not be verified in placeUser supplied the .docx. Generated a text extract alongside it (tables + per-page CTA/pricing notes; images not extracted) and registered it as MKT_PRICING_DISPLAY_SCOPE, priority 3 ★★★, so Ref: citations resolve. Removed the temporary "source file chưa có trên branch này" warning box. Two v1.10 findings upgraded from as-built observation to sourced fact: (i) BR_1.6.2.2 — the client document's own Overall Scope row lists About Us → FAQ = N/A, independently corroborating the no-FAQ decision rather than resting only on the live build + BA instruction; (ii) BR_1.6.1.5 — the document states About Us "Đổi sub-text từ 499 về 650" and lists only Start Associate Track as its CTA, versus "Đổi text button từ 499 về 650" for Homepage/Rules/Comparison Hub, confirming the price-outside-the-button divergence is intended by the client, not an implementation driftSource file added by user (BA session, 2026-08-11); extract + manifest entry generated mechanically from that file, no content authored
2026-08-14v1.14UC_1.3.2 §5.1 (new "Motion-Bound Polling" bullet + "Tab Refocus" qualifier), §5.5 fully rewritten, §5.6 State Transition Indicator; E_1.3.2.4 and E_1.3.2.5 rewritten; new E_1.3.2.7 + E_1.3.2.8; new BR_1.3.2.5 + BR_1.3.2.6Fetching was documented as decoupled from motion: §5.5 stated "Cursor Hover → Auto-scroll pauses. Background data continues fetching invisibly", the mobile tap mode repeated it ("consistent with the desktop hover behavior"), and E_1.3.2.5 built on it ("background data continues fetching invisibly; new items are only reflected once the user clicks Resume Live Feed") — i.e. a paused feed kept polling and accumulated unseen rows. The two pause states were also flattened into one: E_1.3.2.4 asserted "if the user hovers, taps, OR scrolls manually, the Resume Live Feed button is surfaced", so hover and manual-scroll shared a single exit path, and nothing defined how the hover trigger behaves when the cursor is already inside the containerFetching is now bound to motion. New §5.1 "Motion-Bound Polling": polling runs only while the ticker moves; every pause suspends it, every resume fires one immediate fetch at that moment before realigning to the shared 5-minute schedule (pinned as BR_1.3.2.5, no background buffering). "Tab Refocus" qualified — refocus refetches only in the live state, never while paused. §5.5 restructured into two distinct pause states plus an arming rule: (a) Hover Pause — desktop, top-edge only, temporary/self-releasing, no Resume Live Feed button, cursor-leave resumes motion + fetch with no snap; (b) Manual Scroll Pause — explicit, button-only exit, cursor-leave does not release it; (c) Hover-arming rule — the hover pause is edge-triggered on outside → inside only, and inside → outside can only release an active hover pause (pinned as BR_1.3.2.6). (d) Mobile tap rewritten to follow (b) and to stop fetching, dropping the now-invalid "consistent with desktop hover" justification. §5.6 extended: the 400ms pulse also fires on hover release, where it is the only cue that motion + fetching resumed. E_1.3.2.4 reframed from "overlapping modes" to pause-state escalation (hover → manual-scroll, no fetch on the transition); E_1.3.2.5 reframed to new transactions occurring while the client is not polling — picked up by the single resume-fetch, with the >50-during-a-long-pause consequence of the top-50 snapshot stated openly. New E_1.3.2.7 (Resume clicked with the cursor still inside → feed runs normally, must not self-cancel) and E_1.3.2.8 (cursor leaves during a manual-scroll pause → stays paused)Team-initiated UX adjustment, confirmed by client (relayed by user, BA session, 2026-08-14). Rationale: align data freshness with perceived motion — the user should always see transactions fetched at the instant the feed resumed, rather than a backlog silently accumulated while paused. ✅ Downstream synced 2026-08-17: Output_QC/2. Test case/01_Marketing/Homepage/01_MKT_Home_TCs.md (FC_14–FC_18, FC_25–FC_27 rewritten; new FC_106/FC_107 for E_1.3.2.7/E_1.3.2.8) and References/QnA from clients/01_MARKETING_WEBSITE/UC_1.3.2_question-backlog.md (LPL-A07 marked Superseded, LPL-A08 corrected)
2026-08-17v1.15UC_1.3.4 §5 "Frequently Asked Questions (FAQ)" (new Data Source bullet), E_1.3.4.4; UC_1.5.4 §3 E_1.5.4.1, BR_1.5.4.2On-page FAQ blocks were populated by category query — each screen had its own FAQ category and rendered every item tagged with it. BR_1.5.4.2 came closest to the new model ("administrators can filter/tag and select exactly which questions appear on which specific page") but still described tag-based filtering and named no mechanism; E_1.3.4.4/E_1.5.4.1 framed the empty state as "Sanity returns an empty array" for the sectionSwitched to per-item selection via a new dedicated Sanity settings tab that lists every static page with an FAQ block; the editor picks individual items from the single master "All FAQ list" per page, in an arbitrary order, with items freely reused across pages. Mechanism is defined once at UC_1.8.8 §4.9/BR_1.8.8.5 — these two UCs now point at it instead of restating a category rule. Empty-state exceptions reframed around a missing/empty page entry rather than an empty category query. Category tags survive only as the Help Center sidebar's own groupingRef: CR-20260817-001 (client decision relayed by user, BA session, 2026-08-17). ⚠️ Downstream: SEO vertical pages (UC_1.7.x) keep their inline S12 – FAQ Items array — not covered by this CR, flagged as an open item in UC_1.8.8 §4.9
2026-08-22v1.17UC_1.3.2 §4 Post-conditions; §5.1 (dedup bullet replaced, "No New Data on a Poll Cycle" + "Initial Load" rewritten); §5.3 (Low-Volume Display + new optional Ledger Caption); §5.4 fully rewritten (Data Direction → Continuous Loop / Marquee); §5.5(a) resume-position clarifier; E_1.3.2.5 rewritten; new E_1.3.2.9; BR_1.3.2.1 amended; new BR_1.3.2.7 + BR_1.3.2.8 + BR_1.3.2.9The ticker was specified as a finite, delta-driven list: items entered from the top and pushed existing rows down; the frontend identified new rows by comparing tx_hash against client state (§5.1 "Deduplication") and animated only genuinely-new rows (§5.4 "New-Row Animation Scope"); a poll returning the same list left the component "completely static — no re-render, no flicker, no restart of any animation". Combined with the backend's 5-minute Alchemy-protection cache, this meant motion could only be triggered by a data delta — so once the initial 50 had played out, the ticker froze for the rest of the cache cycle (up to ~5 minutes), reading to visitors as a broken page. Scroll speed was also treated as "match the design video exactly", which QC had been enforcing, producing motion-blurred, unreadable rowsTicker is now an infinite bottom-to-top marquee over the latest 50. §5.4 rewritten: rows feed in at the bottom and travel upward; on reaching the oldest item with no new backend data the frontend wraps back to the start of the same set and keeps scrolling — pinned as BR_1.3.2.7 (never freeze; repeated timestamps accepted; 50 confirmed as the loop size, the 100-item alternative considered and rejected since the slower speed already makes a 50-item cycle long enough). Delta logic removed entirely: the API always returns a fixed set of exactly 50, and on refresh the frontend discards the whole in-memory set, loads the new 50, and restarts the loop from the bottom — no tx_hash diffing, no insert-position math (BR_1.3.2.8, supersedes the v1.7–v1.14 dedup model). Speed slowed with a staggered cadence (appear → travel → brief hold → continue) so real payout lines are legible; the design video's tempo is explicitly not a spec and QC must not defect against it (BR_1.3.2.9). New E_1.3.2.9 records the same-50-replay-with-repeated-timestamps case as accepted-by-design, with an optional caption ("Showing the latest 50 payout transactions, updated every 5 minutes") added to §5.3 as its mitigation. BR_1.3.2.1 clarified: the 50 cap is a data cap — a small buffer of duplicated DOM nodes for a seamless wrap does not breach it. Hover/mouseout behaviour (§5.5(a)) was reviewed and confirmed correct as-documented — only a clarifier added that the loop resumes from its frozen position; motion-bound polling (BR_1.3.2.5) and the two-pause-state model (§5.5) are unchangedDesign/UX review meeting (Adrian + Bee, relayed by user, BA session, 2026-08-22). Rationale: this is a marketing page — continuous visual motion and readability outrank real-time temporal accuracy; the frontend must also stay free of reconciliation logic so the animation stays smooth. ⚠️ Downstream not yet synced: Output_QC/2. Test case/01_Marketing/Homepage/01_MKT_Home_TCs.md (dedup/new-row-animation and freeze-after-list-end cases now invalid) and References/QnA from clients/01_MARKETING_WEBSITE/UC_1.3.2_question-backlog.md
2026-08-24v1.20UC_1.5.2 §2 step 2 — Supporting Content Cards intro (icon badges + card anatomy), Card 1 body copy + conflict note rewritten, Card 3 restructured into Description + Row list; UC_1.4.1 §3 item 6 cross-reference sentencev1.18/v1.19 transcribed the 3 cards from a partial build screenshot, which produced two defects: (1) Card 3's opening description paragraph was missing entirely — the doc jumped straight from the card heading to the cumulative row table; (2) Card 1 was documented with the MKT-30 item 2 wording "from your chosen starting tier", which the final design does not use. The card icon badges and the row-divider/alignment detail were also undocumentedRe-transcribed all 3 cards from the final design (BA confirmation, 2026-08-24). Added Card 3's description ("Competitors market 90 percent profit splits on simulated pennies…") and split the card into Description + Row list. Card 1 body copy changed to the final-design sentence "You scale your notional buying power from $25,000 all the way to $75,000,000". The previous ⚠️ note (which asserted MKT-30 item 2 as mandatory) was rewritten into a documented conflict record: final design wins per BA decision, MKT-30 item 2 marked superseded for copy only — MKT-30 items 1 and 3 remain in force — with the residual marketing-accuracy risk (hardcoded $25,000 vs the $25K/$50K/$150K Capital Allocation Paths of MKT-26) flagged openly rather than dropped. Also documented the 3 gold icon badges and Card 3's row dividers / left-right alignmentFinal design, confirmed by BA in session 2026-08-24 (MKT-45). Supersedes the partial build screenshot used in v1.18.
2026-08-24v1.19BR_1.5.2.4 rewritten from "classification pending" to a confirmed rule; new E_1.5.2.6; UC_1.5.2 §2 step 2 Card 3 bullet (intro + closing note); UC_1.4.1 §3 item 6 (sub-headline bullet + supporting-cards bullet); index.md Pricing Data map (Career Path + Associate Track rows, "Gap mới" note)v1.18 left 5 ❓ open items: 4 on Card 3 "Absolute Cash Over Fake Percentages" (Sanity-vs-hardcode, derivation/sync with Table A/B, the "Cumulative Bonuses" vs "Cumulative Cash" label mismatch, fixed-vs-editable row set) and 1 on whether the Associate Track teaser carries the MKT-30 sub-headline and all 3 cards. Card 3 was documented under an interim rule and marked pending in both the UC and the Pricing Data section mapAll 5 resolved, ❓ markers removed. Card 3 = Sanity, authored as an editable row array (Marketing can add/remove/reorder rows — the 3 current rows are content, not structure; each row carries its own label fields), no derivation or sync from Table A/B (manual content maintenance, same posture as E_1.5.2.4), and the row-1-vs-rows-2/3 label mismatch is intentional — must be preserved, not normalised. New E_1.5.2.6 covers the consequence of an editable array: FE auto-layouts any row count, hides the card if the list is empty/unpublished, and QC must not assert a hardcoded 3-row expectation. Associate Track teaser confirmed to mirror the Career Path section exactly — sub-headline present, all 3 cards rendered in full, not a reduced version — so the canonical-copy-in-UC_1.5.2 + cross-link structure from v1.18 is retained and now justified by source rather than assumptionQnA MKT-43 (Card 3 a/b/c/d) and MKT-44 (teaser parity), both BA session 2026-08-24, logged in QnA_MARKETING_WEBSITE.md. MKT-44 explicitly widens MKT-30's scope from "trang Career Path" to cover UC_1.4.1's teaser as well
2026-08-24v1.18UC_1.5.2 §2 step 2 (retitled "Timeline Graph" → ""The Career Path" Section — Timeline Graph + Supporting Cards"; new Section Header / Section Sub-Headline / Milestone Cards / Supporting Content Cards bullets), new BR_1.5.2.4; UC_1.4.1 §3 item 6 expanded + §6 Cross-Reference Notes new bullet; index.md Pricing Data section map (Career Path + Associate Track rows)The "The Career Path" section was documented as graph + hover tooltips only. Three confirmed-but-untranscribed items were missing: (1) the MKT-30 sub-headline "Your evaluation is just the starting line…"; (2) the body copy of all 3 supporting cards — UC_1.4.1 named them in a single clause with no copy, UC_1.5.2 did not mention them at all; (3) the 4 static milestone cards below the graph. Additionally, Card 3's cumulative figures ($48,178 / $391,928 / $969,428) were an undocumented fourth pricing block with no BR and no entry in the Pricing Data section mapAuthored the sub-headline, milestone-card table, and full copy of Cards 1–3 canonically in UC_1.5.2 §2 step 2, with UC_1.4.1 §3 item 6 cross-linking rather than duplicating (new §6 note records the no-duplication decision). Recorded MKT-30's two mandated wording changes explicitly: the sub-headline supersedes the old "The $499 entry fee…" string, and Card 1 must read "from your chosen starting tier" instead of a fixed "from $25,000" (consistent with the Capital Allocation Path of MKT-26). New BR_1.5.2.4 classifies Card 3 as a fourth pricing block with an interim values-Sanity/layout-hardcode rule per BR_1.3.4.1 plus interim RACI, and carries 4 ❓ open questions to the client (Sanity-vs-hardcode; derivation from Table A/B; "Cumulative Bonuses" vs "Cumulative Cash" label mismatch; whether the row set is fixed or editable)QnA MKT-30 (2026-07-24, Tiered Price Points PDF) items 1 & 2 — previously only item 3 (hover nodes) had been transcribed. Card 2/Card 3 copy and the milestone cards captured from the live build (screenshots, BA session 2026-08-24) as no client source specifies them — flagged in BR_1.5.2.4 rather than asserted as confirmed. Role labels cross-checked OK against Zapier Integration V7.pdf (Lvl 10–13 = Senior Trader 1, Lvl 14–17 = Senior Trader 2)
2026-08-20v1.16New § Shared Architecture: Cloudflare Edge Access Block under # 1. Global Layout; UC_1.1.1 §1 Overview (3rd Party), §3 Pre-conditions, §5 Basic Flow step 1, new E_1.1.1.6, new BR_1.1.1.4 + BR_1.1.1.5The Marketing UC set implicitly assumed every visitor can reach the site — §3 Pre-conditions carried the single line "User accesses a public route" and §1 Overview listed 3rd Party = —. Cloudflare was never described anywhere in the Marketing documentation; it appeared only in the Checkout UCs as a geo-IP header source (CF-IPCountry / CF-Region), never as an access-blocking layerAdded the Cloudflare edge access block as a shared access pre-condition of the Global Layout: Cloudflare blocks the entire domain (Marketing + Dashboard + Checkout) for 7 countries (Cuba, Iran, North Korea, Syria, Belarus, Russia, China) plus the 5 sanctioned Ukraine regions — the visitor cannot even see the Marketing site, because the request is dropped at the edge and never reaches Next.js. E_1.1.1.6 records that the visitor gets Cloudflare's own block page, that no Stack Trading error screen exists for this case, and that FE/BE build nothing. BR_1.1.1.4 pins this as an implicit pre-condition of every Marketing UC and draws the scope boundary against the Checkout sanctions gate. BR_1.1.1.5 records the RACI: the Cloudflare rules are configured by Stack Trading ops, not built by Sotatek, and the case is not testable on the application environment — only verifiable on the Cloudflare dashboardRef: MKT-42 (client update, Adrian Stack, 2026-08-20). ⚠️ Scope boundary: the Compliance_geo_restrictions sanctions geo-block (billing country, Gate 2) is a separate Checkout-owned topic, out of scope for this document — cross-referenced to UC_2.1.4 only. The open question on whether China gets INSERTed into that table is tracked separately as STAGE1-O-01 (QnA_STAGE1_CHECKOUT_ONBOARDING.md)
2026-08-25v1.17UC_1.1.1 § Shared Architecture: Cloudflare Edge Access BlockClient provided specific ISO region codes for the blocked Ukraine regions and explicitly added Sevastopol (UA-40)Updated the Block list to include ISO codes: Crimea (UA-43), Sevastopol (UA-40), Donetsk (UA-14), Kherson (UA-65), Luhansk (UA-09), Zaporizhzhia (UA-23)Ref: Client supplement

Glossary

For all shared project terminology, please refer to the single source of truth: Project Glossary.


Document References

#Original DocumentKey Sections Used
1RFQ_ Website and Dashboard Implementation V7.pdfMarketing
23rd_party_integrations_master.mdS12-Sanity, S13-GA4, S22-Cookiebot/Trustpilot
3QnA_MARKETING_WEBSITE.mdMKT-42 — Cloudflare edge access block (entire domain)

UC Index

ModuleUC_IDUse Case NameBusiness Description
Global LayoutUC_1.1.1Navigation & FooterGlobal header with dropdowns, sticky on scroll, dynamic CTA buttons.
Global LayoutUC_1.1.2Cookie Consent (Cookiebot)Third-party cookie consent management.
Global LayoutUC_1.1.3GA4 + GTM AnalyticsSite-wide visitor and event tracking (non-PII on FE).
CRM & AnalyticsUC_1.2.1CRM & Email Marketing SetupActiveCampaign & Klaviyo integration for form submissions.
HomepageUC_1.3.1Static Components (Next.js)Hardcoded UI blocks (Hero, Career Path, Rules, Command Center).
HomepageUC_1.3.2Live Payout LedgerScrolling ticker polling Polygon blockchain events.
HomepageUC_1.3.3Trustpilot Reviews & CommunityTrustBox widget and Testimonial carousel from backend proxy APIs.
HomepageUC_1.3.4Dynamic Content (Sanity CMS)CMS-driven blocks (FAQ, Trading Floor insights).
Associate TrackUC_1.4.1Static Components (Next.js)Hardcoded UI blocks (Hero, Rules, Benefits, Pre-Footer CTA).
Associate TrackUC_1.4.2Trustpilot ReviewsTrustBox widget and Testimonial carousel from backend proxy APIs.
Career PathUC_1.5.1Static Components (Next.js)Hardcoded UI blocks (Headers, W-2 scaling text blocks).
Career PathUC_1.5.2Interactive Timeline (API Data)24-level visualization and table fetching from Zapier/DB sync.
Career PathUC_1.5.3Trustpilot ReviewsTrustBox widget and Testimonial carousel from backend proxy APIs.
Career PathUC_1.5.4Dynamic Content (Sanity CMS)Displays the "Frequently Asked Questions" (FAQ) section which is dynamically managed by Sanity CMS.
About UsUC_1.6.1Static Components (Next.js)Hardcoded UI blocks (Company story, Mission, Founder story, "Why Us?", Regulatory pursuit).
About UsUC_1.6.2Dynamic Content (Sanity CMS)Leadership Team profiles fetched from Sanity CMS. (No FAQ on this page — see BR_1.6.2.2.)

1. Global Layout

Shared Architecture: Cloudflare Edge Access Block (applies to every Marketing page — UC_1.1.1 → UC_1.9.x)

The entire domain (Marketing + Dashboard + Checkout) sits behind Cloudflare. Cloudflare blocks access at the edge, based on the visitor's physical location, before the request ever reaches Next.js. This is a shared access pre-condition for every Marketing screen, not a rule belonging to any single page. (Ref: MKT-42 — client update, Adrian Stack, 2026-08-20.)

ItemSpecification
Blocking scopeTHE ENTIRE DOMAIN — Marketing + Dashboard + Checkout. A blocked visitor cannot even see the Marketing site.
Block list7 countries: Cuba · Iran · North Korea · Syria · Belarus · Russia · China+ the sanctioned Ukraine regions: Crimea (UA-43) & Sevastopol (UA-40) · Donetsk (UA-14) · Kherson (UA-65) · Luhansk (UA-09) · Zaporizhzhia (UA-23)
Enforcement pointCloudflare WAF / Security Rules (edge). The request never reaches Next.js or the Node.js middleware.
SignalThe visitor's physical location (edge geo-IP).
What the visitor seesCloudflare's own block page — no header, no footer, no CTA, and no Stack Trading error screen of any kind.

Not to be confused with the Checkout geo-block. The sanctions block driven by Compliance_geo_restrictions (billing country / sanctions gate) is a separate mechanism owned by Checkout — specified in UC_2.1.1 / UC_2.1.4 and out of scope for this document. The two mechanisms use different lists and neither can be derived from the other: a country blocked at Checkout can still browse the entire Marketing site.


1. Overview

FieldContent
IDUC_1.1.1
Use CaseNavigation & Footer
DescriptionVisitor sees global header with logo + nav menu and global footer across all marketing pages. Handles navigation links, dropdown menus, and dynamic CTA button states.
Zapier Flow
Zapier Table
3rd PartyCloudflare (edge access block — configured by Stack Trading ops, not code; Ref: Cloudflare Edge Access Block, MKT-42)
CMS EditabilityGlobal Footer / Global Header rows in Marketing Site — CMS Editability Scope (Overall): Layout = Hardcode; Other Content = Sanity for the footer's Market Vertical / Comparison / Insights columns and the header's Trading & Strategy mega-menu; header Insight Hub section = Sanity (1 featured); Mode Waitlist = Sanity.

2. Trigger

The user navigates to the main domain (www.stacktrading.com) or any public page on the Marketing Site (e.g., Homepage, Career Path, Compare).

3. Pre-conditions

  • User accesses a public route.
  • The request has passed Cloudflare's edge check. A visitor physically located in one of the 7 blocked countries (Cuba, Iran, North Korea, Syria, Belarus, Russia, China) or the 5 sanctioned Ukraine regions never reaches this pre-condition — the request is dropped at the edge and the header/footer are never rendered. Ref: Cloudflare Edge Access Block · MKT-42.

4. Post-conditions

  • The global header and footer are rendered.
  • CTA buttons reflect the Marketing-site signup-gate state, sourced from a Sanity CMS config variable (Ref: CR-20260731-002, supersedes prior Backend/ISR sourcing — see item 3/4 below).

5. Basic Flow

  1. User loads a marketing page. Cloudflare evaluates the edge geo-IP before the request reaches Next.js: if it matches the block list, the request is blocked at the edge and none of the steps below occur (Ref: Cloudflare Edge Access Block). Otherwise the request proceeds normally.
  2. System renders the global header and footer components.
  3. System fetches the signup-gate config variable from Sanity CMS to determine the CTA button states (Ref: CR-20260731-002, supersedes MKT-001's ISR fetch of /system/status). Stack Trading team manually updates this Sanity variable to open/close signups; there is no automatic sync between this variable and the Backend's actual Global_Var_Allow_New_Signups flag (Zapier Table C).
  4. If the Sanity signup-gate variable indicates signups are closed, all primary CTA buttons (e.g., "Earn your seat", "Start Associate Track") change their text to "Join Waitlist". Clicking them routes the user directly to the Lead Capture (Waitlist) form, bypassing the standard checkout flow (Ref: CR-20260731-002, supersedes MKT-36's Backend-flag-driven wording). Note: this is a Marketing-site display-layer mechanic only — the Checkout flow's own Gate 1 (Ref: UC_2.1.3) independently and authoritatively re-checks the real Global_Var_Allow_New_Signups value from the Backend at Checkout Step 3b, regardless of what the Sanity variable displays.

6. UI/UX Rules

  • Global Presence & CMS Control:
    • The Header and Footer must be present on almost all screens across the Marketing Site.
    • Both components and their navigation links can be dynamically edited via Sanity CMS.
  • Header Navigation:
    • Interaction: Clicking the Header logo redirects to the Homepage (same tab). Header includes two main CTA buttons on the right: "Log in" (same tab, outline) and "Start Associate Track" (same tab, solid) — clicking Start Associate Track opens the Checkout flow via a dedicated Next.js route (Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056).
    • Direct Links: The Navigation bar includes direct text links to "Associate Track", "Career Path", and "About Us". Clicking these routes the user to the respective static pages (/associate-track, /career-path, /about-us) in the same tab (Source: RFQ_ Website and Dashboard Implementation V7.pdf).
    • Hover Behavior: Hovering over the top-level nav items opens the Mega-menu dropdown smoothly. The Nav Bar hover style differs visually from the lower Navigation tables in the Trading and Resources pages.
    • Trading Dropdown (Mega-menu):
      • Editable via Sanity CMS. Layout uses a dark/glassmorphism theme.
      • Split into two columns: Markets (Futures Traders, Forex Traders, Crypto Traders) and Strategies (News & Events, Scalping, Swing Trading).
      • Each item contains an Icon, Title, and Subtitle description. Hovering over an item highlights it with a distinct background.
      • Crypto Link: Currently not implemented. Clicking it routes (same tab) to the "Coming Soon Page".
    • Resources Dropdown (Mega-menu):
      • Editable via Sanity CMS.
      • Left Area (Resources): Contains 6 items arranged in 2 columns (e.g., The Rules, The Trading Floor, Insights, Compare, Partners, Help Center/FAQ). Each item has an Icon, Title, and Subtitle.
      • Right Area (Featured Article): Displays a selected article (e.g., "Static vs Trailing Drawdown") with a background thumbnail, description, and a "Read Article" link (managed via Sanity).
    • Dropdown Limit: Maximum of 5 items per column in the dropdown menus (Source: MKT-23).
    • Responsive Behavior: Handled dynamically based on FE developer implementation (e.g., mobile hamburger menu, sticky on scroll).
  • Footer:
    • Editable via Sanity CMS.

    • Divided into 5 main columns based on the wireframe layout:

      • Company: About Us, The Trading Floor, Partners, The Rules, Help Center / FAQ.
      • Trading: Futures, Forex, Crypto, Associate Track, Scalping, Swing Trading, News Trading, HFT, Career Path.
      • Compare: e.g., Stack vs Topstep, FTMO, Apex, etc. Must include an "All Comparisons" link at the bottom (Max 6 items rule - Source: MKT-23).
      • Resources: e.g., What is Funded Account, What is a Combine, etc. Must include an "All Insights" link at the bottom (Max 6 items rule - Source: MKT-23).
      • Follow us on: Contains the Social Icons and the Trustpilot Widget.
    • Company & Social Links: Must include the following explicit social icons and links:

      • Icon X: https://x.com/StackTradingUS
      • Icon Discord: https://discord.com/invite/SpMqnSEDsA
      • Icon LinkedIn: linkedin.com/company/stacktrading
      • Icon YouTube: https://www.youtube.com/@StackTrading
    • NFA Membership Statement: Below the "Backed by institutional infrastructure" logo ticker, a standalone text line reads: "Stack Trading Brokerage LLC is a member of NFA and is subject to NFA regulatory oversight and examinations. NFA ID: 0580183." (Source: Client Slack confirmation, Adrian, 2026-07-30 — same confirmed NFA ID used in UC_1.3.1 §5 and UC_1.6.1 §3 item 6.)

    • Legal Links & Text Blocks: The bottom area contains static text blocks for "Corporate and Regulatory Status", "Risk Disclosure", and "Service Classification and Tax Disclosure". The "Corporate and Regulatory Status" block explicitly states:

      "Stack Trading Brokerage LLC is a registered Introducing Broker with the Commodity Futures Trading Commission (CFTC) and a Member of the National Futures Association (NFA ID: 0580183). Stack Trading C Corp is a proprietary trading firm and does not act as a broker or dealer for the public. All Associate Track accounts are simulated and do not involve real capital."

      The exact body copy for all three blocks is hardcoded per the approved wireframe (Ref: Footer Loop Animation wireframe/motion references above). Explicit links to Risk Disclosures, Terms of Service, and Privacy Policy route (same tab) to the respective static utility pages (UC_1.9.3, UC_1.9.2, UC_1.9.1).

      • Hover behavior: Hovering over these explicit legal links adds an underline to the text and the cursor changes to a pointer (👆).
    • Backed by Institutional Infrastructure: Includes a scrolling logo ticker with motion effects (e.g., Mastercard, ATAS, Quantower). (Link: https://drive.google.com/drive/folders/1HN2mivRaafnttq2xLdYJis5efxB_VhcV). Note: NinjaTrader is replaced by TradeSea.

    • Trustpilot Widget (Micro Combo):

      • 1. Discovery Phase: User scrolls to the footer and sees the lightweight Micro Combo widget (loads instantly without lag). Displays a small Trustpilot logo + 5 green stars (colored by actual TrustScore, e.g., 4.5/5) + Total review count (e.g., "4.8 | 1,250 reviews").
      • 2. Hover Phase: Hovering over the widget changes the cursor to a Pointer (👆). Optionally displays a slight color change or tooltip "Check our reviews on Trustpilot".
      • 3. Action Phase: Clicking the widget opens a New Tab, preserving the current browser session.
      • 4. Destination Phase: Redirects to the official Trustpilot profile: https://www.trustpilot.com/review/stacktrading.com.
      • 5. Data Fetching & Fallback: To avoid exposing the API key on the frontend, the widget fetches the real-time aggregate score and review count via a backend proxy endpoint (GET /community/trustpilot-stats) with a 60-minute cache (Source: MKT-04, 3rd_party_integrations_master). There is no real-time listener — the score/count is only re-fetched when a page is loaded, and the fetched value is shared/reused for up to 60 minutes before the next fetch happens; a user who keeps the page open will not see the number update until they reload the page. This widget (score + review count) is a required component. If the proxy call fails, the system must either (a) hide the widget completely, or (b) keep showing the most recently cached score/count (from the last successful fetch, within the 60-minute window) — it must not be replaced by a separate fixed/pre-set number, and it must never show a broken state (error text, empty box) (Source: Slack thread 2026-07 — Adam Culver, Adrian; QnA_TRUSTPILOT_UIUX.md TP-A11, TP-A15).

7. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.1.1.1Sanity Signup-Gate Variable Stale/Not Yet Updated (CR-20260731-002, supersedes prior "ISR Cache Delay" framing, MKT-001)The Marketing site's CTA button text reads the signup-gate config variable from Sanity CMS, manually maintained by the Stack Trading team. If the Backend's real Global_Var_Allow_New_Signups flips to FALSE before the team updates the Sanity variable, the Marketing UI may still render the "Checkout" button text/action.
E_1.1.1.2Trustpilot API Failure (MKT-04)The backend proxy GET /community/trustpilot-stats fails, times out, or returns 5xx error.
E_1.1.1.3Sanity CMS Fetch Failure (Nav/Footer links, Mega-menu, Featured Article)The Header/Footer nav items and Resources Mega-menu "Featured Article" block are CMS-driven (Source: this UC §6 "Global Presence & CMS Control"). Sanity API fails or times out on page load.
E_1.1.1.4Crypto Traders Link Clicked (Not Yet Implemented)User hovers/clicks the "Crypto Traders" item inside the Trading Mega-menu.
E_1.1.1.5Nav/Footer Item Limit Exceeded in Sanity CMS (MKT-23)A content editor adds more items than the defined limit (5 per Mega-menu column; 6 for Footer Compare/Resources columns) via Sanity CMS.
E_1.1.1.6Cloudflare Edge Block (MKT-42)A visitor physically located in one of the 7 blocked countries (Cuba, Iran, North Korea, Syria, Belarus, Russia, China) or the 5 sanctioned Ukraine regions requests any URL on the domain.

8. Business Rules

BR_IDRule Description
BR_1.1.1.1Mega-menu Dropdown Item Limit (MKT-23): Trading and Resources Mega-menu dropdowns must not exceed 5 items per column.
BR_1.1.1.2Footer Column Item Limit (MKT-23): Footer "Compare" and "Resources" columns must not exceed 6 items each, and must always terminate with an "All Comparisons" / "All Insights" link respectively. The Footer "Trading" column has no item limit.
BR_1.1.1.3External Link Target: All social icons (X, Discord, LinkedIn, YouTube) and the Footer Trustpilot widget must open the external destination in a new tab (target="_blank"), consistent with BR_1.3.2.2.
BR_1.1.1.4Cloudflare Edge Block Is an Access Pre-condition for Every Marketing Page (MKT-42): Every UC in this document assumes the visitor has already passed Cloudflare's edge check. A visitor physically located in one of the 7 blocked countries (Cuba, Iran, North Korea, Syria, Belarus, Russia, China) or the 5 sanctioned Ukraine regions cannot reach any Marketing page at all — there is no alternative flow and no Stack Trading notice screen. This mechanism is entirely independent of the Compliance_geo_restrictions sanctions geo-block at Checkout (UC_2.1.4): the two lists are different and neither may be derived from the other — a country blocked at Checkout still browses the full Marketing site. Ref: Cloudflare Edge Access Block.
BR_1.1.1.5RACI — The Cloudflare Block Is Ops Configuration, Not Build Scope (MKT-42): The edge block is delivered purely by configuring country rules on the Cloudflare dashboard (WAF / Security Rules), done by Stack Trading ops. Sotatek builds NO middleware, guard, redirect, or block screen at the application layer — the request is stopped at the edge and never reaches Next.js/Node.js. QC implication: this case cannot be tested on the application environment; it can only be verified by inspecting the rules on the Cloudflare dashboard.

1. Overview

FieldContent
IDUC_1.1.2
Use CaseCookie Consent (Cookiebot)
DescriptionFirst-time visitors are presented with a Cookiebot banner to manage their consent preferences. Third-party scripts respect this consent state.
Zapier Flow
Zapier Table
3rd PartyCookiebot (Consent Management)

2. Trigger

A user visits the Marketing Site for the first time without a stored consent state.

3. Pre-conditions

  • The user's browser does not have a Cookiebot consent cookie.

4. Post-conditions

  • User's consent preferences are stored.
  • Third-party scripts (GA4, Klaviyo, ActiveCampaign) are either loaded or blocked based on the consent categories accepted.

5. Basic Flow

  1. System embeds the Cookiebot JavaScript snippet.
  2. The Cookiebot banner appears on the page.
  3. User interacts with the banner (accepts all, rejects all, or customizes consent categories).
  4. Consent state is stored in the browser.
  5. The banner is hidden for subsequent visits.

6. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.1.2.1User Rejects CookiesIf the user explicitly rejects marketing/analytics cookies, the third-party scripts (GA4, CRM tracking) will not be injected into the DOM. UC_1.1.3 (GA4+GTM) and UC_1.2.1 (CRM) tracking is fully suppressed for this session.
E_1.1.2.2Cookiebot Script Fails to LoadIf the Cookiebot JS snippet fails to load (network error, CDN outage).
E_1.1.2.3User Revokes Previously Granted ConsentIf the user re-opens the Cookiebot preference center (e.g., via footer "Cookie Settings" link, if present) and downgrades consent after scripts were already loaded.
E_1.1.2.4Returning User with Expired Consent CookieCookiebot consent cookies typically expire after a set period (commonly 12 months). When the stored consent cookie expires, the banner must re-appear on the next visit as if it were a first-time visitor (per §2 Trigger), re-prompting for consent.

7. Business Rules

BR_IDRule Description
BR_1.1.2.1Consent Categories: The Cookiebot banner must expose at minimum "Accept All", "Reject All", and a granular "Customize" option distinguishing Necessary, Analytics, and Marketing cookie categories, per standard Cookiebot configuration.
BR_1.1.2.2Blocking Before Consent: No analytics or marketing script (GA4, GTM, Klaviyo, ActiveCampaign) may fire before the user has made an explicit consent choice — scripts are gated behind Cookiebot's consent state, not loaded-then-suppressed.

UC_1.1.3 — GA4 + GTM Analytics

1. Overview

FieldContent
IDUC_1.1.3
Use CaseGA4 + GTM Analytics
DescriptionSite-wide visitor behavior tracking to measure marketing performance without exposing PII to Google Analytics.
Zapier Flow
Zapier Table
3rd PartyGoogle Analytics 4, Google Tag Manager

2. Trigger

User navigates through the site, clicks CTAs, or submits forms.

3. Pre-conditions

  • User has granted cookie consent for analytics/marketing (UC_1.1.2).

4. Post-conditions

  • Events are pushed to the GTM Data Layer and sent to GA4.

5. Basic Flow

  1. GTM container snippet is deployed across all public pages.
  2. System tracks "virtual page views" via Next.js router history changes to accurately measure time-on-page (Source: MKT-37).
  3. On CTA clicks and checkout funnel progression, system pushes event tags to the GTM Data Layer.
  4. On form submissions (e.g., Waitlist, Newsletter), the system pushes non-PII parameters (event_name, form_id, page_location, and UTM parameters) to the Data Layer. PII is strictly excluded from being sent to GA4 (Source: MKT-37).
  5. For Paid Ads attribution (Closed-Loop), Frontend Next.js pushes user data directly to the GTM Data Layer where GTM handles hashing and transmission to Meta CAPI/Google Enhanced Conversions (Source: MKT-37).

6. Event Specifications & Screen Mapping

  • Scope: Analytics tracking is injected universally across all Marketing Site screens (Homepage, Associate Track, Career Path, About Us, Legal Pages).
  • How it is used: Every primary Call-to-Action (CTA) button and form submission on these screens is bound to a GTM click event to track user conversion journeys.
  • Event name: click_cta_*
  • Parameters we send:
ParameterRequiredExample
click_textYes"Start Associate Track"
click_locationYes"home_hero-section"
click_urlNo"/associate"
  • Auto-captured by GA4 (no code needed): page URL, page title, session ID, engagement time.
  • Location format: {page}_{section} in kebab-case.
  • Mapping on Specific Screens:
    • Homepage: Applies to the "Claim My Founding Member Seat" buttons (in Hero & Pre-footer), the "Verify On-Chain" button (in the Ledger block), and Newsletter form submissions. (Example locations: home_hero-section, home_pre-footer).
    • Associate Track / Career Path: Applies to the primary CTAs routing to Checkout or Waitlist flows. (Example locations: associate-track_hero-section, career-path_teaser).
    • About Us: Applies to the Pre-footer CTAs. (Example location: about-us_pre-footer).
    • Contact Us / FAQ / Legal Pages: Tracks clicks on email links, contact form submissions, and document downloads.

7. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.1.3.1Analytics Consent Not Granted (UC_1.1.2)User rejected analytics/marketing cookies via Cookiebot.
E_1.1.3.2PII Accidentally Present in Form Payload (MKT-37)A form submission event payload (e.g., Waitlist, Newsletter) inadvertently includes a raw PII field (email, name, phone) in the Data Layer push.
E_1.1.3.3GTM Container Fails to LoadGTM script fails to load (network error, ad-blocker, CDN outage).

8. Business Rules

BR_IDRule Description
BR_1.1.3.1No PII to GA4 (MKT-37): Under no circumstance may raw PII (email, full name, phone number) be pushed to the GTM Data Layer in a form consumable by GA4.
BR_1.1.3.2Consent-Gated Firing: All GA4/GTM tags must respect the Cookiebot consent state (UC_1.1.2) — no tag fires prior to explicit user consent for the Analytics/Marketing category.

2. CRM & Analytics

UC_1.2.1 — CRM & Email Marketing Setup

1. Overview

FieldContent
IDUC_1.2.1
Use CaseCRM & Email Marketing Setup
DescriptionIntegration with ActiveCampaign for site tracking (and CRM system of record) and Klaviyo for email marketing (Newsletter and Waitlist forms dual-send).
Zapier Flow
Zapier Table
3rd PartyActiveCampaign, Klaviyo

2. Trigger

User submits a Newsletter or Waitlist form.

3. Pre-conditions

  • ActiveCampaign site tracking JS snippet is embedded.

4. Post-conditions

  • The user's contact info and marketing source are saved in the CRM.

5. Basic Flow

  1. User enters their email in the Newsletter form (footer) or the Waitlist form.
  2. Frontend performs client-side validation on the email field before submission (see §6 UI Rules).
  3. Frontend triggers parallel APIs/webhooks directly to BOTH Klaviyo and ActiveCampaign with the data payload (including UTM parameters). Klaviyo handles email delivery, while ActiveCampaign acts as the CRM system of record mapping the lead to site tracking behavior. This bypasses the Node.js middleware and Zapier entirely (Source: MKT-21, MKT-002, MKT-41).
  4. The CRM system automatically deduplicates and sorts the leads.
  5. Klaviyo automatically triggers the relevant email sequence (Newsletter: Ref: KLA-02 / Waitlist: Ref: KLA-22) without using AWS SES (Source: MKT-19).

6. UI Rules — Form Validation & States

Per dedicated wireframe states Invalid email.png and Subscribe successfully.png (Source: References/Wireframe/Marketing Site/Insight System/), the Newsletter/Waitlist email field has distinct error and success UI states in addition to the default/empty state:

  • Default State: Empty input field with placeholder text (e.g., "Enter your email") and a submit button/icon.
  • Invalid Email State: If the submitted value fails email format validation (client-side regex check), the field displays an inline error state (bordered/highlighted in an alert color) with the error message: "Please enter a valid email address".
  • Success State: On successful submission, the form shows a confirmation state (e.g., checkmark icon + confirmation message) replacing the input field with the text: "You are subscribed".

7. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.2.1.1Invalid Email Format (Ref: CR-09)User submits a value that fails email format validation (e.g., missing "@", missing domain).
E_1.2.1.2Duplicate Email SubmissionUser submits an email address already present in the CRM (already subscribed/already on waitlist).
E_1.2.1.3Klaviyo or ActiveCampaign API FailureEither direct frontend-to-CRM webhook call fails, times out, or returns a non-2xx response.
E_1.2.1.4Empty Submission (Ref: CR-09)User clicks Submit with an empty email field.
E_1.2.1.5Analytics Consent Not GrantedUser rejected cookies (UC_1.1.2).

8. Business Rules

BR_IDRule Description
BR_1.2.1.1Client-Side Email Validation: The Newsletter and Waitlist forms must validate the email field format client-side before triggering the direct dual API/webhook calls to Klaviyo and ActiveCampaign.
BR_1.2.1.2Direct CRM Call, No Middleware (MKT-21, MKT-002, MKT-41): Newsletter/Waitlist submissions must call BOTH Klaviyo and ActiveCampaign directly from the frontend (dual-send), bypassing the Node.js middleware and Zapier.
BR_1.2.1.3No AWS SES for Confirmation Emails (MKT-19): The confirmation/sequence email triggered after a successful Newsletter/Waitlist submission must be sent by Klaviyo automation, not AWS SES.

3. Homepage

UC_1.3.1 — Static Components (Next.js)

1. Overview

FieldContent
IDUC_1.3.1
Use CaseStatic Components (Next.js)
DescriptionProvides the static UI layout for the homepage and other core pages, including hardcoded content and specific visual behaviors.
Zapier Flow
Zapier TableTable C (Global_Var_Allow_New_Signups) — the flag's authoritative value/enforcement, checked at Checkout Step 3b (UC_2.1.3); the Marketing site's CTA button display now reads a mirrored Sanity CMS config variable instead of this table directly (Ref: CR-20260731-002).
3rd PartySanity CMS (signup-gate CTA config, Ref: CR-20260731-002)
CMS EditabilityHomepage row in Marketing Site — CMS Editability Scope (Overall): Layout = Hardcode; Pricing Data / FAQ / Insight Hub section = Sanity; Other Content = Hardcode; Mode Waitlist = Sanity. Pricing Data section: "Real Capital → W-2 Career Path" (§5) — ⚠️ this UC currently only documents the section's 2 CTA buttons; its Sanity capital/career-progression data has not yet been itemized (gap, needs wireframe cross-check). (Separately, "Community / Social Proof" carries the founder_count-driven "12,000+ traders" text, and "Pre-Footer CTA" carries the $499/$650 founder pricing — both already fully documented but tracked under Mode Waitlist/CTA-pricing, not this Pricing Data section.) See index.md Pricing Data section map. Ref: MKT_PRICING_DISPLAY_SCOPE.

2. Trigger

User scrolls through the Homepage or related static pages. Entry points to the Homepage include: direct URL/domain entry, clicking the Header logo from any page (UC_1.1.1 §6 "Header Navigation"), or the 404 Error Page's "Back to homepage" button (UC_1.9.4 §5 item 3).

3. Pre-conditions

  • User accesses the Homepage.

4. Post-conditions

  • Static components are rendered as per the Orizon design system.

5. Basic Flow & UI Rules

The Homepage consists of several hardcoded static sections. The general UI rules are as follows:

  • Hero Section (Homepage):
    • Content: Heading "Real Capital. Real Careers. No Games." and introductory subtext.
    • Motion Rules: Link motion.
    • Buttons:
      • Earn Your Seat (Gold button): Click opens the Checkout flow (same tab) via a dedicated Next.js route (Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056).
      • Learn How It Works (Text link with arrow): Click redirects (same tab) to the Start Associate Track page.
    • Global Waitlist Mode: If the Sanity-configured signup-gate variable indicates signups are closed, the gold Earn Your Seat button retains its position and style but the text changes to "Join Waitlist". Clicking it opens the Waitlist form (same tab) instead of Checkout (Ref: CR-20260731-002, supersedes MKT-36's Backend-flag-driven wording).
  • Your Command Center:
    • Content & Layout: Left side contains a vertical menu of 4 features: Cinematic P&L Tracking, The Pulse Meter, The Desk Manager, Live Squawk Box. Right side dynamically updates based on the active left-side selection.
      • Cinematic P&L Tracking: Displays the PNL Gauge.
      • The Pulse Meter: Displays a line chart monitoring erratic execution velocity.
      • The Desk Manager: Displays a vertical stack of trade feedback cards (e.g., "Trade #NQ-7112 :: Discipline fail").
      • Live Squawk Box: Displays an audio waveform with a "Live" icon.
    • Motion Rules: The left-side menu automatically scrolls through the rows every 3 seconds in a marquee/carousel loop. Simultaneously, the right-side preview smoothly transitions to the corresponding image (e.g., Row 1 links to Image 1, Row 2 links to Image 2). Upon hover, rows display interactive visual effects and reflect the clickable trigger state. Clicking any row permanently pauses the auto-scroll/marquee sequence for the current session (until the user reloads the page) and immediately displays its associated preview.
  • The Industry Has a Trust Problem (Comparison Table):
    • Buttons:
      • See the Rules (Dark button): Click redirects (same tab) to the Rules Page.
      • Start Associate Track (Gold button): Click leads to the Checkout flow (same tab) (or changes to "Join Waitlist" opening the Waitlist form, same tab, if the Sanity-configured signup-gate variable indicates signups are closed, Ref: CR-20260731-002, supersedes MKT-36's Backend-flag-driven wording).
  • Real Capital → W-2 Career Path:
    • Buttons:
      • Explore Career Path (Dark button): Click opens the Career Path Page (same tab).
      • Start Associate Track (Gold button): Click leads to the Checkout flow (same tab) (or changes to "Join Waitlist" opening the Waitlist form, same tab, if the Sanity-configured signup-gate variable indicates signups are closed, Ref: CR-20260731-002, supersedes MKT-36's Backend-flag-driven wording).
  • Prop Firm Trading Rules:
    • Content: Heading "Prop Firm Trading Rules: Six Rules, No Hidden Clauses". Bottom banner for "Radical Transparency".
    • Button: Read the Full Terms & Conditions (Dark button): Click redirects (same tab) to the Terms of Services page.
  • Built for Your Market:
    • Content:
      • Left-side market tabs: Futures Traders, Forex Traders, Crypto Traders.
      • Futures Traders card (index 01):
        • "Rithmic powered platforms (Quantower, ATAS, Motivewave, Sierra Chart, Tradesea)"
        • "CME Level 2 Professional Market Data reimbursed at Level 3, and covered going forward"
        • "Trade ES, NQ, CL and more"
      • Forex Traders card (index 02):
        • "Swap column support"
        • "Overnight trading allowed"
        • "Major and minor pairs"
      • Crypto Traders card (index 03):
        • "Bitcoin, Ethereum, and more"
        • "Institutional custody"
        • "Details TBD"
    • Motion Rules: (Ref: MKT-40, Link motion). The main container flips between markets. Clicking a text card stops the container animation.
    • Interaction: Clicking Learn More under a specific market card (Futures Traders, Forex Traders, Crypto Traders) redirects (same tab) the user to the corresponding SEO Page (e.g., Futures -> SEO Page Futures).
  • Community / Social Proof:
    • Content:
      • Heading: "Join 12,000+ traders building their careers with Stack".
      • Subtext: "You're not joining a platform — you're joining a community of serious traders who chose structure, real capital, and a path that actually leads somewhere."
      • Visual: Displays an orbital UI with circular avatar cards along a curved path.
    • Display Logic: The Marketing team manually updates the remaining Founder seat count in Sanity CMS (founder_count) daily (Ref: CR-20260731-001 — no BE/DB fetch for this display). Sanity calculates and outputs the final result from that manually-set value. If founder_count < 500, displays default text "Join now and build your career with Stack". If founder_count >= 500, it dynamically injects the calculated number, displaying the exact text: "Join [calculated_number]+ traders building their careers with Stack" (Ref: MKT-01, MKT-16; superseded fetch mechanism — CR-20260731-001).
    • Button: View Community: Click opens the Trading Floor / Community Page (same tab).
  • Trading Floor Video Block:
    • The "video" is actually a static image with a scrolling marquee/ticker effect. The Play button is grayed out and has no click action (Source: MKT-12).
    • The View all News button redirects the user directly (same tab) to the Insights Hub (Source: MKT-11).
  • Pre-Footer CTA ("Stop Gambling. Start Your Career."):
    • Data Source (Ref: CR-20260731-001): Both the original price and the discounted price are pre-configured as Sanity fields, along with the founder_count/remaining-seat-count value the Marketing team updates daily. The FE does not fetch or calculate either price from the Backend/Table J — it only reads the two pre-set price fields and picks which one to render based on the Sanity-configured seat count. No BE/DB call is made for this display.
    • Layout & Content (State 1: Founder Slots <= 500): Glassmorphism Box Text shows original price crossed out and discounted price ("$650 $499" / "Associate Track Entry"). Button text: "Begin The Associate Track - $499".
    • Layout & Content (State 2: Founder Slots > 500): Glassmorphism Box Text shows "Evaluations starting at $650". Button text: "Begin The Associate Track" (price is removed from the button). Subtext ("Regulated / Real Capital / Static Drawdowns / W-2 Career") is placed entirely below the glass box for readability (Source: MKT-31).
    • Motion Rules:
      • Background Text Motion: Contains a background slow gradient blur motion effect where the faint text "Stop Gambling. Start Your Career." scrolls from right to left, and the middle text is highlighted. (Link motion).
      • Subtext Motion: The Subtext row ("Regulated / Real Capital / Static Drawdowns / W-2 Career") at the bottom of the card runs a continuous small scrolling marquee motion effect from right to left.
    • Price Logic & Race Condition (MKT-34): This applies only at Checkout, not on the Marketing site display. If a user clicks the \$499 button while the Marketing site is still showing the discounted state (because Sanity's manually-updated seat count has not yet been bumped past 500 by the Marketing team), Frontend still routes them to Checkout. Backend POST /calculate-cart acts as source of truth at Checkout time and automatically calculates the correct price (standard base price if the Founder cohort is actually full). NO error popup is shown to the user on the Marketing site. Since Sanity's seat count is now a manually-updated value (not a live backend read), this display-vs-checkout mismatch window depends on how promptly the Marketing team updates Sanity, rather than on ISR/cache revalidation timing.
    • Buttons:
      • Begin The Associate Track: Click opens the Checkout flow (same tab, Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056) (or changes to "Join Waitlist" opening the Waitlist form, same tab, if the Sanity-configured signup-gate variable indicates signups are closed, Ref: CR-20260731-002, supersedes MKT-36's Backend-flag-driven wording).
      • Talk to Us: Auto-opens the default mail client (mailto:support@stacktrading.com).
  • Institutional Infrastructure & Regulatory Footer:
    • Logo Ticker: Scrolling marquee effect (Link motion). NinjaTrader is replaced by TradeSea. (Ref: MKT-29, MKT-39).
    • Trustpilot (Micro Combo): Frontend calls proxy API GET /community/trustpilot-stats (60-minute cache) to fetch real-time TrustScore and total reviews (to avoid exposing the API key on the FE, per MKT-04). The UI displays the Trustpilot logo, 5 green stars, and review count. Unlike the footer, the Trustpilot widget in this section is for view-only; there is NO hover effect and it is NOT clickable. As with the footer instance, this data is only refreshed on page load and reused for up to 60 minutes (no live/real-time update while the page stays open) — see UC_1.1.1 §6 "Trustpilot Widget (Micro Combo)". This widget is a required component; on fetch failure it must hide or keep showing the last cached score/count, never a broken state.
    • NFA ID: Text reads "Stack Trading Brokerage LLC is a member of NFA and is subject to NFA regulatory oversight and examinations. NFA ID: 0580183".

6. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.3.1.1NFA ID Pending[Removed]
E_1.3.1.2Race Condition on 500th Slot (MKT-34)User views Pre-Footer CTA with discount because Sanity's manually-updated founder_count still shows <= 500 (Marketing team has not yet bumped the count to reflect the cohort filling up). User clicks the button and is routed to Checkout.
E_1.3.1.3Sanity Fetch/Publish Failure (founder_count unavailable, Ref: CR-20260731-001)Frontend fails to fetch the founder_count/pricing fields from Sanity on page load (CMS timeout, unpublished document, or malformed content).
E_1.3.1.4Trustpilot Micro Combo Fetch Failure (Institutional Infrastructure section)The GET /community/trustpilot-stats proxy call fails for the view-only Trustpilot widget in the "Institutional Infrastructure" section.
E_1.3.1.5founder_count Exactly at Boundary (499 vs 500)founder_count sits exactly at the 500 threshold used by both the "Community/Social Proof" text logic (MKT-01, MKT-16) and the Pre-Footer CTA pricing state (MKT-31, MKT-34).
E_1.3.1.6Built for Your Market — Animation Interrupted Mid-FlipUser clicks a market text card (Futures/Forex/Crypto) while the auto-flip animation (MKT-40) is mid-transition.

7. Business Rules

BR_IDRule Description
BR_1.3.1.1NFA Verify Link: [Removed] There is no Verify Status link in the design.
BR_1.3.1.2Mailto Link: The Talk to Us button must trigger a mailto: action with the predefined destination email support@stacktrading.com.
BR_1.3.1.3Pre-Footer Price Calculation (Ref: CR-20260731-001): The pre-footer CTA must check the founder_count/seat-count state as configured in Sanity (manually updated daily by the Marketing team — no BE/DB fetch). If slots <= 500, display the Sanity-configured discounted price. If slots > 500, display the Sanity-configured standard base price. Both price values are pre-set in Sanity; the FE only selects which one to render.
BR_1.3.1.4Global Signups Disabled (CR-20260731-002, supersedes MKT-36 Backend-flag-driven wording): When the Sanity-configured signup-gate variable indicates signups are closed, all gold primary CTA buttons (Earn Your Seat, Start Associate Track, Begin The Associate Track) must update their text to "Join Waitlist" and their click action must route to the Waitlist Lead Capture form. Visual styling and positioning must remain unchanged. Note: this is a Marketing-site display rule — the authoritative signup gate is still enforced independently at Checkout Step 3b by the Backend (Ref: UC_2.1.3).
BR_1.3.1.5Trading Floor Video Block Is Non-Interactive (MKT-12): The Play button on the "Trading Floor Video Block" must remain visually grayed-out and must not bind any click handler, since the block is a static image with a scrolling ticker, not an actual video.
BR_1.3.1.6View All News Redirect (MKT-11): The View all News button must redirect directly to the Insights Hub, not to an intermediate page.

UC_1.3.2 — Live Payout Ledger

1. Overview

FieldContent
IDUC_1.3.2
Use CaseLive Payout Ledger
DescriptionA scrolling ticker that displays real payout transactions fetched from the Polygon blockchain.
Zapier Flow
Zapier Table
3rd PartyPolygon PoS, Alchemy

2. Trigger

User views the section containing the Payout Ledger ticker.

3. Pre-conditions

  • The backend cron job is active and syncing blockchain events.

4. Post-conditions

  • The ticker smoothly and continuously scrolls the latest 50 payouts, looping without ever coming to a stop.

5. Basic Flow & UI Rules

  1. API Integration:

    • Frontend polls the GET /public/ledger endpoint every 5 minutes. This is a plain REST poll (no WebSocket or other push channel). All clients poll on the same synchronized, system-wide schedule (aligned to fixed intervals rather than offset from each individual page-load time), so concurrent visitors' ledgers stay in lock-step and do not drift apart based on when each one happened to load the page.
    • Full-Snapshot Replacement — no delta, no client-side dedup: GET /public/ledger always returns a fixed set of exactly the 50 latest transactions (never a delta of "the 2–3 new ones"). The backend does not track what any individual client has already displayed. On each refresh the frontend performs one simple operation: discard the entire 50-item set held in browser memory, load the new 50-item set, and restart the scroll loop from the bottom (§5.4). The frontend must not implement tx_hash diffing, insert-position calculation, or any other old-vs-new comparison algorithm — this is a deliberate performance decision (BR_1.3.2.8), chosen so motion stays smooth without the frontend carrying reconciliation logic.
    • Backend queries Polygon event logs (via Alchemy) for CorporateMetricVerified events and returns: (a) total_verified_milestones — the all-time count of every event ever emitted, and (b) recent_events — the 50 most recent logs ever emitted (i.e., always the latest 50 across the entire on-chain history, not merely whatever occurred within the last 5-minute window). The combined payload is cached server-side with a 5-minute TTL.
    • Initial Load: On first page load, the frontend must immediately render the full response (all 50 items) as soon as it arrives — the ticker must look full and active the moment the page loads. It must not start from an empty container and animate items in one at a time. The continuous scroll loop (§5.4) then starts from this already-populated state.
    • No New Data on a Poll Cycle: If a given 5-minute poll returns the same 50 recent_events as the previous cycle (no new transactions occurred), the frontend performs no replacement and no loop restart — the continuous loop (§5.4) simply keeps running on the set already in memory, with no re-render, no flicker, and no visible reset. The ticker therefore never comes to a stop while waiting for new data (BR_1.3.2.7).
    • Motion-Bound Polling (fetching follows motion): The 5-minute poll runs only while the ticker is in motion. Any interaction that stops auto-scroll — hover pause, manual-scroll pause, or mobile tap-pause (§5.5) — also suspends background fetching; the frontend does not fetch, buffer, or queue data while paused. When motion restarts, the frontend fires a fetch immediately at that moment to retrieve the latest transactions rather than waiting for the next scheduled tick, then realigns to the shared system-wide schedule. Consequence: a paused ledger is a frozen snapshot — it never silently accumulates unseen rows in the background.
    • Tab Refocus: If the browser tab was backgrounded (inactive) and the user returns to it after the 5-minute interval has lapsed, the frontend refreshes the ledger data immediately upon regaining focus, rather than waiting for the next scheduled poll tick. This applies only when the ticker is in its live (in-motion) state; if the feed was left paused, refocus does not trigger a fetch — the pause takes precedence, and data only refreshes when motion restarts per §5.5.
  2. Header & Status Bar:

    • Heading: "Live Cryptographic Ledger" with descriptive subtext. (Motion reference)
    • Status Bar: Displays "Global Payout Fulfillment: 🔒 100%" and dynamically shows total "Verified Milestones".
  3. Traders List (Ledger Cards):

    • Card Data: Trader wallet snippet (e.g., Trader 0x1234abcd), milestone type (e.g., Equity bonus, W2 Offer Executed), timestamp, and date.
    • Timestamp Display Format: The backend returns the raw event timestamp as a UTC time string; the frontend parses it and renders it into two separate UI elements, each with independent formatting rules — the wireframe's placeholder text showing a combined time+date in both fields for every row was a designer error and must not be implemented as-is:
      • Clock Icon Field (Time): Under 24 hours old → relative time (e.g., "5 minutes ago", "2 hours ago"). Over 24 hours old → static absolute UTC time (e.g., "20:39 UTC").
      • Calendar Icon Field (Date): Always the absolute UTC date only, formatted as "28 Feb, 2026" — this field never includes a time component, regardless of transaction age.
    • Action: Verify On-Chain button. Clicking this redirects the user externally to Polygonscan. The frontend must append the unique transaction hash provided in the API payload to the base Polygonscan URL. This link must open in a separate browser tab to display the permanent cryptographic receipt.
    • Low-Volume Display: If fewer than 50 transactions exist system-wide (e.g., shortly after launch), the ticker renders exactly the number of real transactions available — it must not pad the list with placeholder/duplicate rows. The container's layout/styling should be designed so a shorter list still looks intentional rather than visibly empty. The continuous loop (§5.4) then cycles over whatever smaller set exists, at the same speed and cadence.
    • Ledger Caption (optional, pending client confirm): A small caption may be placed directly beneath the ticker to set the user's expectation that the list is a periodically-refreshed sample rather than a live tape — proposed wording: "Showing the latest 50 payout transactions, updated every 5 minutes." This exists to pre-empt the "why am I seeing the same timestamps again" reaction produced by the continuous loop (BR_1.3.2.7). ❓ Proposed by Adrian as conditional ("if needed") — final copy and whether to display it at all are not yet confirmed.
  4. Motion Logic — Continuous Loop (Marquee):

    • Motion Direction: The ticker runs as a bottom-to-top marquee — rows are fed in at the bottom edge of the container and travel upward, exiting at the top. The 50-item set is fed in newest-first, so at steady state the most recent transaction is the one nearest the top.
    • Continuous Loop (never freezes): The set of 50 is looped infinitely. When the last (oldest) item of the set has entered at the bottom and the backend still has no newer data, the frontend does not stop: it wraps back to the start of the same 50-item set and keeps feeding rows in from the bottom, producing a seamless loop with no visible stop, gap, or reset jump. A user landing on the page one minute into a 5-minute cache cycle must still see continuous motion for the remaining four minutes — a frozen ticker reads as a broken page and is explicitly rejected (BR_1.3.2.7).
    • Refresh Handoff: When a poll returns a changed 50-item set, the old set is dropped from memory in full and the loop restarts from the bottom with the new set (§5.1 "Full-Snapshot Replacement"). There is no per-row insertion animation and no catch-up replay.
    • Speed & Cadence (staggered): Scroll speed must be slow enough that every row is fully legible while it moves — the reference design video's speed produces motion blur and unreadable rows and must not be reproduced frame-for-frame. Each row follows a staggered rhythm: it appears → travels → holds for a short beat so the user can actually read the payout → then continues. The goal is that a visitor genuinely reads real payout lines, not that the animation matches the mockup's tempo (BR_1.3.2.9).
    • Row Exit: Rows leave via the same gradual scroll/fade-out motion at the top edge — never an instant delete — so the loop stays visually smooth at both ends.
    • Scroll Thumb: Pinned to the top during live operation.
  5. User Interaction Modes: Motion and data fetching are bound together: whenever auto-scroll stops, background fetching stops with it; whenever motion restarts, a fetch fires immediately at that moment (see §5.1 "Motion-Bound Polling", BR_1.3.2.5). There are two distinct pause states, which must not be merged in implementation:

    • (a) Hover Pause — desktop only, temporary and self-releasing
      • Applies only while the feed is at the top edge (live state). If the user scrolls down instead, the interaction is handled by (b).
      • Cursor enters the container: auto-scroll pauses and background fetching stops. No Resume Live Feed button appears — this state releases itself.
      • Cursor leaves the container: auto-scroll reactivates and a fetch fires immediately to retrieve the latest transactions. The view is already at the top edge, so no snap or fast-forward animation occurs. The loop resumes from the exact position it was frozen at (unless the fetch returns a changed set, in which case §5.4 "Refresh Handoff" applies).
    • (b) Manual Scroll Pause — desktop, explicit and requires user action to release
      • User scrolls down: auto-scroll terminates, the Resume Live Feed action button appears at the top of the container (in-page, no navigation), and background fetching stops.
      • Click Resume Live Feed: the view snaps instantly to the top edge, auto-scroll reactivates, and a fetch fires immediately to retrieve the latest transactions. This snap is a direct jump to the latest state regardless of how many transactions accumulated while paused — there is no catch-up animation replaying the missed transactions one by one.
      • Moving the cursor out of the container does not release this state — only the button does.
    • (c) Hover-arming rule — prevents (a) and (b) from conflicting
      • A hover pause is edge-triggered: it fires only on an outside → inside cursor transition. If the cursor is already resting inside the container at the moment the feed enters live state (e.g., the user clicks Resume Live Feed without moving the mouse away), auto-scroll runs normally and is not immediately re-paused; it pauses again only once the user moves the cursor out and back in.
      • An inside → outside transition never stops auto-scroll — it can only release an already-active hover pause.
    • (d) Tap — mobile/tablet, no hover capability: A single tap on the container pauses auto-scroll and stops background fetching, using the same Resume Live Feed button pattern as desktop manual-scroll (b) — tapping the button resumes motion and fires an immediate fetch. Modes (a) and (c) have no mobile equivalent, since there is no hover state to arm.
  6. State Transition Indicator:

    • Snap to Present: When snapping back to the top edge, the ledger container background executes a 400ms pulse using the brand accent color to visually communicate that the feed is live again.
    • The same pulse also fires on hover release (§5.5(a)), where the view is already at the top edge and no scroll movement occurs — there, the pulse is the only cue that motion and fetching have resumed.
  7. How Verification Works (Modal):

    • Trigger: User clicks the How Verification Works button (in-page, no navigation).
    • Action: Opens a popup modal titled "Cryptographic Verification".
    • Content: Static text explaining the Polygon blockchain immutable receipt printer. Contains a Dismiss button to close the modal.

6. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.3.2.1Blockchain Sync Delay / Alchemy ErrorBackend cannot fetch the latest CorporateMetricVerified events from Polygon (via Alchemy) within the 5-minute polling window.
E_1.3.2.2Empty Ledger (Zero Transactions)The GET /public/ledger endpoint returns a valid but empty array (no payouts recorded yet).
E_1.3.2.3Transaction Hash Missing from API PayloadA ledger card's API payload is missing the unique transaction hash needed to construct the Polygonscan URL.
E_1.3.2.4User Hovers, Then Manually Scrolls (Pause-State Escalation)User is in a hover pause (§5.5(a)) and then scrolls down inside the same container.
E_1.3.2.5New Transactions Occur On-Chain While the Feed Is PausedNew payout events are emitted (and the backend cache refreshes) while the user holds the feed in any paused state — hover pause, manual-scroll pause, or mobile tap-pause.
E_1.3.2.6Previously-Displayed Transaction Disappears (Blockchain Reorg)A transaction that was already rendered on the ticker is no longer part of the confirmed chain state on a later poll (rare Polygon reorg).
E_1.3.2.7Resume Live Feed Clicked While the Cursor Is Still Inside the ContainerThe user clicks Resume Live Feed without moving the cursor out of the ledger container, so the pointer is resting inside it the instant the feed returns to live state.
E_1.3.2.8Cursor Leaves the Container During a Manual Scroll PauseThe feed is in the explicit Manual Scroll Pause state (Resume Live Feed visible) and the user moves the cursor out of the container — an inside → outside transition that, in the hover flow, would resume the feed.
E_1.3.2.9Same Transactions Replay While Waiting for the Next Cache CycleThe backend cache is static for its full 5-minute TTL, so a user watching the ticker for longer than one loop duration sees the same 50 transactions — with the same timestamps — scroll past again.

7. Business Rules

BR_IDRule Description
BR_1.3.2.1Element Limit: The frontend holds a maximum of 50 ledger data items in memory at any given time (matching the API's top-50 payload size), to protect browser memory and preserve Core Web Vitals. The DOM may hold a small buffer of duplicated nodes beyond the visible rows purely to make the loop wrap seamless (BR_1.3.2.7); this buffer is a rendering artefact and does not raise the 50-item data cap.
BR_1.3.2.2Verify Link Target: The Verify On-Chain button must open the external blockchain explorer URL in a new browser tab (target="_blank"), consistent with BR_1.1.1.3.
BR_1.3.2.3Cache TTL: The backend ledger cache must have a 5-minute TTL matching the frontend polling interval, to avoid serving stale data beyond one polling cycle.
BR_1.3.2.4Modal Dismissal: The "How Verification Works" modal must be dismissible only via its explicit Dismiss button or standard modal-close affordances (e.g., overlay click, Esc key), and must not auto-close.
BR_1.3.2.5Fetching Is Bound to Motion (No Background Buffering): Background polling of GET /public/ledger runs only while the ticker is in motion. Every pause state (hover, manual scroll, mobile tap) suspends fetching, and every resume fires one immediate fetch at that moment before realigning to the shared 5-minute schedule (§5.1, §5.5). The frontend must not poll, buffer, or pre-render data while paused — a paused ledger is a frozen snapshot, and the user always sees data fetched at the instant motion resumed.
BR_1.3.2.6Hover Pause Is Edge-Triggered, Not State-Based: The desktop hover pause must be implemented on the outside → inside pointer transition, not on "pointer is currently inside". A cursor already resting inside the container when the feed enters live state must not pause it (E_1.3.2.7), and an inside → outside transition may only release an active hover pause — never the manual-scroll pause (E_1.3.2.8).
BR_1.3.2.7Continuous Loop — the Ticker Must Never Freeze: The latest-50 set loops infinitely. Reaching the oldest item of the set is not a stop condition — the frontend wraps back to the start of the same set and keeps scrolling (§5.4). Repeating already-shown transactions (and their timestamps) while the 5-minute cache is unchanged is accepted (E_1.3.2.9): on a marketing page, continuous visual motion outranks strict temporal accuracy, and a frozen ticker is the worst possible outcome. 50 items is the confirmed loop size — raising it to 100 was considered and rejected as unnecessary, because the reduced scroll speed (BR_1.3.2.9) already makes a 50-item cycle long enough.
BR_1.3.2.8Full-Snapshot Replacement — No Delta, No Dedup: GET /public/ledger always returns exactly the latest 50 transactions as a fixed set, never a delta. On refresh, the frontend discards the entire in-memory set, loads the new set, and restarts the loop from the bottom (§5.1, §5.4). Client-side tx_hash diffing, insert-position calculation, and any other old-vs-new reconciliation logic are explicitly out of scope — this keeps frontend cost near-zero and protects animation smoothness. Supersedes the tx_hash-dedup model documented in v1.7–v1.14.
BR_1.3.2.9Readable Scroll Speed & Staggered Cadence: Scroll speed must be slow enough that each payout row is fully readable while in motion — no motion blur. Rows move on a staggered rhythm (appear → travel → brief hold → continue) rather than a constant fast glide. The reference design video's tempo is not a specification: it is explicitly not to be reproduced frame-for-frame, and QC must not raise a defect for failing to match the mockup's speed (§5.4). Readability of real payout data is the acceptance criterion.

UC_1.3.3 — Trustpilot Reviews & Community

1. Overview

FieldContent
IDUC_1.3.3
Use CaseTrustpilot Reviews & Community
DescriptionDisplays the TrustBox widget (aggregate score) and a Testimonial slider (detailed reviews), alongside dynamic trader counts.
Zapier Flow
Zapier Table
3rd PartyTrustpilot

2. Trigger

User views the Community/Reviews section on the Homepage or utilities page.

3. Pre-conditions

  • Trustpilot proxy endpoints are available.

4. Post-conditions

  • Trustpilot data is securely fetched and rendered.

5. Basic Flow & UI Rules

  • Trader Count Display:
    • The Marketing team manually updates the raw number in Sanity CMS (founder_count) daily (Ref: CR-20260731-001 — no BE/DB fetch for this display). The system applies a Math.floor function down to the nearest hundred (e.g., 520 becomes "500+", 1245 becomes "1200+") and Sanity outputs the final calculated result from that manually-set value.
    • If founder_count < 500: displays the exact text: "Join now and build your career with Stack".
    • If founder_count >= 500: displays the exact text: "Join [calculated_number]+ traders building their careers with Stack" (Source: MKT-01, MKT-16).
  • Trustpilot Data Fetching:
    • Frontend fetches data via two backend proxy endpoints to mask the Trustpilot API Key:
      • GET /community/trustpilot-stats: fetches aggregate score for the TrustBox widget.
      • GET /community/testimonials: fetches detailed reviews for the slider (Source: MKT-04).
    • Fetch timing (no real-time listener): Neither endpoint is pushed/streamed to the client. Both are only called when a page is loaded, and the resulting data is cached and reused for up to 60 minutes before the backend fetches again. If a user keeps the page open, no new review or score will appear on its own — the user must reload the page (F5) to get a fresh result, and even then the result reflects whichever cache window the backend last refreshed. This applies to both endpoints (the score/count endpoint's 60-minute cache was already documented; the same cache window now also applies to the testimonials endpoint) (Source: Slack thread 2026-07 — Adam Culver: "Trustpilot is loaded on demand and using cache... limit it to run a maximum once every hour"; Adrian: "A manual page refresh is required to see new cached reviews"; QnA_TRUSTPILOT_UIUX.md TP-A11).
    • Independent data sources — possible temporary mismatch: because the score/count widget and the testimonial slider are fetched by two separate calls (not guaranteed to happen at the same instant), it is expected/acceptable that the displayed score may reflect a review that has not yet appeared in the slider, or vice versa, for a short time. This is not a bug.
  • Testimonial Slider UI:
    • Max item count: Displays a maximum of twenty (20) recent 4-star or 5-star reviews (increased from the previously documented 12 — Source: Slack thread 2026-07, Adam Culver: "I would pull up to either 20 or the max whichever is lower"; Adrian: "cap the final payload at the 20 most recent items"; QnA_TRUSTPILOT_UIUX.md TP-A12). Filtering and capping are done entirely by the backend — the GET /community/testimonials response is already filtered to 4-5 star only and already capped at 20 most-recent items before it reaches the frontend. The frontend must render exactly whatever array it receives (up to 20 items) and must not re-filter, re-sort, or re-cap it itself. Even if 50-100 new valid reviews are posted on Trustpilot within a single hour, the backend still only returns the 20 most recent — the frontend will never receive more than 20 items to display.
    • Eviction: When a new valid review arrives (reflected on the next fetch, per the timing rule above), the oldest of the current set is pushed out so the total stays at the cap (Source: MKT-33, updated count per TP-A12).
    • Hide Rule: If there are fewer than 3 total reviews, the entire Trustpilot block is hidden (Source: MKT-09).
    • Long review text: If a review's text is long enough to otherwise stretch the card, the card shows a "Read More" button instead of expanding the card's height. Card heights must stay uniform across the slider (Source: Slack thread 2026-07 — Adam Culver: "read more button is perfectly adequate"; Adrian: "A 'Read More' button is fine to manage card heights"; QnA_TRUSTPILOT_UIUX.md TP-A13).
    • Language filtering (Day 1 scope): Only English-language reviews are fetched/displayed at this stage. Reviews in other languages are filtered out (by the backend) and never reach the frontend. No translation logic is implemented in this phase; multi-language/geolocation-based display is a possible future phase, not part of the current scope (Source: Slack thread 2026-07 — Adam Culver: "day 1 lets do all english... don't want to implement heavy translate logic right now"; QnA_TRUSTPILOT_UIUX.md TP-A14).
    • Layout: The center card is always highlighted with distinct color/lighting effects, while the side cards maintain a dark background. There is no hover effect required.
    • Interaction: The carousel slides by exactly 1 item per interaction. Review blocks are view-only (not clickable).
    • Button Action: Clicking "Read All Reviews on Trustpilot" redirects the user to the official Stack Trading Trustpilot profile (https://www.trustpilot.com/review/stacktrading.com) in a new browser tab (target="_blank") (Source: MKT-33).

6. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.3.3.1aScore/Count API Failure (Required Component — /community/trustpilot-stats)The TrustBox score/count proxy call fails, times out, or returns 5xx.
E_1.3.3.1bTestimonials API Failure (Optional Component — /community/testimonials)The testimonial-slider proxy call fails, times out, or returns 5xx — while the score/count widget above is unaffected.
E_1.3.3.2Insufficient Reviews (MKT-09)Backend proxy returns fewer than 3 valid 4-star or 5-star reviews.
E_1.3.3.3founder_count Sanity Fetch Failure (Ref: CR-20260731-001)Frontend fails to fetch founder_count from Sanity for the Trader Count Display (CMS timeout or unpublished document).
E_1.3.3.4Exactly 3 Reviews Available (Boundary of MKT-09 Hide Rule)Backend returns exactly 3 valid 4-star/5-star reviews (the minimum threshold).
E_1.3.3.5New Review Arrives While User Is Viewing the Page (20-Item Cap, MKT-33/TP-A12)A new valid 4/5-star review is published on Trustpilot while a user is actively viewing/sliding through the carousel.

7. Business Rules

BR_IDRule Description
BR_1.3.3.1Review Rating Floor (MKT-09/MKT-33): Only 4-star and 5-star reviews may be displayed in the Testimonial Slider; 1-3 star reviews must be excluded from the fetched/rendered set entirely. Filtering is performed entirely by the backend before the response reaches the frontend.
BR_1.3.3.2Max Review Cap — 20 (MKT-33, updated per Slack thread 2026-07 / TP-A12): The Testimonial Slider must never display more than 20 reviews at a time (increased from the previously documented 12). A FIFO (oldest-out) eviction applies when new reviews arrive beyond the cap. The 20-item cap is enforced entirely by the backend — the frontend renders whatever it receives (up to 20) and must not apply its own filtering, sorting, or additional capping.
BR_1.3.3.3English-Only Reviews (Day 1 Scope, per Slack thread 2026-07 / TP-A14): Only English-language reviews may be fetched/displayed by the Testimonial Slider at this stage; non-English reviews are excluded entirely by the backend. No translation logic is implemented in the current phase.
BR_1.3.3.4Long Review Text Uses "Read More" (per Slack thread 2026-07 / TP-A13): A review card whose text would otherwise stretch the card must show a "Read More" button rather than expanding the card's height, so all cards in the slider keep a uniform height.
BR_1.3.3.5Required vs Optional Fallback Split (per Slack thread 2026-07 / TP-A15): The score/count widget (/community/trustpilot-stats) is a required component — on failure it must hide or keep showing the last cached score/count, never a broken state. The testimonial slider (/community/testimonials) is an optional component — on failure it only needs to hide that section or show a static pre-approved fallback set of reviews; a testimonial-fetch failure must not affect the score/count widget, and vice versa.

UC_1.3.4 — Dynamic Content (Sanity CMS)

1. Overview

FieldContent
IDUC_1.3.4
Use CaseDynamic Content (Sanity CMS)
DescriptionRenders content sections on the Homepage dynamically managed by Sanity CMS, specifically the "From The Trading Floor" (Insights Hub) and "Frequently Asked Questions" (FAQ) sections.
Zapier Flow
Zapier Table
3rd PartySanity CMS

2. Trigger

User scrolls to the dynamic content sections on the Homepage.

3. Pre-conditions

  • Data is populated in Sanity CMS.

4. Post-conditions

  • The frontend fetches and renders the CMS content.

5. Basic Flow & UI Rules

  • General Sanity Fetching:
    • Next.js fetches data from the Sanity CMS API using standard template layouts (Source: MKT-05).
    • Dummy data is temporarily rendered if content is lacking until the client populates it via CMS (Source: MKT-06, MKT-22).
  • From The Trading Floor (Insights Hub):
    • Renders a slider/carousel of recent news/insights.
    • Data Source: The posts shown in this slider are the same posts curated in the "Most Popular" widget on the Insights Hub page (UC_1.8.5 §5.1 item 3). This is not a separate homepage-only content set — the ranking/selection is manually curated by the Admin via Sanity CMS on the Insights Hub, and the Homepage slider simply mirrors that same curated set/order.
    • Card Data: Each insight card displays a cover image, publication date, read time, title, short description snippet, and author information (avatar, name, role).
    • Interaction (Arrows): Users can navigate left and right using the circular arrow icons located at the bottom right (in-page, no navigation). Hovering over the arrows changes their opacity/color.
    • Interaction (Cards): Hovering over an insight card triggers a slight lift/scale effect. Clicking on the card redirects (same tab) the user to the specific Insights Hub Article Detail page for that post.
    • Button: View all News button (top right) opens (same tab) the Insights Hub page.
  • Frequently Asked Questions (FAQ):
    • Renders a list of FAQs in an accordion format.
    • Data Source (Ref: CR-20260817-001): The items shown are the ones an editor has explicitly selected for the home page in the Sanity page-FAQ settings tab — per-item picks from the single master "All FAQ list", in the editor's chosen order. Full mechanism defined once at UC_1.8.8 §4.9 "Page-FAQ Mapping"/BR_1.8.8.5. The Homepage does not query an FAQ category. (Superseded: the previous model gave each screen its own FAQ category and rendered every item tagged with it.)
    • Interaction (Accordion): By default, all FAQ items are collapsed (closed) with a chevron down icon (v). When a user clicks on an item, the accordion expands downward to reveal the answer text, and the chevron flips up (^). Clicking an expanded item collapses it back (in-page, no navigation).
    • Button: View all FAQs button (top right) opens (same tab) the Help Center / FAQ page.

6. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.3.4.1CMS API Failure (General)Sanity CMS API fails or times out on page load.
E_1.3.4.2No Content Yet Populated in CMS (MKT-06, MKT-22)Client has not yet populated real content for the Insights or FAQ sections in Sanity CMS.
E_1.3.4.3Zero Insight Articles PublishedSanity CMS returns an empty array for "From The Trading Floor".
E_1.3.4.4Zero FAQ Items Selected/Published (Ref: CR-20260817-001)The home page entry in the Sanity page-FAQ settings tab has no items selected, does not exist yet, or fails to fetch (Ref: E_1.8.8.5).
E_1.3.4.5Insight Card Missing Author InfoAn insight card's Sanity entry is missing avatar/name/role fields (author info is optional/incomplete in CMS).
E_1.3.4.6Insights Hub "Most Popular" Curation EmptyThe Admin has not curated any entry in the Insights Hub's "Most Popular" widget via Sanity CMS.

7. Business Rules

BR_IDRule Description
BR_1.3.4.1Sanity Global Editing Rule: For all CMS-driven components on the Homepage, administrators can only modify the inner content (text strings, images, and icons) via Sanity CMS. The core structural layout and positioning of the frontend blocks remain hardcoded in Next.js and cannot be altered via the CMS.
BR_1.3.4.2FAQ Accordion Single/Multi-Expand: The accordion allows expanding multiple FAQ items simultaneously. Expanding one item does not auto-collapse other currently open items.
BR_1.3.4.3Insight Card Navigation Consistency: Both the card click (§5 "Interaction (Cards)") and the arrow navigation must route to the same underlying insight dataset — i.e., arrow-navigating to a card and then clicking it must always open that same card's Article Detail page.
BR_1.3.4.4Shared Curation with Insights Hub "Most Popular": The "From The Trading Floor" slider's post set/order must be the same posts curated in the Insights Hub's "Most Popular" widget (BR_1.8.5.1) — manually curated by the Admin via Sanity CMS, not a separate homepage-specific selection.

1.4. The Associate Track

UC_1.4.1 — Static Components (Next.js) (CR-20260726-004)

1. Overview

FieldContent
IDUC_1.4.1
Use CaseStatic Components (Next.js)
DescriptionProvides the static UI layout including the Hero Section, Rules explanation (Performance Protocol), Benefits overview (Zero Artificial Constraints, Institutional Infrastructure), Career Path teaser, and Pre-Footer CTA.
Zapier Flow
Zapier TableTable C (Global_Var_Allow_New_Signups) — authoritative value/enforcement at Checkout Step 3b (UC_2.1.3); Marketing-site CTA display now reads a mirrored Sanity config variable (Ref: CR-20260731-002). Table A/B/J pricing and level data (Timeline Data, Starting Capital, Founder pricing) is not fetched from these tables for Marketing-site display — it is Sanity-configured per CR-20260731-001.
3rd PartySanity CMS (signup-gate CTA config + pricing/level data, Ref: CR-20260731-001/002)
CMS EditabilityAssociate Track row in Marketing Site — CMS Editability Scope (Overall): Layout = Hardcode; Pricing Data / FAQ = Sanity; Other Content = Hardcode; Mode Waitlist = Sanity. Pricing Data sections: "The Performance Protocol" (§3 item 3, Starting Capital tiers) and "The Career Path (Teaser)" (§3 item 6, capital/salary Dot data) — see index.md Pricing Data section map. (Separately, the Hero Section's Spots Remaining ribbon and the Pre-Footer CTA's $499/$650 founder pricing are already documented but tracked under Mode Waitlist/CTA-pricing, not this Pricing Data section.)

2. Trigger

User navigates to the Associate Track page (/associate-track). Known entry points include: the Header and Footer "Associate Track" links (UC_1.1.1 §6), the Homepage's Start Associate Track / Explore Career Path teaser and Pre-Footer CTA buttons (UC_1.3.1 §5), the Career Path page's Start Associate Track button (UC_1.5.1 §3 item 1), the About Us page's Review The Associate Track and Pre-Footer CTA buttons (UC_1.6.1 §3 items 1, 7), and the Help Center's "Are You Looking For More?" → "The Associate Track" card (UC_1.8.8 §4.7).

3. Basic Flow & UI Rules

  1. Hero Section (MKT-27):
    • Data Source (Ref: CR-20260731-001): founder_count and both prices (standard + discounted) are configured directly in Sanity. The Marketing team types in the seat number manually (updated daily); the FE only reads it on page load/refresh. No Backend API / DB fetch is used for this display.

    • Glossary — the 3 numbers used in this section (read this before the flow below):

      TermMeaningWhere it comes from
      500Total size of the Founding Member cohort. A fixed constant — it never changes.Hardcoded
      founder_countHow many people have already bought a Founding Member package (= seats already taken).Sanity field, updated manually by Marketing
      countThe number shown on the ribbon = how many seats are still free. Calculated by the FE: count = 500 − founder_count.Derived, not stored

      Worked example: Marketing sets founder_count = 120 in Sanity → the FE computes count = 500 − 120 = 380 → the ribbon shows "Spots Remaining: 380/500" (380 seats left out of 500 total).

    • Rendered with 2 variations, switched by the Sanity-configured founder_count: Version 1 while the Founding cohort is not yet sold out (founder_count <= 500), Version 2 once it is (founder_count > 500).

      • Version 1 (founder_count <= 500 — Founding Member pricing still open):
        • Top Ribbon: "Spots Remaining: [count]/500" — where count = 500 − founder_count as defined in the glossary above. (Superseded fetch mechanism: founder_count was formerly fetched via GET /system/status per MKT-02; it is now read from Sanity.)
        • "Chunk Filling Up" progress bar: no smooth animation — the bar jumps between 5 fixed steps. The FE picks the step from count (the remaining seats, not founder_count). The fuller the bar, the fewer seats are left:
          • count 451–500 (i.e. 0–49 seats sold) → bar filled 0%, green
          • count 351–450 (i.e. 50–149 sold) → bar filled 20%, green
          • count 251–350 (i.e. 150–249 sold) → bar filled 40%, green
          • count 151–250 (i.e. 250–349 sold) → bar filled 60%, green
          • count <= 150 (i.e. 350+ sold) → bar filled 80%, red
        • Header: "Founding Member Rate".
        • Price Anchor: "Evaluations starting at $650 $499" — both the struck-through standard price ($650) and the discounted price ($499) are pre-configured in Sanity; the FE only displays them, it does not calculate the discount.
        • CTA: Claim My Founding Member Seat — clicking opens the Checkout flow in the same tab (Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056).
      • Version 2 (founder_count > 500 — Founding cohort sold out, standard pricing): Top Ribbon: "★ Backed by Firm Capital" (no seat counter, no progress bar), Header: "The Associate Track", Price Anchor: "Evaluations starting at $650" (no strike-through / no discount), CTA: Start Associate Track (Clicking opens Checkout flow, same tab).
  2. Backed by institutional infrastructure: Renders a view-only ticker of supported platform logos (TradeSea, Mastercard, TraderEvolution, ATAS, Quantower, Sierra Chart) and the Trustpilot micro-combo with NFA ID below it (same as UC_1.3.1).
  3. The Performance Protocol: Displays a detailed rules table containing rows for Starting Capital, Profit Target (14%), Maximum Drawdown (7.5% Absolute), Time Limit (60 Days), Commissions, Daily Stop, Activation Fees, and Monthly Desk Fees. The "Starting Capital" value dynamically displays based on tiers (e.g., "$25K / 8 Micros" up to "$150K / 7 ES") — these tier values are Sanity-configured content, not fetched from the Backend/Table A/B (Ref: CR-20260731-001; superseded fetch mechanism, Source: MKT-28).
    • Button: Claim My Founding Member Seat (Version 1) or Start Associate Track (Version 2). Clicking opens Checkout flow (same tab).
  4. Zero Artificial Constraints: Renders a side-by-side comparison between "Commodity Prop Firms" (Trailing Drawdown, Consistency Rule Violation, News Trading Prohibited) and "Stack Trading" (Static Floor, Passed. No Outlier Penalty, News Trading Allowed). Includes 4 descriptive icon blocks below (No Trailing Stops, No Consistency Rules, News and Overnight Allowed, Algorithmic Edge Welcome).
    • Button: Claim My Founding Member Seat (Version 1) or Start Associate Track (Version 2). Clicking opens Checkout flow (same tab).
  5. Institutional Infrastructure: Static grid displaying 7 supported platforms (Quantower, ATAS, MotiveWave, Sierra Chart, TradeSea, TradingView, MetaTrader 5). Includes 3 descriptive icon blocks below (Futures Data, Immediate Access, Zero Platform Overhead). Note: NinjaTrader is replaced by TradeSea (Source: MKT-29, MKT-39).
    • Button: Claim My Founding Member Seat (Version 1) or Start Associate Track (Version 2). Clicking opens Checkout flow (same tab, Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056).
  6. The Career Path (Teaser): Renders the section header "The Career Path", the timeline graph, the 4 static milestone cards, and 3 informative cards. (Details in UC_1.5.2 §2 step 2 for interactive behavior and the canonical copy of every block below.)
    • Section Sub-Headline: "Your evaluation is just the starting line. It is your entrance exam to securing an institutional level book." (Ref: MKT-30 item 1.) Confirmed to appear on this teaser as well, identical to the Career Path page (Ref: MKT-44, 2026-08-24) — MKT-30 originally scoped this string to the Career Path page only; MKT-44 extends it to this UC. As on UC_1.5.2, it replaces the old "The $499 entry fee…" sub-headline, which must not appear anywhere on this page either.
    • Milestone Cards (static row below the graph): 4 cards — Level 1 "$25K Start", Level 6 "W-2 Employee", Level 9 "Drawdown Defense Active", Level 24 "$75M Book". Same content and Sanity/hardcode split as UC_1.5.2 §2 step 2.
    • Supporting Content Cards (3 blocks): Card 1 "The W2 Career Scaling Plan", Card 2 "Immutable, Code-Driven Payouts", Card 3 "Absolute Cash Over Fake Percentages". This teaser renders all 3 cards in full — it is not a reduced/short version of the Career Path section; content is identical on both pages (Ref: MKT-44, 2026-08-24). Full copy is therefore authored once in UC_1.5.2 §2 step 2 and must not be re-typed here — see §6 Cross-Reference Notes. Card 1's final-design "from $25,000" wording (which overrides MKT-30 item 2, Ref: MKT-45), Card 3's description paragraph, Card 3's Sanity editable-row-list rule and its preserved label mismatch (BR_1.5.2.4, Ref: MKT-43), and E_1.5.2.6 (variable row count) all apply identically on this page.
    • Motion Rules: Link motion.
    • Info (i) Icon Hover (Ref: CR-10): Hovering over the top-right "Info (i)" icon displays a tooltip with the explicit "Risk and Compensation Disclaimer": "Trading financial markets involves a high degree of risk and is inherently difficult. Only a small number of elite traders will successfully reach the upper levels. Scaling to level 20+ will be exceptionally difficult and likely take years to achieve.As allocated notional capital and contract sizes scale into the millions, traders face substantial slippage risk. Large volume orders are subject to market liquidity constraints, resulting in execution prices that can materially differ from quoted prices.W2 employment, including base salary and benefits, is offered upon reaching Level 6. Any base salary factored into cumulative compensation figures assumes a progression duration average of two months per level. Actual progression times will vary based on individual performance, which will directly impact total accumulated earnings."
    • Timeline Hover Nodes: The graph contains highlighted yellow dots corresponding to key milestones. Hovering over a node displays text that is dynamically injected with the level's specific capital and salary values, sourced from Sanity CMS (same source as UC_1.5.2's Interactive Timeline data) rather than fetched from the Backend/Table A/B (Ref: CR-20260731-001). Since this data now lives in Sanity rather than being live-synced from Table A/B, keeping these values consistent with the Zapier tables is a manual content-maintenance responsibility, not an automatic sync. The templates are:
      • Node Level 1: "Associate Track Entry. Start here to unlock [Capital Amount] in firm-backed capital upon passing."
      • Node Level 2: "Accelerated Track Entry. Bypass Level 1 entirely. Unlock [Capital Amount] in firm-backed capital upon passing."
      • Node Level 4: "Level 4: [Capital Amount] Book. [Capital Amount] in capital as an Associate Trader."
      • Node Level 5: "Advanced Track Entry. The ultimate shortcut. Bypass Levels 1-4. Start with [Capital Amount] and sit exactly 1 promotion away from a W-2 Salary."
      • Node Level 6 (W-2): "Level 6: W-2 Employee. Reach Level 6 to unlock W-2 employment, a guaranteed base salary, and comprehensive health benefits."
      • Node Level 9 (Drawdown Defense): "Level 9: Drawdown Defense Active. Your drawdown limit does not trigger immediate termination. Stay active to regain your edge."
      • Node Level 16: "Level 16: [Capital Amount] Book. [Capital Amount] in capital as a Senior Trader."
      • Node Level 22: "Level 22: [Capital Amount] Book. [Capital Amount] in capital as a Managing Principal Trader."
      • Node $20M line: "[Capital Amount] Book. [Capital Amount] in capital managing institutional volume."
      • Node Level 24: "Level 24: [Capital Amount] Book. [Capital Amount] in capital as a Managing Principal Trader with [Salary Amount]+ salary and full corporate benefits."
    • Button: Claim My Founding Member Seat (Version 1) or Start Associate Track (Version 2). Clicking opens Checkout flow (same tab).
  7. Pre-Footer CTA "Stop Gambling. Start Your Career" (MKT-31):
    • Contains a background slow gradient blur motion effect with the text "Stop Gambling. Start Your Career." and a sub-headline "Join the only prop firm built for trader success, not trader failure." (Same motion rules as UC_1.3.1).
    • Data Source (Ref: CR-20260731-001): Same as UC_1.3.1 Pre-Footer CTAfounder_count and both price values are Sanity-configured, no BE/DB fetch.
    • Layout Variations (based on the Sanity-configured founder_count):
      • Version 1 (<= 500 slots): Glass box text shows "$650 $499 | Associate Track Entry". Primary button text is "Begin The Associate Track - $499".
      • Version 2 (> 500 slots): Glass box text shows "Evaluations starting at $650". Primary button text is "Begin The Associate Track" (price removed).
    • Buttons: Talk to Us (Opens Contact flow/Intercom, in-page, no navigation), and Begin The Associate Track (Opens Checkout flow, same tab).
    • Subtext is positioned completely below the glass box for better readability. Same layout rules as UC_1.3.1.

4. Business Rules

BR_IDRule Description
BR_1.4.1.1Signup-Gate CTA Switching (CR-20260731-002, supersedes MKT-36 Backend-flag-driven wording): All CTA buttons (e.g., "Start Associate Track", "Claim My Founding Member Seat", "Begin The Associate Track") read the Sanity-configured signup-gate variable. If it indicates signups are closed, they display "Join Waitlist" and route to the Waitlist form. The authoritative gate is enforced independently at Checkout Step 3b by the Backend (Ref: UC_2.1.3).
BR_1.4.1.2The text of primary CTA buttons across the page (Claim My Founding Member Seat vs Start Associate Track) is globally determined by the Sanity-configured founder_count threshold (<= 500 vs > 500) (Ref: CR-20260731-001). Clicking any of these primary CTAs always opens the Secure Checkout flow.

5. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.4.1.1Race Condition on 500th Slot (MKT-34)User views Version 1 (discount) because the Sanity-configured founder_count still shows <= 500 on page load (Marketing team has not yet updated the seat count to reflect the cohort filling up). While browsing, the 500th slot is filled by another user. The current user clicks Claim My Founding Member Seat. Frontend routes to Checkout without any error popup. Backend POST /calculate-cart acts as the source of truth at Checkout time and automatically calculates the standard base price for the Checkout UI if the cohort is actually full. (Client accepts if a 501st user slips through at the exact millisecond). Note on Page Reload / Back Button (Ref: CR-20260731-001): Since founder_count is now a manually-updated Sanity value rather than a live backend read, reloading the Marketing page shows Version 2 (Standard Pricing) only once the Marketing team has updated the Sanity seat count past 500 — not automatically upon the 500th checkout. If the user presses the browser's "Back" button from Checkout, the browser BFCache might temporarily display the stale Version 1, but any subsequent clicks will still route to Checkout and calculate the standard price. There is no ISR-driven backend revalidation forcing this update anymore; the display only changes when Sanity content is updated and re-published.
E_1.4.1.2Sanity Fetch Failure (founder_count unavailable, Ref: CR-20260731-001)Frontend fails to fetch founder_count/pricing fields from Sanity on page load (CMS timeout or unpublished document).
E_1.4.1.3Institutional Infrastructure / Trustpilot Widget Fetch FailureThe ticker/Trustpilot micro-combo block (§3, Step 2) reuses the same fetch logic as UC_1.3.1 - Institutional Infrastructure.
E_1.4.1.4Risk Disclaimer Tooltip on Touch Devices (Career Path Teaser Info Icon)§6 "Info (i) Icon Hover" is defined as a hover-only interaction, but touch devices (mobile/tablet) have no true hover state.
E_1.4.1.5Pricing Consistency vs CR-20260726-004 (Table J) — Manual, Not Automatic (Ref: CR-20260731-001)CR-20260726-004 introduces a new Evaluation & Reset Pricing table (Table J: Challenge Price, Futures Reset Price, Founder Price, Founder Reset Fee, Extension Fee) per level/track. Since CR-20260731-001, the Hero/Pre-Footer "Founding Member Rate" pricing is no longer live-synced from the Backend — it is a Sanity-configured value set directly by the Marketing team.

6. Cross-Reference Notes

  • Timeline hover-node text (§6) and its disclaimer tooltip are duplicated verbatim in UC_1.5.2 - Timeline Graph. Any future content change must be applied consistently in both places, or refactored into a single shared source to avoid drift.
  • The Career Path Teaser's sub-headline, 4 milestone cards, and 3 supporting content cards (§3 item 6) are deliberately not duplicated here — UC_1.5.2 §2 step 2 is the single canonical source for their copy, precisely to avoid the drift risk that the hover-node duplication above already carries. Only the block names and cross-links live in this UC.

UC_1.4.2 — Trustpilot Reviews

1. Overview

FieldContent
IDUC_1.4.2
Use CaseTrustpilot Reviews
DescriptionDisplays the Trustpilot review slider.
Zapier Flow
Zapier Table
3rd PartyTrustpilot

2. Basic Flow

  1. Refer to UC_1.3.3 for full API fetching, slider behavior, and data limits (Source: MKT-04, MKT-09, MKT-33).
  2. Renders 3 cards. Center card is highlighted. Slider arrows load previous/next reviews. View-only cards.

3. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.4.2.1Trustpilot API Failure / Insufficient ReviewsSame conditions as E_1.3.3.1a/E_1.3.3.1b (score/count = required component; testimonials = optional component) and E_1.3.3.2 (fewer than 3 valid 4/5-star reviews).

4. Business Rules

BR_IDRule Description
BR_1.4.2.1This page inherits BR_1.3.3.1 (4/5-star floor), BR_1.3.3.2 (20-review cap, backend-only filtering/capping), BR_1.3.3.3 (English-only, Day 1 scope), BR_1.3.3.4 ("Read More" for long text), and BR_1.3.3.5 (required vs optional fallback split) without modification.

1.5. The Career Path

UC_1.5.1 — Static Components (Next.js)

1. Overview

FieldContent
IDUC_1.5.1
Use CaseStatic Components (Next.js)
DescriptionProvides the static UI layout for the page structure, headers, W-2 scaling model text blocks, and safety net descriptions.
Zapier Flow
Zapier TableTable C (Global_Var_Allow_New_Signups) — authoritative value/enforcement at Checkout Step 3b; Marketing-site CTA display reads Sanity config variable instead (Ref: CR-20260731-002).
3rd PartySanity CMS (signup-gate CTA config, Ref: CR-20260731-002)
CMS EditabilityCareer Path row in Marketing Site — CMS Editability Scope (Overall): Layout = Hardcode; Pricing Data / FAQ = Sanity; Other Content = Hardcode; Mode Waitlist = Sanity. Pricing Data sections: "Level 6: Welcome to the Payroll" (§3 item 3 — Monthly Base Salary / Profit target / Bonus figures, Ref: BR_1.5.1.3) plus "The Career Path" / "24 Levels of Career Progression Table" (UC_1.5.2, already Sanity per CR-20260731-001) — see index.md Pricing Data section map. (Separately, the Hero Section's Founder-tier CTA text swap is tracked under Mode Waitlist/CTA-pricing, not this Pricing Data section.)

2. Trigger

User navigates to the Career Path page (/career-path). Known entry points include: the Header and Footer "Career Path" links (UC_1.1.1 §6), the Homepage's Explore Career Path button (UC_1.3.1 §5 "Real Capital → W-2 Career Path"), the Trading Floor page's Explore the Career Path button (UC_1.8.2 §5 item 7), and the Help Center's "Are You Looking For More?" → "The Career Path" card (UC_1.8.8 §4.7).

3. Basic Flow & UI Rules

  1. Hero Section:
    • Displays header "From Funded Trader to Full-Time Employee".
    • Buttons:
      • Start Associate Track: Clicking opens the Checkout flow (same tab, Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056). (If the Sanity-configured signup-gate variable indicates signups are closed, the button text changes to "Join Waitlist" and opens the Waitlist form (same tab), Ref: CR-20260731-002, supersedes MKT-36's Backend-flag-driven wording).
      • See The Rules: Clicking redirects the user (same tab) to the Rules Page (/rules).
  2. Institutional Infrastructure:
  3. Level 6: Welcome to the Payroll: Renders static text blocks with specific details:
    • Header Subtext: "At Level 6, you are no longer a contractor. You are an employee. Stack Trading is the only prop firm that offers this path. We are looking for traders who want careers, not gambles."
    • Monthly Base Salary Block: Displays a glass card showing "Monthly Base Salary: $2,578 with benefits". Includes badge "Trader (Lvl 6)". Below it, shows "Profit target: 9.4%" and "Bonus paid: $2,350". Info subtext below reads: "Base with benefits is exclusively available to US residents. Health benefits may vary by state."
    • Tailored Compensation: "You are onboarded into our HR system for regular direct deposit. You control your schedule by selecting your trading hours up to 35 per week. US residents choose between a standard Base Salary with health benefits or a higher Flex Cash base if you already have coverage."
    • Global Retainer & Crypto: "International traders remain independent contractors but unlock a guaranteed monthly retainer equivalent to the Flex Cash base. You receive full access to pod leadership, drawdown defense, and optional crypto payments for both your retainer and achieved bonuses."
    • The 90-Day Standard: "You are joining a professional desk. We fund active risk deployment. To maintain your seat and base capital, you have a maximum of 90 days to hit your profit target and advance to the next tier. We back traders who push forward."
    • Protected Time Off: "Markets never sleep, but you need to. Starting at Level 6, you earn Paid Time Off. When you take approved PTO, your 90-day performance clock is paused. You do not lose days, and you do not bleed capital while you recharge."
  4. Community, Not Competition: Renders static cards with specific details:
    • Header Subtext: "Trading is hard enough alone. Stack Trading pairs you with structured mentorship, professional pods, and a community that's built to help you advance, not just chat."
    • Button: Join The Trading Floor - clicking leads directly (same tab) to the Trading Floor / Community Page.
    • Trading Pods: "Level 1 to 5 talent is grouped into structured pods for daily accountability and guidance. Reach Level 7, and you can lead a pod. You will mentor new talent and earn a direct cut of their profit bonuses as they succeed."
    • The Stack Summit: "Annual retreats for Level 10+. Monaco. Cabo. Miami. Network with the best minds in the firm."
    • Ambassador Sponsorships: "Unlock exclusive lifestyle assets and brand packages as you climb the ranks. Performance deserves recognition."
    • Elite Access: "Direct access to firm-wide strategy chats, Pod channels, and level-specific communication hubs."
  5. We Protect Careers, Not Just Accounts:
    • Explains "Drawdown Defense" (automatically flattening positions to prevent blowing up the account) and "The Circuit Breaker" (pausing trading privileges temporarily to protect mental capital during a losing streak) using static charts/graphics.
  6. Community / Social Proof (Join 12,000+ traders):
    • Displays the orbital avatar UI with the "View Community" button.
    • For detailed text content, subtext, and dynamic Sanity CMS founder_count logic, refer to UC_1.3.1 - Community / Social Proof.
  7. Pre-Footer CTA ("Ready to Prove Your Edge?"):
    • Header: "Ready to Prove Your Edge?"
    • Subtext ("Join 12,000+ traders..."): Displays "Join 12,000+ traders building their careers with Stack." For the dynamic calculation logic of this number based on founder_count, refer to UC_1.3.1 - Community / Social Proof.
    • Motion: Applies the exact same scrolling text highlight motion effect as the "Stop Gambling. Start Your Career" section in UC_1.3.1 - Pre-Footer CTA.
    • Button Action: The button displays Begin Evaluation. Clicking opens the Checkout flow (same tab, Source: QnA_STAGE1_CHECKOUT_ONBOARDING.md, STAGE1-056).
    • Waitlist Mode (Ref: CR-20260731-002): If the Sanity-configured signup-gate variable indicates signups are closed, the button text changes to "Join Waitlist" and routes (same tab) to the Waitlist form.
    • Features Row: Displays text "NFA Regulated • 60-day evaluation • Real capital upon funding" at the bottom of the card. This text block runs a small scrolling motion effect exactly as defined in UC_1.3.1 - Pre-Footer CTA.

4. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.5.1.1Waitlist Mode (CR-20260731-002, supersedes MKT-36 Backend-flag-driven wording)The Sanity-configured signup-gate variable indicates signups are closed.
E_1.5.1.2Institutional Infrastructure / founder_count Sanity Fetch Failure (Ref: CR-20260731-001)The Institutional Infrastructure block (§3 step 2) and Community/Social Proof + Pre-Footer CTA (§3 steps 6-7) all reuse UC_1.3.1 logic for Trustpilot fetching and founder_count display.
E_1.5.1.3User Not a US Resident (Level 6 Base Salary Block)Per §3 step 3 "Monthly Base Salary Block", the info subtext states "Base with benefits is exclusively available to US residents." A non-US trader reaches Level 6.
E_1.5.1.490-Day Clock vs Approved PTO OverlapPer §3 step 3 "The 90-Day Standard" and "Protected Time Off", a trader takes approved PTO while their 90-day performance clock is running.

5. Business Rules

BR_IDRule Description
BR_1.5.1.1Signup-Gate CTA Switching (CR-20260731-002, supersedes MKT-36 Backend-flag-driven wording): All primary CTA buttons must read the Sanity-configured signup-gate variable and switch to "Join Waitlist" mode when it indicates signups are closed. The authoritative gate is independently enforced at Checkout Step 3b by the Backend (Ref: UC_2.1.3).
BR_1.5.1.2Content Reuse Consistency: Any hardcoded text/motion/logic block that this UC references as "same as UC_1.3.1" (Institutional Infrastructure, Community/Social Proof, Pre-Footer motion) must stay in sync if the referenced UC_1.3.1 section is later updated, to avoid content drift between the Homepage and Career Path pages.
BR_1.5.1.3"Level 6: Welcome to the Payroll" Comp Figures Are Sanity-Configured: The three compensation figures rendered in the Monthly Base Salary block (§3 item 3) — Monthly Base Salary ($2,578), Profit target (9.4%), and Bonus paid ($2,350) — are Sanity CMS fields that Marketing/Finance can update without an engineering deploy. This is the Career Path page's "Pricing Data" section per the index.md Pricing Data section map. Scope is values only: the surrounding copy, the "Trader (Lvl 6)" badge, the US-residents benefits disclaimer, and the section layout all remain hardcoded, consistent with BR_1.3.4.1's "content is Sanity-editable, structural layout is hardcoded" split. These figures must stay consistent with the Level 6 row of the 24-Levels table (UC_1.5.2), which is Sanity-driven from the same source (Ref: CR-20260731-001).

UC_1.5.2 — Interactive Timeline (Sanity CMS) (CR-20260726-004, CR-20260731-001)

1. Overview

FieldContent
IDUC_1.5.2
Use CaseInteractive Timeline (Sanity CMS)
DescriptionDisplays the interactive visualization of 24 levels and the detailed data table, configured via Sanity CMS (Ref: CR-20260731-001 — no Backend/DB fetch for this display).
Zapier Flow
Zapier TableTable A/B — reference only for keeping Sanity content aligned with Checkout/Backend pricing; not fetched by the Marketing site at display time.
3rd PartySanity

2. Basic Flow & UI Rules

  1. Data Fetching (Ref: CR-20260731-001, supersedes MKT-17): Frontend fetches pricing and level configurations directly from Sanity CMS — no ISR fetch to a backend database, no Zapier Table A/B sync involved in the Marketing-site display path. The BA/Marketing team is responsible for keeping the Sanity-authored level data manually aligned with the Zapier Table A/B/J values used by Checkout/Backend, since there is no automatic sync between the two once the display source moved to Sanity.
  2. "The Career Path" Section — Timeline Graph + Supporting Cards (MKT-30):
    • Section Header: "The Career Path".

    • Section Sub-Headline (Ref: MKT-30 item 1): "Your evaluation is just the starting line. It is your entrance exam to securing an institutional level book." This copy replaces the previous sub-headline that began with "The $499 entry fee…" — the old string must not appear anywhere on the page (Source: Tiered Price Points PDF, QnA MKT-30, 2026-07-24). Hardcoded text, not Sanity.

    • Renders a spline graph representing capital growth from $25K to $75M.

    • Motion Rules: Link motion.

    • Info (i) Icon Hover (Ref: CR-10): Hovering over the top-right "Info (i)" icon displays a tooltip with the explicit "Risk and Compensation Disclaimer": "Trading financial markets involves a high degree of risk and is inherently difficult. Only a small number of elite traders will successfully reach the upper levels. Scaling to level 20+ will be exceptionally difficult and likely take years to achieve.As allocated notional capital and contract sizes scale into the millions, traders face substantial slippage risk. Large volume orders are subject to market liquidity constraints, resulting in execution prices that can materially differ from quoted prices.W2 employment, including base salary and benefits, is offered upon reaching Level 6. Any base salary factored into cumulative compensation figures assumes a progression duration average of two months per level. Actual progression times will vary based on individual performance, which will directly impact total accumulated earnings."

    • Hover States: The graph contains highlighted yellow dots corresponding to key milestones. To prevent hardcoded data mismatch, hovering over a node displays text that is dynamically injected with the level's specific capital and salary values sourced from Sanity CMS (Ref: CR-20260731-001; superseded fetch mechanism — previously the Backend API/Table A/B). The templates are:

      • Node Level 1: "Associate Track Entry. Start here to unlock [Capital Amount] in firm-backed capital upon passing."
      • Node Level 2: "Accelerated Track Entry. Bypass Level 1 entirely. Unlock [Capital Amount] in firm-backed capital upon passing."
      • Node Level 4: "Level 4: [Capital Amount] Book. [Capital Amount] in capital as an Associate Trader."
      • Node Level 5: "Advanced Track Entry. The ultimate shortcut. Bypass Levels 1-4. Start with [Capital Amount] and sit exactly 1 promotion away from a W-2 Salary."
      • Node Level 6 (W-2): "Level 6: W-2 Employee. Reach Level 6 to unlock W-2 employment, a guaranteed base salary, and comprehensive health benefits."
      • Node Level 9 (Drawdown Defense): "Level 9: Drawdown Defense Active. Your drawdown limit does not trigger immediate termination. Stay active to regain your edge."
      • Node Level 16: "Level 16: [Capital Amount] Book. [Capital Amount] in capital as a Senior Trader."
      • Node Level 22: "Level 22: [Capital Amount] Book. [Capital Amount] in capital as a Managing Principal Trader."
      • Node $20M line: "[Capital Amount] Book. [Capital Amount] in capital managing institutional volume."
      • Node Level 24: "Level 24: [Capital Amount] Book. [Capital Amount] in capital as a Managing Principal Trader with [Salary Amount]+ salary and full corporate benefits."
    • Milestone Cards (static row below the graph): A row of 4 static cards summarising the graph's key milestones. Each card shows a Level label plus a short descriptor. These are separate UI from the hover tooltips above (always visible, no hover required) and must stay consistent with them:

      CardLevel labelDescriptor
      1Level 1"$25K Start"
      2Level 6"W-2 Employee"
      3Level 9"Drawdown Defense Active"
      4Level 24"$75M Book"

      The two capital figures (\$25K, \$75M) are Sanity values from the same level dataset as the hover nodes and the 24-Levels table (Ref: CR-20260731-001); the level labels and descriptor copy are hardcoded.

    • Supporting Content Cards (3 blocks below the graph): Three informative cards rendered side by side, each opening with a circular gold icon badge above its heading (Card 1 = briefcase, Card 2 = pie chart, Card 3 = framed-image glyph). Card 1 and Card 2 are heading + a single body paragraph, all hardcoded copy; Card 3 is heading + description paragraph + a data row list carrying numeric compensation data (Ref: BR_1.5.2.4). Copy below is transcribed from the final design (BA confirmation, 2026-08-24).

      • Card 1 — "The W2 Career Scaling Plan": "The prop firm industry is built on keeping traders trapped as 1099 contractors in a simulated environment. We are building a proprietary trading desk. Progression through the Associate Track leads to immediate live capital. Advancing to Level 6 triggers W2 employment, complete with a base salary and comprehensive health benefits. You scale your notional buying power from $25,000 all the way to $75,000,000 while building a legitimate career."

        • ⚠️ Documented conflict — final design overrides QnA MKT-30 item 2 (Ref: MKT-45, BA decision 2026-08-24): QnA MKT-30 item 2 (2026-07-24, Tiered Price Points PDF) mandated replacing the fixed "from $25,000" with "from your chosen starting tier", on the rationale that the entry tier varies by the Capital Allocation Path chosen at Checkout (Ref: MKT-26). The final design still carries the original "from $25,000" wording, and the BA has confirmed the final design as the copy to build. The sentence above therefore follows the final design, not MKT-30 item 2. MKT-30 item 2 is recorded as superseded for copy purposes only — items 1 (sub-headline) and 3 (hover-node templates) of MKT-30 remain fully in force. ⚠️ Residual business risk, flagged not resolved: with three Capital Allocation Paths on sale ($25K / $50K / $150K entry, Ref: MKT-26), a hardcoded "from $25,000" understates the entry point for the two higher tiers — re-confirm with the client if this becomes a marketing-accuracy concern.
      • Card 2 — "Immutable, Code-Driven Payouts": "Retail firms use manual review boards to find excuses to deny your payouts. Stack Trading removes human interference entirely. When you hit your target, the bonus is executed automatically via code. There is no manual review, no delay, and no subjective auditing. Every payout and level progression is an immutable record written directly to the blockchain. You earn it, the code verifies it, and the cash clears."

      • Card 3 — "Absolute Cash Over Fake Percentages": Opens with a description paragraph, followed by a Sanity-managed, editable list of cumulative-earnings rows (Ref: MKT-43, see BR_1.5.2.4).

        • Description: "Competitors market 90 percent profit splits on simulated pennies. We market absolute, compounding wealth. Our traders do not chase percentages. They scale massive notional capital and stack hard cash."
        • Row list: Each row shows a Level + role label, a metric label, a parenthetical qualifier, and a dollar figure, with a thin horizontal divider between rows. The Level label and metric label sit left-aligned; the dollar figure is right-aligned on the same baseline as the metric label. Current content at time of writing:
        Level + role labelMetric labelQualifierFigure
        Level 10 (Senior Trader 1)Cumulative Bonuses(In Addition to Base & Benefits)$48,178
        Level 14 (Senior Trader 2)Cumulative Cash(In Addition to Base & Benefits)$391,928
        Level 16 (Senior Trader 2)Cumulative Cash(In Addition to Base & Benefits)$969,428

        The role labels are consistent with the firm-wide level→role mapping (Levels 10–13 = Senior Trader 1, Levels 14–17 = Senior Trader 2; Source: Zapier Integration V7.pdf Discord role table). The metric label deliberately differs between the first row ("Cumulative Bonuses") and the other two ("Cumulative Cash") — this mismatch is intentional and must be preserved exactly as designed; do not normalise the two labels to a single wording (Ref: MKT-43c). The 3 rows above are the current content, not a fixed structure — Marketing can add, remove, and reorder rows through Sanity (BR_1.5.2.4), so QC must assert against the published Sanity content rather than against a hardcoded expectation of exactly these 3 levels.

  3. 24 Levels of Career Progression Table:
    • Displays a comprehensive table of all 24 levels.
    • Toggle: Users can toggle between "Forex" and "Futures" to switch the displayed Notional and Profit Target/Stop Loss values.
    • Pagination: "View More" button loads additional rows (in-page, no navigation).

3. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.5.2.1Sanity Fetch Failure (Ref: CR-20260731-001, supersedes MKT-17 API/DB error framing)Frontend fails to fetch pricing/level configurations from Sanity CMS (CMS timeout or unpublished document).
E_1.5.2.2"View More" Clicked at End of Data (24th Level Already Shown)Per wireframe 24 levels of Career Progression (View More states).png, the table paginates via "View More". User clicks "View More" after all 24 levels are already rendered.
E_1.5.2.3Forex/Futures Toggle Switched Mid-Row-ExpansionUser has clicked "View More" to expand additional rows, then toggles between "Forex" and "Futures".
E_1.5.2.4Pricing Data vs CR-20260726-004 (Table J) — Manual Alignment Required (Ref: CR-20260731-001)CR-20260726-004 (★★★★, highest priority) introduces a new Table A (Forex 24-level matrix) and Table B (Futures, ES-normalized) plus Table J (Evaluation & Reset Pricing) for Checkout/Backend use. Since CR-20260731-001, this Timeline's display values are Sanity-authored, not fetched from those tables.
E_1.5.2.6"Absolute Cash" Card Returns 0 Rows or an Unexpected Row Count (Ref: MKT-43d)Per BR_1.5.2.4 the card is a Sanity-editable array, so the published row count is not guaranteed to be 3 — Marketing may empty the list, leave it unpublished, or author many more rows than the design mock shows.
E_1.5.2.5Timeline Graph and Table Data MismatchThe Timeline Graph (§2 step 2) hover-node text and the 24-Levels table (§2 step 3) are both authored as separate Sanity content — risking mismatch if only one is updated.

4. Business Rules

BR_IDRule Description
BR_1.5.2.1(Ref: CR-20260731-001, supersedes prior "must source from backend API" rule) The timeline and table must source their numbers from Sanity CMS. To remain consistent with Checkout and Zapier logic (Table A/B/J), the Marketing/BA team must manually keep the Sanity-authored values aligned with those tables whenever they change — there is no automatic sync between Sanity and the Backend/Zapier tables.
BR_1.5.2.2Toggle State Independence: The Forex/Futures toggle selection must not reset the "View More" pagination state, and vice versa — the two UI states are independent.
BR_1.5.2.3Fixed Level Count: The table must always represent exactly 24 levels; "View More" pagination must stop once all 24 rows are rendered, with no further fetch attempts.
BR_1.5.2.4"Absolute Cash Over Fake Percentages" Is a Sanity-Managed Editable Row List (Ref: MKT-43, 2026-08-24): Card 3 (§2 step 2) is the page's fourth pricing-data block, alongside the Timeline dot data, "Level 6: Welcome to the Payroll" (BR_1.5.1.3), and the 24-Levels table. Rules: (1) Sanity, not hardcode — the card's content is authored in Sanity CMS; Marketing/Finance updates it without an engineering deploy. (2) Editable row list, not fixed fields — the card is an array of rows, not 3 fixed slots. Marketing can add, remove, and reorder rows (e.g. add a Level 20 row later), so the FE must auto-layout whatever row count Sanity returns; the current 3 rows (Level 10 / 14 / 16) are content, not structure. Because the row set is editable, each row carries its own label fields — Level + role label, metric label, qualifier, and figure are all per-row Sanity fields; only the card heading, the card container, and the row layout/typography stay hardcoded, consistent with BR_1.3.4.1. (3) Label wording is preserved as designed — the "Cumulative Bonuses" (row 1) vs "Cumulative Cash" (rows 2–3) difference is accepted as-is per design; it must not be normalised to one wording. (4) No sync with Table A/B — the figures are not derived from and not synced with the Zapier cumulative-bonus columns. Keeping them coherent with the 24-Levels table and Table A/B is a manual content-maintenance responsibility of the Marketing/BA team, exactly as for every other Marketing-site pricing block since CR-20260731-001 (same posture as E_1.5.2.4). RACI: Sotatek builds the Sanity array schema + FE auto-layout render; Stack Trading (Marketing/Finance) owns the row set and all values as content; no third party. Applies identically to the Associate Track teaser rendering of this card (UC_1.4.1 §3 item 6, Ref: MKT-44).

UC_1.5.3 — Trustpilot Reviews

1. Overview

FieldContent
IDUC_1.5.3
Use CaseTrustpilot Reviews
DescriptionDisplays the Trustpilot review slider.
Zapier Flow
Zapier Table
3rd PartyTrustpilot

2. Basic Flow

  1. Refer to UC_1.3.3 for full API fetching, slider behavior, and data limits.

3. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.5.3.1Trustpilot API Failure / Insufficient ReviewsSame conditions as E_1.3.3.1a/E_1.3.3.1b (score/count = required component; testimonials = optional component) and E_1.3.3.2 (fewer than 3 valid 4/5-star reviews).

4. Business Rules

BR_IDRule Description
BR_1.5.3.1This page inherits BR_1.3.3.1 (4/5-star floor), BR_1.3.3.2 (20-review cap, backend-only filtering/capping), BR_1.3.3.3 (English-only, Day 1 scope), BR_1.3.3.4 ("Read More" for long text), and BR_1.3.3.5 (required vs optional fallback split) without modification.

UC_1.5.4 — Dynamic Content (Sanity CMS)

1. Overview

FieldContent
IDUC_1.5.4
Use CaseDynamic Content (Sanity CMS)
DescriptionDisplays the "Frequently Asked Questions" (FAQ) section which is dynamically managed by Sanity CMS.
Zapier Flow
Zapier Table
3rd PartySanity CMS

2. Basic Flow

  1. Frequently Asked Questions (FAQ): Refer to UC_1.3.4 - Frequently Asked Questions (FAQ) for full API fetching logic, accordion UI behavior (hover, click, expand/collapse), and Sanity CMS global editing rules.

3. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.5.4.1CMS Fetch Failure / Zero FAQ ItemsSame conditions as E_1.3.4.1 (Sanity API failure) and E_1.3.4.4 (no items selected for this page in the page-FAQ settings tab, or the entry is missing/unfetchable — Ref: CR-20260817-001, E_1.8.8.5).

4. Business Rules

BR_IDRule Description
BR_1.5.4.1This page inherits BR_1.3.4.1 (Sanity content-only editing) and BR_1.3.4.2 (accordion expand behavior) without modification.
BR_1.5.4.2FAQ Content Dataset (Ref: CR-20260817-001): The FAQ content pulls from the same single master list ("All FAQ list") in Sanity CMS across the entire site. Administrators select exactly which individual questions appear on this page via the page-FAQ settings tab — one entry per static page, per-item picks, editor-defined order, items freely shared across pages. Canonical mechanism: UC_1.8.8 §4.9/BR_1.8.8.5. Selection by category tag is no longer used — categories now only group the Help Center sidebar.

1.6. About Us

UC_1.6.1 — Static Components (Next.js)

1. Overview

FieldContent
IDUC_1.6.1
Use CaseStatic Components (Next.js)
DescriptionProvides the static UI layout including: Company story, Mission, Founder story, "Why Us?", and Regulatory pursuit. All content is hardcoded.
Zapier Flow
Zapier Table
3rd PartySanity CMS (signup-gate CTA config, Ref: CR-20260731-002)
CMS EditabilityAbout Us row in Marketing Site — CMS Editability Scope (Overall): Layout = Hardcode; FAQ = N/A (this page has no FAQ section — see BR_1.6.2.2); Other Content = Team Members block (UC_1.6.2) is Sanity, everything else on this page is Hardcode; Mode Waitlist = Sanity. Pricing Data (corrected — the source docx originally marked this N/A): maps to the "Team Members block" (UC_1.6.2) — see index.md Pricing Data section map. (Separately, the Pre-Footer CTA's $499/$650 founder pricing, §3 item 7, is already documented but tracked under Mode Waitlist/CTA-pricing, not this Pricing Data section.)

2. Trigger

User navigates to the About Us page (/about-us). Known entry points include: the Header "About Us" link and Footer "Company" column's "About Us" link (UC_1.1.1 §6).

3. Basic Flow & UI Rules

Section order on the page (top → bottom): Hero → Institutional Infrastructure → Radical Transparency → A Return to Standards → Leadership Team (UC_1.6.2) → A Real Floor for Real Operators → Regulated Ambition → Pre-Footer CTA. Note the Sanity-driven Leadership Team block sits between items 4 and 5 below.

  1. Hero Section:
    • Eyebrow Badge: A small pill above the header reading "About Us", flanked by decorative glyphs.
    • Header (2 type styles, per the site's standard mixed-serif treatment): "We Built the Firm We Wanted to Trade For" — "Firm We Wanted" is rendered in the italic serif accent style.
    • Company Story: "Stack Trading is a US based proprietary trading firm. No offshore shell companies. Real capital, direct market access, and a clear path to W2 employment."
    • Media: A rounded, soft-shadowed photo of the physical trading floor sits to the right of the copy (desktop). This supports the RFQ's "Real people, real office etc. Not a server in Dubai/island" intent (Source: RFQ_ Website and Dashboard Implementation V7.pdf §Page 10 — About Us).
    • Button: Review the Associate Track - Clicking redirects (same tab) to the Associate Track Page (/associate-track).
  2. Institutional Infrastructure:
    • Displays the scrolling logo ticker, Trustpilot Micro Combo widget, and NFA ID text.
    • For detailed layout, logo marquee motion, and Trustpilot real-time fetching logic, refer to UC_1.3.1 - Institutional Infrastructure.
  3. Radical Transparency in a Shadowy Industry:
    • Header: "Radical Transparency in a Shadowy Industry" ("a Shadowy Industry" in the italic serif accent style).
    • Text Block: "The retail prop trading space is currently dominated by unregulated entities operating out of island tax havens. Their business models are incentivized on traders failing. We operate entirely differently. We are a regulated onshore entity designed to capture real market alpha. Our business model is reliant on trader success."
    • Comparison Cards (2-up): Below the text block, two side-by-side cards contrast the industry against Stack Trading. Each card has an icon tile at the top-left, a title, and a 4-item bullet list rendered in monospace.
      • Card 1 — "The Industry Standard" (neutral/dark card, each bullet prefixed with an ✗ icon):
        1. "Unregulated offshore entities"
        2. "Zero regulatory oversight"
        3. "Delayed or simulated market data"
        4. "Business model reliant on failed evaluations"
      • Card 2 — "The Stack Trading Standard" (gold-accented card carrying the Stack S logo tile, each bullet prefixed with a ✓ icon):
        1. "US Parent C-Corp, Operating in Texas"
        2. "NFA Registered Introducing Broker"
        3. "CME Level 2 data paid by the firm"
        4. "Business model reliant on trader success"
      • The two cards are visually differentiated (Card 2 uses the gold/warm treatment) so the Stack column reads as the positive side of the comparison.
  4. A Return to Standards — Founder's Letter:
    • Header: "A Return to Standards" ("Standards" in the italic serif accent style).
    • Frame: The entire block sits inside a decorative guilloché (banknote/certificate-style) border with a gold outer keyline — a deliberate "certificate" visual treatment, not a plain content section.
    • Media: The founder's portrait photo sits to the left of the copy (desktop).
    • Text Block (3 paragraphs + a bolded closing line):
      1. "Proprietary trading was never meant to be a simulated video game. My journey began on the physical trading desks of Bright Trading and Swift Trade Securities, learning microstructure and risk management before algorithms took over. I saw firsthand that professional trading requires discipline, capital preservation, and aligned incentives - not just leverage."
      2. "Somewhere along the way, the industry lost its way. It shifted from finding talent to farming fees, and then working against the traders who pass. Most modern "prop firms" are marketing companies selling a simulation of success. After spending 15 years building institutional execution systems for Bank of America (InstaQuote) and Refinitiv (REDI) overseeing billions in monthly notional flow, I decided it was time to build the alternative."
      3. "At Stack Trading, we are restoring the standard. We are the first firm to build a bridge between the retail "challenge" model and true institutional W-2 employment. We are looking for the 1%. The traders who understand that risk management is more important than a lucky streak."
      4. (bold) "We are not here to sell you a reset. We are here to build the path."
    • Signature Block: A handwritten-style signature image reading "Adrian Stack", with the caption "Founder & CEO" beneath it.
    • This block contains no button and no link.
  5. A Real Floor for Real Operators:
    • Header: "A Real Floor for Real Operators" ("Real Operators" in the accent style). The whole block is a centered, full-width card with a dimmed trading-floor photo as its background.
    • Text Block: "We are headquartered in Frisco, Texas. While our remote operators trade our capital from around the world, our physical doors are open to local talent. We operate a live trading floor complete with a broadcast studio, pod mentorship clusters, and direct market access infrastructure."
    • Button: Explore the Trading Floor - Clicking redirects (same tab) to the Trading Floor / Community Page.
  6. Regulated Ambition:
    • Header: "Regulated Ambition" (2 lines, with "Ambition" partially in the gold accent style).
    • Text Block: "Stack Trading Corporation is formed in Delaware (File No. 10426411) and registered to do business in Texas (File No. 806337378). Stack Trading Brokerage LLC is fully registered with the National Futures Association (NFA ID: 0580183) as an Introducing Broker. We believe regulatory oversight is the only path forward for the proprietary trading industry, and we enforce those rigorous standards across our entire operation." (Source: Client Slack confirmation, Adrian, 2026-07-30 — NFA ID, Delaware File No., and Texas File No. confirmed; copy updated to client's approved wording.)
    • Credential Card (right side, desktop): A card visually styled as a certificate, containing top-to-bottom:
      1. A gold seal/medallion bearing the Stack S logo, overlapping the top edge of the card.
      2. A small pill reading "Registered", flanked by decorative glyphs.
      3. Title: "Introducing Broker".
      4. Sub-line: "NFA ID: 0580183" (the ID rendered in the muted monospace style).
      5. Button: Verify Status — full-width, secondary/outline style. Clicking opens the NFA BASIC public record page for Stack Trading Brokerage LLC (NFA ID 0580183) in a new tab (target="_blank", with rel="noopener noreferrer"). See BR_1.6.1.2 for the link rule and E_1.6.1.6 for the failure path.
  7. Pre-Footer CTA ("Ready to start your career"):
    • Header: "Ready to start your career"
    • Sub-header: "Join the Associate Track and begin your path to professional proprietary trading with real capital, transparent rules, and institutional support."
    • Motion: Applies the exact same scrolling text highlight motion effect as the "Stop Gambling. Start Your Career." section, and the same button hover motion as the UC_1.3.1 Pre-Footer CTA button (Ref: MKT-03 — motion spec is not fixed in the SRS; Frontend follows the Figma/video reference).
    • Data Source (Ref: CR-20260731-001): Same as UC_1.3.1 Pre-Footer CTAfounder_count and both price values are Sanity-configured, no BE/DB fetch.
    • Button: Start Associate Track — the label is static across both pricing states; unlike the Homepage's Begin The Associate Track - $499 button, the price is never rendered inside the button on this page. Clicking routes (same tab) to the Checkout flow.
    • Pricing Bar: A separate bordered bar sits below the button and carries the pricing display (not the button itself).
      • State 1 (Founder Slots <= 500): Shows the original price struck through, then the discounted price, then the label — "$650/month $499 — Founding Member Pricing".
      • State 2 (Founder Slots > 500): Shows "Evaluations starting at" on the left and "$650" on the right.
    • Waitlist Mode (Ref: CR-20260731-002): If the Sanity-configured signup-gate variable indicates signups are closed, the button label changes to "Join Waitlist" and routes (same tab) to the Waitlist form. The state-switching mechanism (Sanity variable read, text swap, and the revert-to-original-price behavior) is identical to the Homepage's Begin The Associate Track - $499 button (UC_1.3.1 §5); only the default label differs. See BR_1.6.1.5.

4. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.6.1.1NFA ID Pending[Removed]
E_1.6.1.6Verify Status Destination UnreachableThe NFA BASIC record page (§3 item 6) is down, moved, or returns an error when the user clicks Verify Status.
E_1.6.1.2Institutional Infrastructure / Trustpilot Fetch FailureThe ticker/Trustpilot block (§3 step 2) reuses UC_1.3.1 - Institutional Infrastructure fetch logic.
E_1.6.1.3Pre-Footer CTA — Race Condition / founder_count Sanity Fetch Failure (Ref: CR-20260731-001)Pre-Footer CTA (§3 step 7) explicitly reuses UC_1.3.1 race-condition and Sanity-fetch-failure logic.
E_1.6.1.4Waitlist Mode (CR-20260731-002, supersedes MKT-36 Backend-flag-driven wording)The Sanity-configured signup-gate variable indicates signups are closed.
E_1.6.1.5Regulatory Status Text Becomes StaleThe "Regulated Ambition" text block is hardcoded in Next.js.

5. Business Rules

BR_IDRule Description
BR_1.6.1.1NFA Credential Card Display: The "Regulated Ambition" credential card (§3 item 6) must always render the confirmed NFA ID 0580183 alongside the "Introducing Broker" title. The card is hardcoded — the ID is not fetched from any API or CMS.
BR_1.6.1.2Verify Status External Link Target: The Verify Status button must link to the NFA BASIC public record for Stack Trading Brokerage LLC (NFA ID 0580183) and must open in a new tab (target="_blank" + rel="noopener noreferrer"), so the user never loses the About Us page. The link is a static hardcoded URL — the site does not query the NFA API. Changing the destination URL requires an engineering deploy and Compliance review, same as BR_1.6.1.4.
BR_1.6.1.3Reused Logic Consistency: Institutional Infrastructure, Pre-Footer CTA pricing/race-condition logic, and Waitlist mode gating on this page must always match UC_1.3.1's current implementation — this page must not diverge or lag behind updates made to UC_1.3.1.
BR_1.6.1.4Hardcoded Content Change Control: Any change to the regulatory status text in "Regulated Ambition" requires an engineering deploy (no CMS path exists per current scope), and must be reviewed by Compliance before release.
BR_1.6.1.5Pre-Footer CTA — Price Lives Outside the Button: On About Us, the Pre-Footer button label is the static string Start Associate Track in both pricing states; the $499/$650 figures render only in the separate pricing bar beneath it (§3 item 7). This differs deliberately from the Homepage, where the price is embedded in the button label (Begin The Associate Track - $499, UC_1.3.1 §5) — the two must not be normalized to each other. Confirmed by the client's own scope document, which spells out the difference explicitly: About Us reads "Đổi sub-text từ 499 về 650" and lists only Start Associate Track as its CTA, whereas Homepage/Rules/Comparison Hub read "Đổi text button từ 499 về 650" (Source: [Internal] Pricing Data Display - Marketing Site.docx §About Us / §Homepage). Everything else is shared: the Sanity founder_count read, the price-state switch, the revert-to-original-price behavior, the Waitlist-mode label swap, and the button hover motion all follow UC_1.3.1's implementation exactly, per BR_1.6.1.3.

UC_1.6.2 — Dynamic Content (Sanity CMS)

1. Overview

FieldContent
IDUC_1.6.2
Use CaseDynamic Content (Sanity CMS)
DescriptionDisplays the "Leadership Team" section. Profiles are fetched and rendered from the Sanity CMS Team collection.
Zapier Flow
Zapier Table
3rd PartySanity CMS

2. Basic Flow & UI Rules

  1. Header & Subtext:
    • Header: "Institutional Plumbing Meets Retail Talent".
    • Subtext: "Stack Trading is operated by professionals with deep backgrounds in product management, regulatory compliance, and institutional market access."
  2. Leadership Team Cards (Sanity CMS):
    • Next.js ISR fetches team profiles from the Sanity CMS Team collection.
    • Grid Layout: The UI renders member cards in a 4-column grid (desktop), wrapping to additional rows as the member count grows (currently 2 rows / 8 cards). The grid fills left-to-right in the order configured in Sanity.
    • Data Fields: Avatar Image, Full Name, Role/Title (e.g., "Founder & CEO"), List of Badges/Tags (e.g., "Series 3", "Series 24", "Forbes Finance Council"), and a detailed Bio Description. All of these fields are fully customizable and managed directly via Sanity CMS.
  3. Card Interaction (Hover Flow):
    • Default State: Displays the member's Avatar Image filling the card. The Full Name and Role appear at the bottom left. The Badges/Tags are displayed as small pills at the top right (wrapping to a second pill row when a member has 3+ badges).
    • Hover State: When the user hovers over a card, a light frosted-glass overlay covers the image and the card is visually lifted/highlighted above its neighbours. The Full Name, Role, and Badges transition to the top left of the card, and the detailed Bio Description text is revealed below them.

3. Exceptional Flows

Exception IDConditionSystem Handling / Fallback
E_1.6.2.1Sanity API FailureFrontend Next.js ISR fetch fails to get the Sanity CMS Leadership Team configuration.
E_1.6.2.2Zero Leadership Team Profiles PublishedSanity CMS Team collection returns an empty array.
E_1.6.2.3Placeholder / Unfilled Team Entry (TBD)A Sanity Team entry exists as a reserved slot with placeholder values (e.g., Full Name = "TBD", Role = "TBD") and/or a generic stock avatar, used to hold a seat for an unannounced hire.
E_1.6.2.4Team Member Missing Optional Fields (Badges/Tags or Bio)A Sanity Team entry has an empty Badges/Tags list or missing Bio Description.
E_1.6.2.5Card Interaction on Touch Devices (No True Hover)§2 step 3 "Card Interaction (Hover Flow)" is hover-only, but touch devices lack a persistent hover state.

4. Business Rules

BR_IDRule Description
BR_1.6.2.1Global Rule (Sanity CMS): Marketing Ops can add, edit, or delete Leadership Team profiles (Name, Role, Avatar, Tags, Bio) via Sanity CMS without engineering support. The layout structure (4-column grid and hover interaction) is hardcoded.
BR_1.6.2.2No FAQ Section on About Us: The About Us page does not host an FAQ section. This supersedes QnA MKT-06 (2026-07-24, "FAQ và Team Members sẽ nằm trong trang About Us…") — only the Team Members half of that answer holds; the FAQ half does not. Independently corroborated by the client's own scope document, which lists About Us → FAQ section = N/A (Source: [Internal] Pricing Data Display - Marketing Site.docx §Overall Scope). Site-wide FAQ remains on the Homepage (UC_1.3.4), Career Path (UC_1.5.4), and the Utility Suite pages (UC_1.8). See the Changelog v1.10 entry for the supersession record.
BR_1.6.2.3Badge Values Are Free-Text Content: Badge/Tag values (e.g., "Series 3", "Series 24", "Series 34", "Forbes Finance Council") are arbitrary strings entered per member in Sanity — the frontend performs no validation against a fixed license list and renders whatever is configured. Accuracy of these credentials is a content/Compliance responsibility, not a system rule.

On this page

ChangelogGlossaryDocument ReferencesUC Index1. Global LayoutShared Architecture: Cloudflare Edge Access Block (applies to every Marketing page — UC_1.1.1 → UC_1.9.x)UC_1.1.1 — Navigation & Footer1. Overview2. Trigger3. Pre-conditions4. Post-conditions5. Basic Flow6. UI/UX Rules7. Exceptional Flows8. Business RulesUC_1.1.2 — Cookie Consent (Cookiebot)1. Overview2. Trigger3. Pre-conditions4. Post-conditions5. Basic Flow6. Exceptional Flows7. Business RulesUC_1.1.3 — GA4 + GTM Analytics1. Overview2. Trigger3. Pre-conditions4. Post-conditions5. Basic Flow6. Event Specifications & Screen Mapping7. Exceptional Flows8. Business Rules2. CRM & AnalyticsUC_1.2.1 — CRM & Email Marketing Setup1. Overview2. Trigger3. Pre-conditions4. Post-conditions5. Basic Flow6. UI Rules — Form Validation & States7. Exceptional Flows8. Business Rules3. HomepageUC_1.3.1 — Static Components (Next.js)1. Overview2. Trigger3. Pre-conditions4. Post-conditions5. Basic Flow & UI Rules6. Exceptional Flows7. Business RulesUC_1.3.2 — Live Payout Ledger1. Overview2. Trigger3. Pre-conditions4. Post-conditions5. Basic Flow & UI Rules6. Exceptional Flows7. Business RulesUC_1.3.3 — Trustpilot Reviews & Community1. Overview2. Trigger3. Pre-conditions4. Post-conditions5. Basic Flow & UI Rules6. Exceptional Flows7. Business RulesUC_1.3.4 — Dynamic Content (Sanity CMS)1. Overview2. Trigger3. Pre-conditions4. Post-conditions5. Basic Flow & UI Rules6. Exceptional Flows7. Business Rules1.4. The Associate TrackUC_1.4.1 — Static Components (Next.js) (CR-20260726-004)1. Overview2. Trigger3. Basic Flow & UI Rules4. Business Rules5. Exceptional Flows6. Cross-Reference NotesUC_1.4.2 — Trustpilot Reviews1. Overview2. Basic Flow3. Exceptional Flows4. Business Rules1.5. The Career PathUC_1.5.1 — Static Components (Next.js)1. Overview2. Trigger3. Basic Flow & UI Rules4. Exceptional Flows5. Business RulesUC_1.5.2 — Interactive Timeline (Sanity CMS) (CR-20260726-004, CR-20260731-001)1. Overview2. Basic Flow & UI Rules3. Exceptional Flows4. Business RulesUC_1.5.3 — Trustpilot Reviews1. Overview2. Basic Flow3. Exceptional Flows4. Business RulesUC_1.5.4 — Dynamic Content (Sanity CMS)1. Overview2. Basic Flow3. Exceptional Flows4. Business Rules1.6. About UsUC_1.6.1 — Static Components (Next.js)1. Overview2. Trigger3. Basic Flow & UI Rules4. Exceptional Flows5. Business RulesUC_1.6.2 — Dynamic Content (Sanity CMS)1. Overview2. Basic Flow & UI Rules3. Exceptional Flows4. Business Rules