diff --git a/audits/tradernet/founder-growth-model-v1.json b/audits/tradernet/founder-growth-model-v1.json new file mode 100644 index 00000000..8a755bfd --- /dev/null +++ b/audits/tradernet/founder-growth-model-v1.json @@ -0,0 +1,136 @@ +{ + "schema_version": "tradernet-founder-growth-model-v1", + "case_id": "tradernet-founder-growth-2026-07-21", + "authority": { + "mode": "advisory_only", + "forecast": false, + "investment_advice": false, + "experiment_launch": false, + "account_access": false, + "order_execution": false, + "external_submission": false, + "deployment": false, + "merge": false + }, + "source_audit": { + "repository": "safal207/LiminalQAengineer", + "pull_request": 102, + "exact_head": "d14d0e0cf434000c10609dc8627c288df5306df6" + }, + "north_star": { + "name": "weekly_completed_investor_intent_loops", + "definition": "Users who select an intent, understand relevant state and cost, preview an action, complete or consciously decline it, and later return to monitor or adjust." + }, + "illustrative_monthly_funnel": { + "qualified_visits": 100000, + "stages": [ + { + "id": "signup", + "current_rate": 0.04, + "target_rate": 0.055, + "current_count": 4000, + "target_count": 5500 + }, + { + "id": "kyc_approved", + "current_rate_from_previous": 0.45, + "target_rate_from_previous": 0.60, + "current_count": 1800, + "target_count": 3300 + }, + { + "id": "funded", + "current_rate_from_previous": 0.35, + "target_rate_from_previous": 0.45, + "current_count": 630, + "target_count": 1485 + }, + { + "id": "first_intentional_action", + "current_rate_from_previous": 0.50, + "target_rate_from_previous": 0.60, + "current_count": 315, + "target_count": 891 + } + ], + "incremental_activated_funded_users": 576 + }, + "gross_contribution_sensitivity": [ + { + "monthly_contribution_per_incremental_user_eur": 5, + "monthly_uplift_eur": 2880, + "annualised_uplift_eur": 34560 + }, + { + "monthly_contribution_per_incremental_user_eur": 10, + "monthly_uplift_eur": 5760, + "annualised_uplift_eur": 69120 + }, + { + "monthly_contribution_per_incremental_user_eur": 20, + "monthly_uplift_eur": 11520, + "annualised_uplift_eur": 138240 + } + ], + "retention_sensitivity": { + "monthly_contribution_range_eur": [8, 15], + "current_monthly_churn": 0.04, + "target_monthly_churn": 0.035, + "incremental_lifetime_contribution_per_user_eur": [28.57, 53.57], + "incremental_lifetime_contribution_per_1000_users_eur": [28570, 53570] + }, + "clickfunnels_boundary": { + "role": "pattern_reference_only", + "false_urgency": false, + "artificial_scarcity": false, + "pressure_to_trade": false, + "preselected_paid_or_risk_increasing_choices": false, + "vendor_claims_are_subject_evidence": false + }, + "plf_launch": { + "name": "First Portfolio Week", + "transformation": "comprehension_before_commitment", + "promise_of_returns": false, + "permanent_education_or_demo_path": true, + "legitimate_scarcity": [ + "cohort_dates", + "live_office_hour_capacity", + "regional_eligibility" + ], + "forbidden_scarcity": [ + "market_movement_fomo", + "promised_returns", + "gift_share_pressure", + "fear_of_missing_profit" + ] + }, + "pilot": { + "duration_days": 90, + "phases": [ + "instrument", + "convert", + "activate", + "mobile", + "launch", + "decide" + ], + "primary_metric": "qualified_activation", + "guardrails": [ + "kyc_reupload_or_abandonment", + "immediate_order_correction_or_cancellation", + "rejected_orders", + "support_contacts_after_financial_action", + "real_demo_confusion", + "stale_preview_action_attempt", + "complaint_or_harm_signal", + "market_data_cost", + "regulatory_noncompliance" + ] + }, + "limitations": [ + "Internal traffic, CAC, KYC approval, funding, contribution margin, trading mix, churn and retention are unknown.", + "Conversion and revenue values are scenario sensitivities rather than forecasts.", + "Authenticated journey defects require an authorised exact-build test account.", + "ClickFunnels and Product Launch Formula patterns do not prove subject-specific lift." + ] +} diff --git a/docs/audits/TRADERNET_FOUNDER_GROWTH_MEMO.md b/docs/audits/TRADERNET_FOUNDER_GROWTH_MEMO.md new file mode 100644 index 00000000..cba1b9ed --- /dev/null +++ b/docs/audits/TRADERNET_FOUNDER_GROWTH_MEMO.md @@ -0,0 +1,253 @@ +# Tradernet Founder Growth Memo + +**Independent product/growth analysis — 21 July 2026** +**Prepared by:** Alexey Safonov, QA Engineer & Product/Growth Analyst +**Method:** UX activation × ethical ClickFunnels patterns × Product Launch Formula × brokerage revenue economics + +## Core thesis + +Tradernet does not have a feature problem. It has a **trust-to-action orchestration problem**: public breadth arrives before the user experiences a clear, state-aware and reversible investment outcome. + +**Strategic move:** turn the first session into a guided investor-intent loop, then launch major capabilities as education-led cohorts that build understanding before commitment. + +```text +DISCOVER +intent-led promise + ↓ +EXPERIENCE +demo before KYC + ↓ +LAUNCH +value before offer + ↓ +ACTIVATE +intentional action loop + ↓ +RETAIN +portfolio + recurring plan + ↓ +EXPAND +advanced markets + API/FIX +``` + +**North Star:** `Weekly Completed Investor Intent Loops` + +Count users who select an intent, understand the relevant market/data/account state and cost, preview an action, complete or consciously decline it, and later return to monitor or adjust. This is closer to delivered value than raw registrations, deposits or trade count. + +## 1. Executive diagnosis + +Tradernet/Freedom24 combines global market access, portfolio management, investment research, education, web/mobile trading and API/FIX capability. The public journey nevertheless asks the visitor to cross registration, identity verification and product complexity before experiencing a compact, personally relevant result. + +| Current signal | User interpretation | Growth consequence | +|---|---|---| +| Broad catalogue of products and instruments | Capable, but where should I begin? | Low relevance at the highest-traffic moment | +| Account opening before product experience | Commitment arrives before trust | Signup and KYC abandonment | +| Separate public pages, FAQ and terminal surfaces | I must reconstruct the journey myself | Longer time to first value | +| Desktop-grade density on small screens | Power competes with task completion | Mobile abandonment and support demand | +| Promotions and investment ideas near the entry | Offer is clear; consequences are not yet personal | Funding can precede product comprehension | + +### Causal model + +```text +product breadth presented as the value +→ user must translate features into a personal job +→ registration and KYC arrive before product confidence +→ state, cost and recovery remain abstract +→ hesitation, abandonment or preventable correction +``` + +### Recommended positioning + +> **From investment intention to informed control — in one trusted flow.** + +Global access, analytics, orders, recurring investment and portfolio tools become evidence for this promise rather than competing headlines. + +### Three customer paths + +| Path | First promised outcome | First activation event | Expansion | +|---|---|---|---| +| New Investor | A diversified starting plan without blind commitment | Three-asset watchlist or recurring-plan draft completed | KYC, funding, recurring investment | +| Self-directed Investor | A transparent decision with state, total cost and risk visible | First reviewed order preview or portfolio action | Retention, research, additional markets | +| Active Trader / API | Fast execution without losing market and account context | First state-aware order/protection workflow | Margin, derivatives, API/FIX | + +## 2. Experience redesign + +### Desktop: progressive confidence + +| Moment | Recommended experience | Metric | +|---|---|---| +| Landing | Intent choice and interactive watchlist/order preview before KYC | Demo interaction → qualified signup | +| Signup | Preserve intent and draft; explain the next verification step | Signup completion | +| KYC | Progress, document requirements, save-and-return and precise recovery | Approval and re-upload rate | +| Trading | Persistent real/demo, market, data, currency and buying-power state | Successful intentional action | +| Recovery | Draft, submitted, pending, executed, rejected and cancelled are unmistakable | Corrections, support contacts and trust | + +### Mobile web: task mode, not compressed terminal + +- Primary navigation: `Home · Search · Portfolio · More`. +- Positions and orders become task cards; critical actions never require horizontal searching. +- Order entry uses a full-screen or bottom sheet with a fresh preview before submit. +- Interruption restores inputs but invalidates stale confirmation, quote and buying-power state. +- Deep links return to the exact instrument, account, session and recovery context. + +**Activation moment:** the first aha is not seeing a quote. It is understanding what will happen, what it will cost, how to stop or correct it, and seeing the platform preserve that state after interruption. + +## 3. Ethical ClickFunnels conversion engine + +| Funnel element | Current gap | Proposed mechanism | +|---|---|---| +| Hook | Global access is broad but generic | Make one informed investment decision without losing state | +| Story | Products appear without one user-centred enemy | Fragmented journey → uncertain state/cost → delay or preventable error | +| Offer | Account opening is the dominant next step | Public exploration → demo → signup → KYC → funded action → retention | +| Proof | Research and awards are not tied to first jobs | New investor, self-directed investor and active-trader proof paths | +| Risk reversal | Financial commitment carries natural anxiety | Demo, exact fees/state, visible decline and reversible drafts | +| CTA | Open account is too early for cold traffic | `Try Guided Demo`, `Build My Watchlist`, `Review an Order` | + +### First-session funnel + +```text +Select intent +→ explore one instrument or ETF +→ see market and data state +→ preview cost and consequence +→ save through fast signup +→ continue to KYC when ready +``` + +### Trust layer before commitment + +- Real/demo, account and currency always visible. +- Market session and data freshness visible before the action. +- Total, fee, FX and likely execution behaviour shown before submit. +- Explicit cancel, decline, correction and recovery paths. +- Plain-language ownership and regulatory evidence. + +### Controlled experiments + +| Priority | Control | Variant | Primary metric | +|---:|---|---|---| +| 1 | Generic entry | Invest / Trade / Demo intent choice | Qualified next-step completion | +| 2 | Open account first | Demo watchlist/order preview first | Qualified signup | +| 3 | All login methods equally prominent | One primary method plus alternatives | Signup completion | +| 4 | Current order flow | Complete consequences preview | Intentional submit without correction | +| 5 | Responsive table | Mobile task cards | Order/position task completion | + +## 4. Product Launch Formula adaptation + +### Launch concept: First Portfolio Week + +A seven-day guided cohort that helps a user define an investing intention, build a small watchlist, understand fees, session state and risk, preview a recurring or one-time action, and finish with a personal control checklist. + +| Phase | Content | Product action | Success signal | +|---|---|---|---| +| Pre-Prelaunch | Survey the biggest uncertainty before a first investment | Select intent and preferred market | Objection map and seed cohort | +| PLC 1 — Opportunity | Why a portfolio process beats isolated tips | Create watchlist | Watchlist completion | +| PLC 2 — Transformation | How state, currency and total cost change a decision | Compare one order preview | Preview comprehension | +| PLC 3 — Ownership | How to monitor, pause and correct | Draft recurring plan or alert | Control-path completion | +| Open cohort | Guided demo and optional KYC clinic | Continue only when ready | Qualified activation | +| Post-launch | Portfolio attention and D7 review | Monitor or adjust | D7 completed loop | + +### Honest scarcity only + +Cohort dates, limited live office-hour capacity and regional eligibility are legitimate constraints. Market movement, promised returns, gift-share urgency or fear of missing profit must never become artificial pressure. A permanent education/demo path and visible decline route remain available. + +PLF's `value before reveal` and `desire before availability` become **comprehension before commitment**. The transformation sold is investor control, not performance or guaranteed return. + +## 5. Revenue economics + +Tradernet/Freedom24 publicly lists fee plans with no monthly subscription and transaction, per-share, margin-lending and withdrawal economics. The most useful model therefore starts with incremental activated funded users and gross-contribution sensitivity rather than subscription ARR. + +### Illustrative mechanics per 100,000 qualified monthly visits + +| Stage | Illustrative current | Target | Effect | +|---|---:|---:|---:| +| Visit → signup | 4.0% | 5.5% | 4,000 → 5,500 signups | +| Signup → KYC approved | 45% | 60% | 1,800 → 3,300 approved | +| KYC approved → funded | 35% | 45% | 630 → 1,485 funded | +| Funded → first intentional action | 50% | 60% | 315 → 891 activated | +| **Net uplift** | — | — | **+576 activated funded users / month** | + +### Gross-contribution sensitivity + +| Modeled monthly contribution per activated funded user | Monthly uplift | Annualised sensitivity | +|---:|---:|---:| +| €5 | €2,880 | €34,560 | +| €10 | €5,760 | €69,120 | +| €20 | €11,520 | €138,240 | + +These figures are **scenario sensitivities, not forecasts**. Actual value depends on geography, fee plan, trading frequency, instrument mix, margin use, recurring-plan economics, acquisition cost, market-data cost, support load and regulatory constraints. + +### Retention economics + +Modeled gross-contribution LTV ≈ monthly gross contribution ÷ monthly churn. At €8–15 monthly contribution, moving funded-user churn from 4.0% to 3.5% raises modeled lifetime contribution by approximately €28.6–53.6 per user, or €28.6k–53.6k per 1,000 active funded users. + +### Decision rule + +Approve experiments on incremental gross contribution **and user safety together**. Report KYC completion, funded activation and retention beside corrections, immediate cancellations, rejected orders, support contacts, complaints, bonuses/refunds, market-data cost and harm signals. + +## 6. 90-day Growth System pilot + +Do not begin with a full rebrand or broad terminal rewrite. + +| Phase | Weeks | Build | Decision gate | +|---|---:|---|---| +| Instrument | 1–2 | Intent events, funnel baselines and state/error taxonomy | Can qualified activation and preventable correction be measured? | +| Convert | 3–4 | Intent landing, guided demo and fast signup | Does qualified signup rise without low-quality KYC load? | +| Activate | 5–7 | Persistent state, complete preview and saved checklist | Does time to value fall and comprehension rise? | +| Mobile | 8–9 | Task cards and safe draft recovery | Do task completion and error rates improve? | +| Launch | 10–11 | Seed First Portfolio Week cohort | Does cohort activation beat evergreen baseline? | +| Decide | 12–13 | Cohort readout, retention and guardrails | Scale, iterate or stop? | + +### P0 build order + +1. Repair the confirmed mobile chart 404, late hero discovery, hidden terminal asset and missing onboarding asset. +2. Validate real/demo, market session, data freshness, account/currency and buying-power visibility under an authorised test account. +3. Add or validate complete order consequence preview, marketable-limit explanation and explicit cancellation state. +4. Validate Stop Loss/Take Profit discoverability and risk preview from position context. +5. Replace mobile management tables with task cards only after the current implementation is evidenced. + +### Pilot team + +Product, Design, Frontend/Backend, QA/LiminalQA, Analytics, Compliance/Legal and Support/Operations each own a defined part of the same journey. Choose one P0 experiment, pre-register success and rollback thresholds, then review exact cohorts after a two-week window. + +## 7. Decision brief + +A product leader can approve now: + +| Decision | Minimum commitment | Success signal | +|---|---|---| +| Conversion pilot | Intent landing, guided demo and instrumentation | Credible lift in qualified signup without guardrail damage | +| Activation pilot | State header, consequence preview and preserved checklist | Lower time to value, fewer corrections and higher D7 loops | +| Launch pilot | Seed cohort and First Portfolio Week | Cohort activation/retention above evergreen baseline | + +### What this memo does not claim + +- It does not know internal traffic, CAC, KYC approval, funded conversion, contribution margin, trading mix, churn or retention cohorts. +- It does not claim authenticated UX defects without an authorised exact-build test account. +- Revenue figures are scenario sensitivities, not forecasts, targets or valuation statements. +- PLF and ClickFunnels are pattern references, not evidence that a variant will lift Tradernet results. +- Nothing here is investment advice, a promise of returns, a security claim or authority to launch, deploy, contact users or merge. + +## Evidence chain + +- LiminalQA product audit — PR `#102`, exact head `d14d0e0cf434000c10609dc8627c288df5306df6`. +- Pythia judgment — PR `#238`, verdict `ESCALATE`, exact head `323705b4f7a8ecca3c5a475e2504f2c41e231188`. +- CML memory — PR `#215`, pack `d9b886e7b4985dd9c4932232a69a5bfb5caaf70f597051a87dd93357560c4654`, exact head `f0269ee1f9c9237876dcf70fc390a66790a76e55`. +- LS human impact — PR `#921`, verdict `HUMAN_REVIEW_REQUIRED`, exact head `3de9574fde6262a4b4305d974254bf6530c50856`. + +## Public sources + +1. Freedom24 investment ideas and account-opening journey: `https://freedom24.com/ideas?site_lang=en` +2. Individual account-opening and verification flow: `https://rc.tradernet.com/faq/13096-how-to-open-an-account-as-an-individual?site_lang=en` +3. Freedom24 public fee plans: `https://freedom24.com/anketa/price?site_lang=en` +4. Tradernet API capability map: `https://tradernet.com/tradernet-api/auth-login?site_lang=en` +5. Freedom24 recurring investment plan: `https://freedom24.com/news/22138-freedom24-recurring-automate-investing-0-commission` +6. Apple/Google login and registration update: `https://freedom24.com/news/22117-freedom24-login-registration-apple-and-google` +7. ClickFunnels landing-page pattern reference: `https://www.clickfunnels.com/blog/landing-page-advertising/` +8. Jeff Walker product-launch process: `https://jeffwalker.com/product-launch-process/` + +## Suggested next conversation + +A 20-minute product walkthrough to validate assumptions with internal funnel data, select one P0 experiment, nominate a seven-person pilot, and define a two-week measurement window with explicit stop conditions. + +> **Build less pressure. Orchestrate more trust and value.** diff --git a/tests/test_tradernet_founder_growth_model.py b/tests/test_tradernet_founder_growth_model.py new file mode 100644 index 00000000..e5015505 --- /dev/null +++ b/tests/test_tradernet_founder_growth_model.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +MODEL_PATH = ROOT / "audits" / "tradernet" / "founder-growth-model-v1.json" +MEMO_PATH = ROOT / "docs" / "audits" / "TRADERNET_FOUNDER_GROWTH_MEMO.md" + + +def _model() -> dict: + return json.loads(MODEL_PATH.read_text(encoding="utf-8")) + + +def test_growth_model_is_advisory_and_not_a_forecast() -> None: + authority = _model()["authority"] + + assert authority["mode"] == "advisory_only" + assert authority["forecast"] is False + assert authority["investment_advice"] is False + assert authority["experiment_launch"] is False + assert authority["account_access"] is False + assert authority["order_execution"] is False + assert authority["external_submission"] is False + assert authority["deployment"] is False + assert authority["merge"] is False + + +def test_funnel_math_is_internally_consistent() -> None: + model = _model() + stages = {item["id"]: item for item in model["illustrative_monthly_funnel"]["stages"]} + + assert stages["signup"]["current_count"] == 100000 * 0.04 + assert stages["signup"]["target_count"] == 100000 * 0.055 + assert stages["kyc_approved"]["current_count"] == 4000 * 0.45 + assert stages["kyc_approved"]["target_count"] == 5500 * 0.60 + assert stages["funded"]["current_count"] == 1800 * 0.35 + assert stages["funded"]["target_count"] == 3300 * 0.45 + assert stages["first_intentional_action"]["current_count"] == 630 * 0.50 + assert stages["first_intentional_action"]["target_count"] == 1485 * 0.60 + assert model["illustrative_monthly_funnel"]["incremental_activated_funded_users"] == 576 + + +def test_gross_contribution_sensitivity_matches_incremental_users() -> None: + model = _model() + incremental = model["illustrative_monthly_funnel"]["incremental_activated_funded_users"] + + for scenario in model["gross_contribution_sensitivity"]: + monthly = incremental * scenario["monthly_contribution_per_incremental_user_eur"] + assert scenario["monthly_uplift_eur"] == monthly + assert scenario["annualised_uplift_eur"] == monthly * 12 + + +def test_plf_and_clickfunnels_reject_financial_pressure() -> None: + model = _model() + cf = model["clickfunnels_boundary"] + plf = model["plf_launch"] + + assert cf["role"] == "pattern_reference_only" + assert cf["false_urgency"] is False + assert cf["artificial_scarcity"] is False + assert cf["pressure_to_trade"] is False + assert cf["preselected_paid_or_risk_increasing_choices"] is False + assert cf["vendor_claims_are_subject_evidence"] is False + + assert plf["promise_of_returns"] is False + assert plf["permanent_education_or_demo_path"] is True + assert "market_movement_fomo" in plf["forbidden_scarcity"] + assert "promised_returns" in plf["forbidden_scarcity"] + + +def test_memo_preserves_scenario_and_evidence_language() -> None: + memo = MEMO_PATH.read_text(encoding="utf-8") + + required = { + "Weekly Completed Investor Intent Loops", + "scenario sensitivities, not forecasts", + "comprehension before commitment", + "authorised exact-build test account", + "Build less pressure. Orchestrate more trust and value.", + } + for phrase in required: + assert phrase in memo + + +def test_exact_source_audit_is_pinned() -> None: + source = _model()["source_audit"] + + assert source["repository"] == "safal207/LiminalQAengineer" + assert source["pull_request"] == 102 + assert source["exact_head"] == "d14d0e0cf434000c10609dc8627c288df5306df6"