StackTrading Docs

SRS: Stage 3 KYC & Live Onboarding — UC_5.6: Flow 3F Market Data Setup

FieldValue
BA in Chargelinh.nguyen34
Date Created2026-08-08
Versionv2.3
Last Updated2026-08-25 — Q3/Q6/Q7/Q8/Q10/Q13/Q14 answered: §7 stagnation path (Flow 19 + 72h cron), unknown user_id (404 + SEV-1), malformed payload (2-case split), idempotency guard confirmed, eval-to-live feed deactivation (bifurcated gateways), Level 5 subsidy sequence (pre-calc via /calculate-cart), Level 5 re-entry reverts to SIM. BR_5.6.11 updated.
Document ReferencesZapier Integration V7.pdf (Flow 3F lines 1229–1249; Table C Base_CME_Data_Cost line 201; CME_Whitelist table lines 586–654; Flow 22 lines 2177–2215) · RFQ_ Website and Dashboard Implementation V7.pdf (Step 4 Market Data Selection §Market Data Lifecycle Disclosure) · [Internal Stacktrading] User journey - EN_v6.md (lines 230–270, 840)

UC Index

UC_IDUse Case NameBusiness Description
UC_5.6Flow 3F — Market Data SetupAfter the ICA contract is sent and setup_status = 'Pending' (set by Flow 3D for Futures traders), the trader receives a "Level 1 Setup Form" by email to select their live-phase market data packages. Form submission fires a webhook to Zapier (Flow 3F). Option A (standard, firm-paid): system marks setup_status = 'Complete' and market_data_billable = False. Option B (premium add-ons, trader-paid): system initiates a checkout for the LIVE_DATA_UPGRADE product, sets setup_status = 'Pending_Payment'. Flow 3G (UC_5.7) handles Option B payment confirmation.

Changelog

DateVersionUpdated itemBeforeAfterNotes
2026-08-08v1Initial creationCreated SRS for UC_5.6 (Flow 3F)First authoring pass
2026-08-08v1.1BR_5.6.7 — tiered billing formulaSingle formula from Zapier onlyv7_full.txt tiered formula added; source conflict flaggedSource: RFQ_ Stack Trading Prop Tech V7.pdf lines 1585–1590 vs Zapier Integration V7.pdf Flow 22 lines 2186–2187
2026-08-10v1.2Q1: Webhook payload schema + Option A/B logic; Q4: POST /initiate-checkout failure spec + AC-5.6-08/09; Q5: Acceptance Criteria added; Input validation rules added[MISSING] / [ASSUMPTION]Confirmed by client 2026-08-10QnA Q1, Q4, Q5 answered
2026-08-15v1.8§7 Option B card capture path; §8 BR_5.6.9 NMI Collect.js (H-11); BR_5.6.10 M-16 no vault_id; §9 Wireframe updated; §10 Screen Description added; AC-5.6-11/12 addedNMI card capture [MISSING]; no vault_id path [MISSING]; §10 N/ANMI Collect.js/Hosted Fields for PCI-DSS card capture (STAGE3-059); no customer_vault_id → Secure Checkout screen opens (STAGE3-075)STAGE3-059/H-11 confirmed; STAGE3-075/M-16 confirmed
2026-08-17v2.0§5 Basic Flow Option B — added Sub-path B1/B2 (1-click vs Secure Checkout); BR_5.6.4 — added payment execution paths1-Click Confirmation Modal not documented for Option BSub-path B1: customer_vault_id IS NOT NULL → 1-Click Modal; Sub-path B2: IS NULL → BR_5.6.10 Secure Checkout. Source: dashboard_v7_full.txt lines 620–625; STAGE3-075
2026-08-24v2.1BR_5.6.3: $140$137.50 (client override of Table C); BR_5.6.7: cost allocation table by career phase + Day-1 market_data_billable rule for L1/L2 + Level 5 reference; BR_5.6.11 (new): Level 5 direct-entry immediate firm-pay at onboarding; AC-5.6-13 to AC-5.6-16 (new)Base_CME_Data_Cost = $140; no Level 5 vs L1/L2 distinction at onboarding; no Day-1 market_data_billable rule documentedBase_CME_Data_Cost = $137.50 (client override). Level 5 = Senior Live from Day 1 — firm covers CME base immediately at onboarding (Option A: $0.00 invoice; Option B: only add-on cost). Level 1 & 2 = Provisional — market_data_billable = True from Day 1, trader self-pays full cost until Level 3 refund.client confirmed 2026-08-24
2026-08-25v2.2 → v2.3§7 stagnation path (Q3); §7 unknown user_id (Q6); §7 malformed payload (Q7); §7 idempotency guard (Q8); §7 eval-to-live feed deactivation (Q10); BR_5.6.11 subsidy sequence + re-entry behavior (Q13/Q14)Multiple §7 entries marked [MISSING]; BR_5.6.11 lacked subsidy calc sequence; no re-entry behavior documentedAll [MISSING] tags removed. Flow 19 + 72h cron for stagnation; 404+SEV-1 for unknown user_id; 2-case split for malformed payload; idempotency guard via provider_event_id; bifurcated gateways explain eval feed deactivation; Level 5 subsidy = pre-calc via POST /calculate-cart; Level 5 Hard Breach re-entry → revert to SIM.Client confirmed 2026-08-25
2026-08-16v1.9§1 3rd Party — removed AWS SES; §4 Post-conditions Option B; §5 Basic Flow Option B; BR_5.6.4; §9 Wireframe Option B; AC-5.6-03"Payment link emailed to trader" in 5 locationsOption B payment completed on dashboard (no email) — POST /calculate-cart + POST /execute-checkout inline. Aligns with UC_5.5 v1.8 (STAGE3-042).
2026-08-12v1.7§1 form platform confirmed; §2 DB-state trigger path added (STAGE3-048); §3 pre-conditions updatedForm platform [MISSING]; §2 only documented form webhook triggerForm = native Stack Trading dashboard (STAGE3-042). STAGE3-048: after Flow 3E completes, next login forces trader to native Market Data selection screen (DB-state trigger path added to §2).STAGE3-042 confirmed 2026-08-12; STAGE3-048 confirmed 2026-08-12
2026-08-11v1.6§8 BR_5.6.2 — YM/MYM source conflict resolved; BR_5.6.8 (new) — Level 1/2 Micros Only restrictionYM/MYM bundle unresolved (Q9 open)CBOT confirmed (trader-paid); User Journey legacy grouping incorrect. New BR_5.6.8: Level 1/2 restricted to MES/MNQ/M2K only per Table BSTAGE3-030 confirmed 2026-08-11
2026-08-11v1.5§11 AC-5.6-01 terminology"Flow 3H triggered within the same Zap execution""internal Webhook asynchronously dispatched to trigger Flow 3H; Flow 3F Zap terminates" — Flow 3F and Flow 3H are separate ZapsSTAGE3-029 confirmed 2026-08-11
2026-08-11v1.4§7 POST /initiate-checkout failure — retry behavior3× auto-retry; after 3 retries create Freshdesk High-Priority ticket tagged Technical_Fault + Compliance_HoldNo automated retry. Manual Zapier run replay / admin panel. CloudWatch SEV-1 Slack alert. Freshdesk ticket removed.STAGE3-027 confirmed 2026-08-11 (supersedes Q4 2026-08-10 on retry behavior)
2026-08-10v1.3Q12: Tiered billing formula resolved — conflict flag removed; BR_5.6.7 updated with confirmed authoritative formula⚠️ Source conflict flag (Zapier V7 summary vs RFQ V7 tiered spec)Formula confirmed: Level 1 & 2 = Total_Market_Data_Cost; Level 3+ = Total − Base_CME_Data_CostQnA STAGE3-013 confirmed 2026-08-10

Glossary

For all shared project terminology, refer to: Project Glossary.


UC_5.6 — Flow 3F: Market Data Setup (Futures Only)

1. Overview

FieldContent
IDUC_5.6
Use CaseFlow 3F — Market Data Setup
DescriptionThis UC covers the Futures-only market data selection step that completes the second half of the dual aggregation gate for Flow 3H. The trader selects their live-phase data packages from four available exchange bundles (CME pre-selected; NYMEX, CBOT, COMEX optional). Option A chooses only the firm-covered standard CME feed — no additional charge. Option B selects one or more premium add-ons — the system initiates a trader-paid checkout. This step is separate from the evaluation-phase market data selection at Step 4 checkout, where all feeds were firm-paid at $0.00. In the live phase, only the base CME feed remains firm-paid; any additional exchange feeds are billed to the trader at Standard Exchange Professional Data rates.
Zapier FlowFlow 3F (Market Data Setup Handler — Futures Only)
Backend EndpointWebhook receiver from Level 1 Setup Form (native Stack Trading dashboard frontend — confirmed STAGE3-042) · Middleware Hub POST /initiate-checkout (Option B only)
Zapier TableUsers table (setup_status, market_data_billable)
3rd PartyZapier (Flow 3F) · Rithmic (feed provisioning — executed in Flow 3H / UC_5.8, not directly in this UC) · Payment processor (Option B — ACTIVE_PAYMENT_PROCESSOR config via dashboard checkout)

Scope note — Futures only: This UC applies exclusively to Futures (Asset_Class = 'Futures') traders. Forex traders have setup_status = 'N/A' (set by Flow 3D) and skip Flow 3F entirely.

Scope note — live phase vs evaluation phase: At Step 4 checkout (evaluation phase), all four exchange bundles (CME, NYMEX, CBOT, COMEX) were displayed at $0.00 — fully firm-paid. In the live phase governed by this UC, only the base CME feed (1 Level 2 feed, cost $140/month per Base_CME_Data_Cost in Table C) is covered by the firm. Additional exchange feeds (NYMEX, CBOT, COMEX) are billed to the trader at Standard Exchange Professional Data rates. is_professional = True is already set at contract signing (Flow 3E / UC_5.5), so professional rates apply immediately.

Scope note — form platform (STAGE3-042 confirmed 2026-08-12): The "Level 1 Setup Form" is hosted natively on the Stack Trading frontend dashboard — NOT Typeform or Zapier forms. The Flow 3D email contains a standard dashboard login link ("Action Required: Complete Market Data Setup"). On login, the dashboard forces the trader to the Market Data selection screen. Webhook fires on form submission from the native dashboard. This resolves Q2 (previously [MISSING]).


2. Trigger

Flow 3F fires from two paths:

Path 1 — Form webhook (standard): Inbound webhook from "Level 1 Setup Form" submission on the native Stack Trading dashboard. Trader accesses the dashboard via login link from Flow 3D email ("Action Required: Complete Market Data Setup").

Path 2 — DB-state forced screen (STAGE3-048 confirmed 2026-08-12): When Flow 3E completes (contract_status = 'Signed'), the DB state update is detected on next trader login. Dashboard reads contract_status = 'Signed' AND setup_status = 'Pending' → forces trader to the native Market Data selection screen directly (no additional email). This ensures traders who log in after signing the contract without going through the Flow 3D email are still routed to Flow 3F.

(Source: STAGE3-042 confirmed 2026-08-12; STAGE3-048 confirmed 2026-08-12)

Confirmed webhook payload fields (Source: QnA Q1 — confirmed 2026-08-10; supplemented 2026-08-10):

FieldTypeDescription
user_idUUIDPrimary key matching Users table
addon_ids (or metadata.addon_ids)JSON arrayProduct codes of selected feeds (e.g. ["CME_Bundle", "NYMEX_Bundle"]). May be top-level or nested inside a metadata object depending on form platform webhook format.
product_idString"LIVE_DATA_UPGRADE" — present for Option B flows
front_end_platform (or metadata.front_end_platform)StringTrader's execution platform selection (e.g. "NinjaTrader 8", "Quantower"). May be top-level or nested inside metadata.

Option A vs Option B determination (confirmed): Zapier filter evaluates addon_ids array content and size:

  • Option A (Standard — firm-paid): Form submitted with no premium add-ons selected. addon_ids contains only the 1 baseline CME feed (count == 1). Zapier writes setup_status = 'Complete', market_data_billable = False directly. If contract_status == 'Signed', Flow 3H is triggered in the same Zap execution.
  • Option B (Premium — trader-paid): Form submitted with additional premium exchange feeds beyond the firm-covered CME base. Condition: presence of premium product codes in addon_ids (i.e. count > 1). Zapier calls POST /initiate-checkout with product_id = "LIVE_DATA_UPGRADE" and the full addon_ids array. setup_status = 'Pending_Payment' is set only after successful API response.

The "Level 1 Setup Form" was emailed to the trader by Flow 3D (UC_5.5) when setup_status was set to 'Pending' after the three-way aggregation gate fired.

Platform note (STAGE3-042 confirmed 2026-08-12): The "Level 1 Setup Form" is hosted natively on the Stack Trading frontend dashboard. Q2 resolved — platform is no longer [MISSING].


3. Pre-conditions

  • Asset_Class = 'Futures' for user_id.
  • Flow 3D (UC_5.5) has already executed: setup_status = 'Pending' in Users table.
  • The "Level 1 Setup Form" email has been received by the trader (Path 1), OR contract_status = 'Signed' detected on login (Path 2 — STAGE3-048).
  • Trader has completed and submitted the Level 1 Setup Form on the native dashboard.
  • Webhook from the native dashboard has been received by Zapier.

Input validation rules (confirmed — Source: QnA Q5 2026-08-10):

  • user_id must be a valid, active UUID in the PostgreSQL Users table.
  • platform_selection must match an active system in Zapier Table I.
  • All addon_ids must map to valid product codes in Table C (Global Variables).
  • If any validation fails → Zap halts immediately, writes validation error to audit log, notifies trader to re-submit.

4. Post-conditions

Option A — Standard (firm-paid):

  • setup_status = 'Complete' in Users table.
  • market_data_billable = False in Users table.
  • Gate evaluated: if contract_status = 'Signed' → Flow 3H (UC_5.8) triggered via internal webhook.
  • If contract_status ≠ 'Signed': Zap terminates; Flow 3H will be triggered by Flow 3E when contract signing completes.

Option B — Premium add-ons (trader-paid):

  • POST /initiate-checkout called on Middleware Hub with product_id = 'LIVE_DATA_UPGRADE' and addon_ids = [selected exchanges].
  • Payment link emailed to trader by Middleware via the active payment processor. REMOVED (STAGE3-042 / UC_5.5 v1.8 2026-08-14): Option B payment is completed entirely on the Stack Trading dashboard. Frontend calls POST /calculate-cart + POST /execute-checkout inline — no payment link email sent.
  • setup_status = 'Pending_Payment' in Users table.
  • Zap terminates; payment confirmation handled by Flow 3G (UC_5.7).

5. Basic Flow

  1. Webhook received from Level 1 Setup Form: payload contains user_id and selected market data packages.

  2. Zapier evaluates option selected:

    Option A — Standard (firm-paid, includes 1 Level 2 CME Feed only):

    • Condition: addon_ids array contains only the baseline CME feed (count = 1).
    • UPDATE Users table WHERE user_id = webhook.user_id:
      • setup_status = 'Complete'
      • market_data_billable = False
    • Aggregation gate check: query contract_status for user_id.
      • IF contract_status = 'Signed' → dispatch internal Webhook to trigger Flow 3H (UC_5.8); Flow 3F Zap terminates.
      • ELSE → Zap terminates; wait for contract (Flow 3E will re-evaluate the gate).

    Option B — Premium add-ons (trader-paid, feeds beyond firm-covered CME):

    • Condition: addon_ids array contains CME + at least one premium bundle (count > 1).
    • Call Middleware Hub POST /initiate-checkout:
      • product_id = 'LIVE_DATA_UPGRADE'
      • addon_ids = [list of selected exchange bundles]
    • Middleware evaluates ACTIVE_PAYMENT_PROCESSOR config and emails trader a payment link. REMOVED (STAGE3-042 / UC_5.5 v1.8 2026-08-14): Payment is completed on dashboard via POST /calculate-cart + POST /execute-checkout inline — no email sent.
    • Payment execution on dashboard (two sub-paths):
      • Sub-path B1 — Trader has saved card (customer_vault_id IS NOT NULL):
        • Frontend renders 1-Click Confirmation Modal: displays "Total: $[Amount]" and "Pay with vaulted card [last 4 digits]".
        • Trader confirms → frontend calls POST /execute-checkout.
        • Backend executes charge against stored customer_vault_id — no re-entry of card details.
        • On success → payment processor sends payment_success webhook → Flow 3G (UC_5.7) fires.
      • Sub-path B2 — Trader has no saved card (customer_vault_id IS NULL):
        • See BR_5.6.10: Secure Checkout Screen opens for card capture via NMI Collect.js.
        • After successful vault registration → checkout proceeds as Sub-path B1.
    • DB update is executed ONLY after successful POST /initiate-checkout response:
      • UPDATE Users WHERE user_id: setup_status = 'Pending_Payment'
    • Zap terminates.

    (Source: Zapier Integration V7.pdf Flow 3F lines 1229–1249; QnA Q1 confirmed 2026-08-10; STAGE3-042 confirmed 2026-08-12)


6. Alternative Flow

  • [Contract already signed before form submission (Option A)]

    • Trader submits Level 1 Setup Form after Flow 3E has already set contract_status = 'Signed'.
    • Option A path: gate is immediately satisfied → Flow 3H triggered in this Zap execution.
  • [Contract already signed before form submission (Option B)]

    • Trader submits Level 1 Setup Form and selects premium add-ons after Flow 3E has already set contract_status = 'Signed'.
    • setup_status = 'Pending_Payment'; Flow 3H deferred until Flow 3G confirms payment.
    • When Flow 3G sets setup_status = 'Complete' and market_data_billable = True, gate check in Flow 3G finds contract_status = 'Signed' and triggers Flow 3H immediately.
  • [Trader selects only CME (Option A) having originally selected NYMEX/CBOT/COMEX at evaluation]

    • Live-phase selection is independent of evaluation-phase selection. The trader may choose to not carry premium feeds into live phase.
    • Result: market_data_billable = False; firm covers only the standard CME feed.

7. Exceptional Flow

  • [Level 1 Setup Form webhook never received (stagnation)] (Confirmed — client 2026-08-25)

    • No separate stagnation timeout exists for this form. Controlled by the global Flow 19 Stagnation Monitor: after contract signing, stagnation_deadline = contract_signed_date + 90 days. Reminder emails fire at D-14, D-7, D-2, D-1 before the deadline. If setup_status = 'Pending' at deadline, Stagnation Termination activates.
    • Additionally, a background cron job scans setup_status = 'Pending' every 72 hours and dispatches a reminder email to prompt the trader to complete the form.
    • No Ops escalation path short of the Stagnation Monitor (no Freshdesk ticket, no Slack alert for this specific gap).
    • (Source: Flow 19 Stagnation Monitor confirmed; client confirmed 2026-08-25)
  • [Webhook received with unknown user_id] (Confirmed — client 2026-08-25)

    • Middleware returns HTTP 404 Not Found with error detail. A SEV-1 alert is fired to Slack #risk-ops immediately for manual Ops investigation.
    • Do NOT silently drop — an orphaned webhook may indicate form misconfiguration or a spoofed submission.
    • (Source: client confirmed 2026-08-25)
  • [Webhook payload does not include market data selection] (Confirmed — client 2026-08-25)

    • Two cases:
      • Case 1 — Payload valid but addon_ids empty or absent: Treat as Option A (no premium feeds selected). Set market_data_billable = False, continue onboarding.
      • Case 2 — Payload malformed (invalid JSON or structural error): Reject — log error to bps_audit_logs, fire Ops Slack alert. Do NOT default to Option A silently — risk of wrong Rithmic permissions.
    • (Source: client confirmed 2026-08-25)
  • [Middleware Hub POST /initiate-checkout fails (Option B)] (Updated — Source: STAGE3-027 confirmed 2026-08-11; supersedes Q4 2026-08-10 on retry behavior)

    • setup_status naturally stays 'Pending' — the DB UPDATE to 'Pending_Payment' is only executed AFTER a successful API response. If the call fails → Zap halts immediately → DB update is never reached. No rollback required.
    • Retry: No automated retry or fallback is natively documented. POST /initiate-checkout is a synchronous dependency (must check ACTIVE_PAYMENT_PROCESSOR config and dynamically generate a payment link). Manual recovery required.
    • Ops alert: AWS CloudWatch alarm (SEV-1 — "Middleware Hub Unresponsive") triggers on 5xx or unresponsive endpoint → pushes immediate alert to designated Ops Slack channel. Per Production Readiness Checklist §6.0: centralized monitoring and alerting mandated for all Zapier failures, task quota thresholds, and middleware endpoint errors.
    • Recovery path: Admin or developer must manually replay the failed Zapier run, OR assist the trader via the authenticated admin panel once the endpoint is restored. Trader remains stuck at setup_status = 'Pending', blocking Flow 3H, until manual recovery is executed. (Source: STAGE3-027 confirmed 2026-08-11 — Zapier Integration V7 blueprint + Production Readiness Checklist §6.0)
  • [Duplicate webhook delivery (idempotency)] (Confirmed — client 2026-08-25)

    • Idempotency guard REQUIRED. Before executing Option A or Option B logic, Middleware checks current setup_status:
      • If setup_status IN ('Pending_Payment', 'Complete') → return HTTP 200 OK immediately (no-op). No checkout call, no Flow 3H re-trigger.
    • Guard uses provider_event_id / event_id from the webhook payload for dedup tracking.
    • (Source: client confirmed 2026-08-25)
  • [Option B — trader has no saved card / customer_vault_id IS NULL (STAGE3-075 / M-16)] (Confirmed — Source: STAGE3-075 confirmed 2026-08-15)

    • When the trader proceeds to pay for Option B premium feeds and no customer_vault_id exists for the trader in PostgreSQL, the system does not error out.
    • Middleware Hub detects customer_vault_id IS NULL and opens the Secure Checkout Screen (Stack Trading-owned card entry screen that embeds NMI Collect.js / Hosted Fields) so the trader can enter card details securely.
    • NMI Collect.js tokenises the card client-side → a payment_token is returned to the frontend → frontend POSTs payment_token to backend → backend submits token to NMI Customer Vault API → NMI creates vault entry and returns customer_vault_id → backend saves customer_vault_id in PostgreSQL Users table → redirects to Screen 1 (Manage Add-ons) → calls GET /user/saved-cards to refresh the saved-card list.
    • After successful card save, the Option B checkout flow proceeds as normal.
    • (Source: STAGE3-075 confirmed 2026-08-15; STAGE3-059 confirmed 2026-08-15)
  • [Option B — NMI card capture failure] (Confirmed — Source: STAGE3-059 / H-11 confirmed 2026-08-15)

    • If NMI Collect.js returns an error (tokenisation failure, network timeout, or NMI API non-200), the payment_token is invalid.
    • Backend does NOT submit the invalid token to NMI Customer Vault; customer_vault_id is not written.
    • Checkout is NOT initiated; setup_status remains 'Pending'.
    • Frontend displays an error on the Secure Checkout Screen and prompts the trader to retry card entry.
    • PCI-DSS constraint: raw card data NEVER reaches the Stack Trading backend — Collect.js/Hosted Fields iframe performs all card capture client-side. (Source: STAGE3-059 / H-11 confirmed 2026-08-15)
  • [Eval-to-Live transition — NYMEX/CBOT/COMEX feeds deactivated on entry] (Confirmed — client 2026-08-25)

    • When a Futures trader transitions from eval (SIM) to live phase, ALL premium feeds active during evaluation (NYMEX, CBOT, COMEX) are automatically deactivated.
    • System uses Bifurcated Gateways: eval runs on Rithmic Paper Trading (demo server); live runs on Live FCM Rithmic (separate server). On live entry, eval sub-account is disconnected — no feed carry-over.
    • On Live FCM Gateway, only standard CME feed is active by default (Option A). Premium feeds remain inactive until Option B payment confirmed via Flow 3G.
    • No explicit deactivation API call required — the gateway separation handles it structurally.
    • (Source: client confirmed 2026-08-25)
  • [CASE-RE-PASS-01 — Trader re-enters Live in same calendar month, exact feed match: bypass payment] (Confirmed — Source: CR-20260824-001 client confirmed 2026-08-24)

    • Scope: Futures only (asset_class = 'Futures'). Forex traders skip this check entirely (see BR_5.6.13).
    • Trigger: Trader passed SIM challenge and Flow 3F fires again for the same user_id in the same calendar month as a prior Live Pro Data payment. Middleware detects re-entry context by checking market_data_paid_until OR the invoices table for status = 'paid' rows within billing_period_month + year matching the current calendar month.
    • Condition: new_feed_selection ⊆ already_paid_feeds[] for the current billing month — the trader selected the same or a subset of the Pro feeds already paid this month.
    • Hành động:
      1. Skip payment screen entirely — do NOT call POST /initiate-checkout.
      2. Call Rithmic API to re-enable the previously paid Pro feeds on the trader's User ID.
      3. Set setup_status = 'Complete', update market_data_billable per selection.
      4. Write audit log: reactivation_reason = 'INTRA_MONTH_NO_CHARGE'.
    • Rationale: Pro Market Data fees and CME subscriber agreements are bound to Rithmic User ID (not Sub-Account). On Reset/Rebuy only the Sub-Account is cycled — the User ID is preserved with all intra-month entitlements intact. Double-charging for the same calendar month is incorrect. (Source: CR-20260824-001 client confirmed 2026-08-24)
  • [CASE-RE-PASS-02 — Trader re-enters Live in same calendar month, selects delta (new) feeds: charge delta only] (Confirmed — Source: CR-20260824-001 client confirmed 2026-08-24)

    • Scope: Futures only (asset_class = 'Futures'). Forex traders skip this check entirely (see BR_5.6.13).
    • Trigger: Same re-entry context as CASE-RE-PASS-01, but the trader selects ≥1 feed not present in already_paid_feeds[] for the current billing month.
    • Condition: delta_feeds = new_feed_selection − already_paid_feeds[] is non-empty.
    • Hành động:
      1. Split selection into two groups:
        • reactivation_feeds = intersection with already_paid_feeds[] → re-enable free (no charge).
        • delta_feeds = new feeds not in already_paid_feeds[] → require payment.
      2. Call POST /initiate-checkout only for delta_feeds (e.g. trader adds NYMEX not previously paid → charge NYMEX rate only, not full CME+NYMEX bundle).
      3. After delta payment confirmation:
        • Rithmic API re-enables reactivation_feeds (free).
        • Rithmic API activates delta_feeds (paid).
      4. Set setup_status = 'Complete', market_data_billable = True.
      5. Write audit log: reactivation_reason = 'INTRA_MONTH_DELTA', delta_feeds = [...]. (Source: CR-20260824-001 client confirmed 2026-08-24)

8. Business Rules

BR_5.6.1: Futures-Only Scope

Flow 3F is only executed for Asset_Class = 'Futures' traders. Forex traders skip this flow entirely; their setup_status is set to 'N/A' by Flow 3D.

(Source: Zapier Integration V7.pdf Flow 3D lines 1202–1205; Flow 3F line 1229)

BR_5.6.2: Four Exchange Bundles — CME Pre-selected, Others Optional

The Level 1 Setup Form presents four exchange data packages:

BundleExchangeRepresentative SymbolsBilling in Live Phase
CME (Standard)CMEES, MES, NQ, MNQ, RTY, M2K, BTC, MBT, ETH, METFirm-paid (included in Option A)
NYMEXNYMEXCL, MCL, NG, QG, RB, HO, PL, PATrader-paid (Option B add-on)
CBOTCBOTYM, MYM, ZN, ZB, ZF, ZT, UB, TNTrader-paid (Option B add-on)
COMEXCOMEXGC, MGC, SI, SIL, HGTrader-paid (Option B add-on)

CME is pre-selected; NYMEX, CBOT, and COMEX are optional add-ons.

YM/MYM source conflict resolved (STAGE3-030 2026-08-11): The User Journey description groups YM under a "CME" description ("Currency futures, indices (ES, NQ, YM)"). This is a legacy documentation error. The CME_Whitelist SQL initialization script is the authoritative operational source: YM and MYM are registered under Exchange = 'CBOT', not CME. CME_Whitelist DB supersedes User Journey grouping. YM/MYM are therefore trader-paid Option B instruments.

The tradeable symbols within each bundle are governed by the CME_Whitelist table. Symbols not in CME_Whitelist.Enabled = TRUE are blocked by the Middleware Hub at order routing.

Note: CBOT Grains (ZC, ZW, ZS, ZM, ZL) and CME Livestock (HE, LE, GF) are deferred to a future release and NOT available in the current form.

(Source: Zapier Integration V7.pdf CME_Whitelist table lines 586–654; RFQ_ Website and Dashboard Implementation V7.pdf Step 4 Market Data Selection lines 230–242; STAGE3-030 confirmed 2026-08-11)

BR_5.6.3: Option A — Firm-Paid Standard Feed

Option A (standard) includes exactly 1 Level 2 CME Feed covered by the firm. The monthly cost absorbed by the firm is Base_CME_Data_Cost = $137.50 (client-confirmed 2026-08-24). Selecting Option A sets:

  • setup_status = 'Complete'
  • market_data_billable = False

No charge to the trader. Flow 22 Monthly Data Fee Billing excludes this trader (Market_Data_Billable = False).

Source conflict (client override): Zapier Integration V7.pdf Table C line 201 states Base_CME_Data_Cost = $140. Client has confirmed the operative value is $137.50 (2026-08-24). Client-confirmed value supersedes Table C per priority chain (client supplement > Customer supplies v7). All UC references to CME base cost use $137.50.

(Source: Zapier Integration V7.pdf Flow 3F lines 1235–1239; Table C line 201 — overridden by client confirmation 2026-08-24)

BR_5.6.4: Option B — Trader-Paid Premium Add-ons

Option B applies when the trader selects any exchange bundle beyond the firm-covered CME feed. The system calls POST /initiate-checkout on the Middleware Hub with:

  • product_id = 'LIVE_DATA_UPGRADE'
  • addon_ids = [list of selected exchange bundles]

Middleware determines the active payment processor via ACTIVE_PAYMENT_PROCESSOR config (not hardcoded). emails the trader a payment link. REMOVED (STAGE3-042 / UC_5.5 v1.8 2026-08-14): Payment is completed on the Stack Trading dashboard — frontend calls POST /calculate-cart + POST /execute-checkout inline.

Payment execution paths:

  • customer_vault_id IS NOT NULL (saved card on file): Frontend renders 1-Click Confirmation Modal ("Total: $[Amount]", "Pay with vaulted card [last 4 digits]"). Trader confirms → POST /execute-checkout → backend charges stored vault — no re-entry of card details.
  • customer_vault_id IS NULL (no saved card): Secure Checkout Screen opens (BR_5.6.10) → NMI Collect.js card capture → vault registered → checkout proceeds as above.

setup_status = 'Pending_Payment' until payment is confirmed by Flow 3G.

(Source: Zapier Integration V7.pdf Flow 3F lines 1241–1249)

BR_5.6.5: Billing Distinction — Live Phase vs Evaluation Phase

This UC governs the live phase market data setup. The billing model is fundamentally different from the evaluation phase (Step 4 checkout):

PhaseWho paysFeeds availableCost to trader
Evaluation (Step 4 checkout)Firm pays 100%CME + NYMEX + CBOT + COMEX$0.00 for all
Live (Flow 3F — this UC)Firm pays CME base onlyCME (firm), NYMEX/CBOT/COMEX (trader-paid)Standard Exchange Professional Data rates for add-ons

is_professional = True is already set by Flow 3E (contract signing), so professional-tier exchange rates apply in the live phase.

(Source: RFQ_ Website and Dashboard Implementation V7.pdf §Market Data Lifecycle Disclosure; [Internal Stacktrading] User journey - EN_v6.md lines 255, 840)

BR_5.6.6: Dual Aggregation Gate — Both Legs Required for Flow 3H

Flow 3H (live provisioning, UC_5.8) can only be triggered when BOTH of the following are true:

  • contract_status = 'Signed'
  • setup_status IN ('Complete', 'N/A')

Flow 3F (this UC) is one of three paths that can set setup_status = 'Complete': Option A sets it directly; Option B defers to Flow 3G. If the contract is not yet signed when the form is submitted (Option A), this Zap terminates and Flow 3E will re-check the gate when the contract is signed.

(Source: Zapier Integration V7.pdf Flow 3F lines 1238–1239; Flow 3E lines 1223–1227)

BR_5.6.7: Market Data Billable Flag and Monthly Invoice Formula

market_data_billable determines whether Flow 22 (Monthly Data Fee Billing) includes this trader in the monthly invoice cycle:

  • market_data_billable = False (Option A): firm absorbs the CME base cost; trader receives no monthly bill for data.
  • market_data_billable = True (set by Flow 3G after Option B payment): Middleware generates a monthly invoice using the tiered formula below.

Cost allocation by career phase (client-confirmed 2026-08-24):

Career PhaseLevelResponsibilityCME base cost
Provisional LiveLevel 1 & Level 2Trader — 100% self-payTrader pays full Total_Market_Data_Cost (firm does NOT cover CME base)
Senior LiveLevel 3+Co-pay — Firm covers CME baseFirm deducts $137.50 from invoice; trader pays only premium add-on cost

Tiered billing formula (confirmed — Source: QnA STAGE3-013 2026-08-10; Base_CME value updated client 2026-08-24):

Trader levelInvoice formula
Level 1 & Level 2 (Provisional)Invoice_Amount = Total_Market_Data_Cost (full cost — firm does NOT cover CME base at Level 1/2)
Level 3+ (Senior)Invoice_Amount = Total_Market_Data_Cost - Base_CME_Data_Cost ($137.50) (firm covers CME base from Level 3+)

market_data_billable initialization at Onboarding (client-confirmed 2026-08-24):

For Level 1 & Level 2 traders entering live via Flow 3F: market_data_billable = True is set from Day 1 for Option B selections. Stripe/Triple-A payment card is updated at onboarding to enable monthly invoice scanning by Flow 22. Level 1 & Level 2 traders bear full Total_Market_Data_Cost each month until Level 3 promotion.

For Level 5 direct-entry traders: see BR_5.6.11 — firm-pay applies immediately at onboarding.

Consistent with GET /financial/calculate-data-refund endpoint: at Level 3 promotion, backend refunds only MARKET_DATA_BASE fees paid during Level 1 & 2 — confirming those were trader-paid at Level 1 & 2.

Source resolution: Zapier Integration V7.pdf Flow 22 lines 2186–2187 summary showed only Total − Base_CME (shorthand, Level 3+ formula). The detailed spec at "Perks & Batch Process Endpoints" in the same Zapier V7 document explicitly defines the tiered logic (Level 1 & 2 = no deduction; Level 3+ = deduct base). Both Zapier V7 detailed spec and RFQ_ Stack Trading Prop Tech V7.pdf lines 1585–1590 are now in agreement. Conflict resolved — no client follow-up needed.

(Source: Zapier Integration V7.pdf §Perks & Batch Process Endpoints — tiered billing logic; RFQ_ Stack Trading Prop Tech V7.pdf lines 1585–1590; QnA STAGE3-013 confirmed 2026-08-10; client billing protocol confirmed 2026-08-24)


BR_5.6.8: Level 1 & 2 — Micros Only Instrument Restriction (Table B)

Per the Futures Configuration Matrix (Table B), Level 1 and Level 2 traders are strictly restricted to micro-contract instruments only:

LevelPermitted instrumentsRestricted
Level 1 (Provisional)MES, MNQ, M2K (CME Micros only)YM, MYM, ZN, ZB, CL, GC, and all non-micro instruments
Level 2 (Math)MES, MNQ, M2K (CME Micros only)Same as Level 1
Level 3+ (Senior Associate)Full instrument access including YM, MYM

Interaction with Option B (CBOT add-on): A Level 1 or Level 2 trader may technically purchase the CBOT data add-on (Option B). However, even with the CBOT feed active, the order routing gateway will block trade execution natively at the platform level for YM and MYM — the platform constraint is enforced independently of the billing/selection logic. The data subscription and the trading permission are separate controls.

Implication for QA: AC-5.6-10 covers this scenario. Test that CBOT data subscription can be purchased by Level 1/2 trader, but YM/MYM orders are still blocked at execution.

(Source: Futures Configuration Matrix Table B — Level 1 & 2 Micros Only; STAGE3-030 confirmed 2026-08-11)


BR_5.6.9: Option B Payment Card Capture — NMI Collect.js / Hosted Fields (PCI-DSS) (H-11 / STAGE3-059)

When a trader pays for Option B (premium market data add-ons), card capture for the payment is handled via NMI Collect.js / Hosted Fields embedded client-side in the Stack Trading frontend. This is the PCI-DSS compliant mechanism:

  1. NMI Collect.js iframe renders the card input fields — raw card numbers are captured entirely within the NMI iframe, never in Stack Trading DOM or backend.
  2. On submission, NMI Collect.js returns a payment_token (one-time tokenised card reference) to the frontend.
  3. Frontend POSTs payment_token to Stack Trading backend API.
  4. Backend submits payment_token to NMI Customer Vault API (POST /customer-vault).
  5. NMI creates a vault entry and returns a customer_vault_id.
  6. Backend saves customer_vault_id in PostgreSQL Users table (field: customer_vault_id).
  7. Frontend redirects to Screen 1 (Manage Add-ons dashboard screen).
  8. Frontend calls GET /user/saved-cards to load the updated saved card list.

PCI-DSS constraint: Raw card numbers NEVER transit the Stack Trading backend. Only payment_token (short-lived) and customer_vault_id (persistent) are handled server-side.

(Source: STAGE3-059 / H-11 confirmed 2026-08-15)


BR_5.6.10: No Saved Card on File — Secure Checkout Screen Opens (M-16 / STAGE3-075)

When a trader with customer_vault_id IS NULL in PostgreSQL attempts to pay for Option B:

  • Middleware Hub detects no vault ID on file for the trader.
  • Instead of erroring, the system opens the Secure Checkout Screen — a Stack Trading-owned screen that embeds NMI Collect.js/Hosted Fields for card entry.
  • After successful card tokenisation and vault registration (per BR_5.6.9), customer_vault_id is written to PostgreSQL and the Option B checkout proceeds.

This screen also covers the "Change Payment Method" action from Manage Add-ons (Screen 1) where a trader has an expired or invalid card on file.

(Source: STAGE3-075 / M-16 confirmed 2026-08-15; STAGE3-059 / H-11 confirmed 2026-08-15)


BR_5.6.11: Level 5 Direct-Entry — Immediate Firm-Pay at Onboarding (client-confirmed 2026-08-24)

Traders entering the live phase directly at Level 5 (from the highest Advanced Track tier) are classified as Senior Live from Day 1. The firm's co-pay policy applies immediately at onboarding — there is no Provisional self-pay phase.

Behavior at Flow 3 (Market Data Setup) for Level 5 direct-entry traders:

Option selectedOnboarding invoicemarket_data_billable set
Option A (CME standard only)Firm subsidy of $137.50 applied — invoice = $0.00. Trader pays nothing.False (firm-paid — no monthly bill to trader)
Option B (CME + Premium Add-ons)Firm subsidy of $137.50 deducted from CME portion; trader pays only premium add-on cost (Total_Market_Data_Cost − $137.50).True for add-on billing only

Contrast with Level 1 & Level 2 Provisional traders:

  • Level 1 & 2: market_data_billable = True from Day 1 — trader pays 100% of Total_Market_Data_Cost each month. Firm refunds MARKET_DATA_BASE retroactively at Level 3 promotion via GET /financial/calculate-data-refund.
  • Level 5: firm covers CME base immediately — no pay-then-refund cycle. The Provisional self-pay → Level 3 refund pathway does NOT apply.

System implementation: At Flow 3F onboarding, the system must detect the trader's Current_Level. If Current_Level = 5, apply the $137.50 firm subsidy pre-calculated before calling POST /initiate-checkout:

  1. Call POST /calculate-cart — Middleware reads Current_Level; if Level ≥ 3 (including Level 5), applies formula Invoice_Amount = Total_Market_Data_Cost − $137.50 and returns discounted total to frontend.
  2. Frontend displays discounted total.
  3. Call POST /execute-checkout with the pre-discounted amount — no separate deduction step at checkout.

For Option A at Level 5: Total_Market_Data_Cost = $137.50, Invoice_Amount = $0.00 — no card charge required.

Level 5 re-entry after Hard Breach (confirmed — client 2026-08-25): When a Level 5 trader Hard Breaches and uses Re-Buy, they revert to SIM (Level 0 — Associate Track) on Rithmic Paper Trading. Firm covers 100% of demo data during SIM phase. Trader returns to Senior Live status only after re-passing the SIM challenge and completing full Live Onboarding again — NOT from Day 1 of the Re-Buy. The Provisional self-pay → Level 3 refund pathway does not apply on Level 5 re-entry.

(Source: client confirmed 2026-08-24; subsidy sequence confirmed client 2026-08-25)


BR_5.6.12: Intra-Month Pro Data Delta Assessment — Futures Only (CR-20260824-001)

When a Futures trader (asset_class = 'Futures') re-enters the Live path (Flow 3F fires again for the same user_id) within the same calendar month as a prior Live Pro Data payment, Middleware MUST perform an Intra-Month Delta Assessment before invoking any payment flow.

Check: Query market_data_paid_until OR invoices table (status = 'paid', billing_period_month + year = current month) for the trader's user_id to determine already_paid_feeds[].

Rationale: Pro Market Data fees and CME subscriber agreements are bound to the Rithmic User ID (not Sub-Account). On Reset/Rebuy, only the Sub-Account is cycled — the User ID and its intra-month entitlements are preserved. Charging the full fee again within the same billing month is incorrect.

CaseConditionAction
CASE-RE-PASS-01new_feed_selection ⊆ already_paid_feeds[]Bypass payment entirely. Re-enable feeds on User ID via Rithmic API. reactivation_reason = 'INTRA_MONTH_NO_CHARGE'.
CASE-RE-PASS-02delta_feeds = new_feed_selection − already_paid_feeds[] ≠ ∅Charge delta_feeds only. Re-enable reactivation_feeds free. reactivation_reason = 'INTRA_MONTH_DELTA'.

This rule does NOT apply to:

  • Forex traders (see BR_5.6.13).
  • First-time Live entry in a month (no prior paid record in already_paid_feeds[] → standard billing applies per BR_5.6.4/BR_5.6.7).

(Source: CR-20260824-001 client confirmed 2026-08-24)


BR_5.6.13: Forex Exclusion from Intra-Month Reconciliation Protocol (CR-20260824-002)

The Intra-Month Delta Assessment (BR_5.6.12) and CASE-RE-PASS-01/02 logic do NOT apply to Forex traders (asset_class IN ('Forex_MT5', 'Forex_TE')).

Rationale: Stack Trading pays a flat monthly server cost for the MT5 and TraderEvolution white-label platforms. There are no per-user variable fees tied to individual Forex sub-accounts — creating, deleting, or re-provisioning a Forex sub-account within a month generates no incremental billing. Therefore there is no risk of double-charging, and no reconciliation step is needed.

Forex traders are already excluded from Flow 3F entirely (setup_status = 'N/A' per BR_5.6.1). This BR explicitly confirms that even in future contexts where Forex billing logic is added, CR-20260824-001 intra-month protocol remains Futures-only until explicitly extended by a new CR.

(Source: CR-20260824-002 client confirmed 2026-08-24)


The primary flow (Option A and Option B form submission) has no Stack Trading-owned screens — all processing is automated via Zapier. However, Option B payment introduces two Stack Trading-owned screens:

  • "Level 1 Setup Form" — hosted natively on the Stack Trading frontend dashboard (STAGE3-042). Form submission fires a webhook to Zapier.
  • Screen 1 — Manage Add-ons — the dashboard screen the trader lands on after card registration completes. The frontend calls GET /user/saved-cards to populate the saved card list after redirect. (STAGE3-059)
  • Screen 2 — Secure Checkout Screen (NMI Collect.js / Hosted Fields) — a Stack Trading-owned checkout screen that embeds NMI Collect.js/Hosted Fields iframe for PCI-DSS compliant card capture. Opens when customer_vault_id IS NULL (no card on file) or when the trader selects "Change Payment Method". (STAGE3-059 / H-11; STAGE3-075 / M-16)
  • Option B payment widget — embedded in the Market Data selection screen on the Stack Trading dashboard. Frontend calls POST /calculate-cart + POST /execute-checkout inline. No payment link emailed (STAGE3-042 / UC_5.5 v1.8).

Wireframe references:

  • Market Data Setup Screen (full flow): References/Wireframe/Stage 3/Stage 3: Total wireframe/Flow 3F: Market data setup.png
  • See Wireframe Index for screen inventory.

10. Screen Description and Business Rules

Screen 2 — Secure Checkout Screen (NMI Collect.js / Hosted Fields)

FieldValue
Triggercustomer_vault_id IS NULL OR trader selects "Change Payment Method" on Manage Add-ons
ComponentNMI Collect.js / Hosted Fields iframe embedded in Stack Trading frontend
Card fieldsCard number, expiry, CVV — captured entirely within NMI iframe (never in Stack Trading DOM)
On successFrontend receives payment_token → POST to backend → backend calls NMI Customer Vault → receives customer_vault_id → saves to PostgreSQL → redirects to Screen 1 (Manage Add-ons) → GET /user/saved-cards
On failureError displayed on Screen 2; trader prompted to retry. customer_vault_id NOT written. Checkout NOT initiated.
PCI-DSSRaw card data never transits Stack Trading backend (Collect.js/Hosted Fields constraint).

(Source: STAGE3-059 / H-11 confirmed 2026-08-15; STAGE3-075 / M-16 confirmed 2026-08-15)


11. Acceptance Criteria

(Confirmed by client 2026-08-10 — Source: QnA Q5)

AC IDConditionExpected ResultNotes
AC-5.6-01Given Futures trader: setup_status = 'Pending', contract_status = 'Signed'. Level 1 Setup Form submitted with no premium add-ons (addon_ids count = 1, CME only)setup_status = 'Complete', market_data_billable = False; internal Webhook asynchronously dispatched to trigger Flow 3H; Flow 3F Zap terminates successfullyOption A happy path — Flow 3F and Flow 3H are separate Zap processes; "same Zap execution" is incorrect (STAGE3-029)
AC-5.6-02Webhook received: addon_ids = ["CME_Bundle"] AND contract_status ≠ 'Signed' for user_idsetup_status = 'Complete', market_data_billable = False; Zap terminates without dispatching Flow 3H webhook; aggregation gate held — Flow 3H deferred to Flow 3EOption A — contract not yet signed
AC-5.6-03Webhook received: addon_ids = ["CME_Bundle", "NYMEX_Bundle"] (count > 1)POST /initiate-checkout called with product_id = 'LIVE_DATA_UPGRADE' and addon_ids = ["CME_Bundle", "NYMEX_Bundle"]; on success: setup_status = 'Pending_Payment'; payment completed on dashboard (no payment link emailed — STAGE3-042)Option B happy path
AC-5.6-04User record has market_data_billable = FalseFlow 22 (Monthly Data Fee Billing) billing batch excludes this traderFirm-paid CME standard feed; no invoice generated for trader
AC-5.6-05Trader attempts to place order for symbol NOT in CME_Whitelist.Enabled = TRUEOrder blocked by Middleware Hub at order routingWhitelist enforcement at execution layer
AC-5.6-08POST /initiate-checkout returns a non-200 error (Option B)setup_status remains 'Pending' (DB update never reached); no SES payment-link email sent; CloudWatch SEV-1 alarm triggers; Ops Slack alert dispatched; no automated retrySTAGE3-027 — no auto-retry; manual replay required
AC-5.6-09POST /initiate-checkout is unresponsive (5xx / timeout) — Option BAWS CloudWatch alarm (SEV-1 "Middleware Hub Unresponsive") fires; Ops Slack alert sent; setup_status remains 'Pending'; no Freshdesk ticket created automaticallySTAGE3-027 — Freshdesk removed; CloudWatch + Slack is the alert path
AC-5.6-10Level 1 or Level 2 trader purchases CBOT add-on (Option B), then attempts to place a YM or MYM orderCBOT data subscription accepted and setup_status progresses normally; however, YM/MYM order is blocked at the order routing gateway — execution denied regardless of data subscription statusBR_5.6.8 — data subscription and trading permission are independent controls; STAGE3-030
AC-5.6-11Trader with customer_vault_id IS NULL attempts to pay for Option B (premium market data add-on)Middleware Hub detects no vault ID → opens Secure Checkout Screen (NMI Collect.js/Hosted Fields embedded iframe); trader enters card → NMI tokenises → payment_token returned → backend submits to NMI Customer Vault → customer_vault_id saved to PostgreSQL → redirect to Screen 1 (Manage Add-ons) → GET /user/saved-cards calledBR_5.6.10 — STAGE3-075/M-16; STAGE3-059/H-11
AC-5.6-12NMI Collect.js tokenisation fails (network error, NMI API non-200, or invalid card) during Secure Checkout Screenpayment_token not issued; customer_vault_id NOT written to PostgreSQL; checkout NOT initiated; setup_status remains 'Pending'; error displayed on Screen 2; trader prompted to retryBR_5.6.9 — STAGE3-059/H-11; PCI-DSS: raw card data never reaches Stack Trading backend
AC-5.6-13Level 5 direct-entry trader selects Option A (CME standard only) at Flow 3 onboardingSystem applies $137.50 firm subsidy — onboarding invoice = $0.00; market_data_billable = False; trader pays nothing; no card charge initiatedBR_5.6.11 — Level 5 is Senior Live from Day 1
AC-5.6-14Level 5 direct-entry trader selects Option B (CME + NYMEX add-on) at Flow 3 onboardingSystem applies $137.50 firm subsidy to CME portion; trader is billed only for NYMEX add-on cost; market_data_billable = True for add-on; payment card updated for add-on recurring billingBR_5.6.11 — firm covers CME base immediately
AC-5.6-15Level 1 or Level 2 trader selects Option B at Flow 3 onboardingmarket_data_billable = True set from Day 1; Stripe/Triple-A card updated; trader billed full Total_Market_Data_Cost monthly (no CME deduction until Level 3 promotion)BR_5.6.7 Provisional self-pay — no firm subsidy at L1/L2
AC-5.6-16Level 1 or Level 2 trader is promoted to Level 3GET /financial/calculate-data-refund endpoint triggered; refund issued for MARKET_DATA_BASE fees paid during Level 1 & 2 tenure; from Level 3 onward, Invoice_Amount = Total_Market_Data_Cost − $137.50BR_5.6.7 — Level 3 promotion triggers retroactive refund of CME base fees
AC-5.6-17Futures trader re-enters Flow 3F in the same calendar month as a prior paid Pro Data selection, with identical feed selection (new_feed_selection ⊆ already_paid_feeds[])POST /initiate-checkout is NOT called; Middleware calls Rithmic API to re-enable paid feeds on User ID; setup_status = 'Complete'; audit log records reactivation_reason = 'INTRA_MONTH_NO_CHARGE'BR_5.6.12 — CASE-RE-PASS-01: exact match, bypass payment
AC-5.6-18Futures trader re-enters Flow 3F in the same calendar month, selects 1+ new feeds not in already_paid_feeds[] (CASE-RE-PASS-02)POST /initiate-checkout called only for delta_feeds; reactivation_feeds re-enabled free via Rithmic API; after delta payment: setup_status = 'Complete', market_data_billable = True; audit log records reactivation_reason = 'INTRA_MONTH_DELTA'BR_5.6.12 — CASE-RE-PASS-02: charge delta only
AC-5.6-19Forex trader (asset_class IN ('Forex_MT5', 'Forex_TE')) re-enters Live same calendar monthIntra-Month Delta Assessment is NOT triggered; no invoices table query for reconciliation; standard Forex provisioning proceeds (setup_status = 'N/A' path — Flow 3F already skipped per BR_5.6.1); no billing reconciliation appliedBR_5.6.13 — Forex excluded from intra-month protocol
AC-5.6-20Futures trader first Live entry in a new calendar month (no prior already_paid_feeds[] for current month)Standard billing applies — no CASE-RE-PASS bypass; full payment flow for selected feeds; invoices table query returns empty for current monthBR_5.6.12 — intra-month check only triggers when prior paid record exists for current month

Input validation ACs (confirmed):

  • If user_id is not a valid, active UUID in PostgreSQL Users table → Zap halts, writes validation error to audit log, notifies trader to re-submit.
  • If platform_selection does not match an active system in Zapier Table I → Zap halts.
  • If any value in addon_ids does not map to a valid product code in Table C → Zap halts.

END OF UC_5.6

On this page