Changelog
Every update to the platform — new features, fixes, performance wins, and security hardening.
Copy-settings safety overhaul & multi-account isolation
Safety
- Smart Entry now respects your settings. The MT5 and MT4 Copier EAs were placing pending limit orders even when smart entry was disabled, AND ignoring the user-configured pip threshold. Now strictly gated on both flag and threshold (MT5 v3.16, MT4 v3.15).
- Copy-settings parity end-to-end. Lot mode (proportional/risk-based), day-of-week filter, session-hour window, and signal-expire-after-N-minutes all reach the EA correctly — previously the server emitted them under different JSON keys than the EA read, silently bypassing every one. Affected lot sizing, time-of-day filters, and stale-signal rejection.
- MT4 Provider JSON escape parity. Broker server names containing C0 control bytes (rare but real) no longer cause silent signal-broadcast failures — now matches the strip-rather-than-escape behaviour the MT5 EAs already had.
- Spread filter end-to-end. Provider EAs now report
spread_points with each signal so the copier-side max_spread_filter setting actually fires server-side.
Multi-account fixes
- Same trader subscribed on multiple broker accounts is now fully isolated. Trade-open dedup, close lookup, race recovery, max_trades count, re-subscribe orphan cleanup, and cron PnL aggregation all respect
broker_connection_id. Previously a multi-broker follower could see broker B’s open report rejected as duplicate, broker B’s close close broker A’s trade, or daily PnL double-counted across both accounts (triggering premature auto-pause).
- Multi-strategy subscriptions to the same trader no longer cross-contaminate
max_concurrent_positions and correlation filter state. Each subscription’s filters fire only against its own strategy’s open trades.
- Account-scoped EA polls (
?account=N) now fail closed on transient DB error instead of returning all accounts’ signals — prevents a wrong-broker signal leak during a DB blip.
Fixed
- Stale public/ea/ directory was serving 1-day-old EA files even after source updates — users were downloading the OLD broken EAs. Sync ritual added to deploy process.
- EA version constants (
EA_VERSIONS in downloads endpoint) refactored to per-platform map — was single value per type, so MT4 and MT5 versions couldn’t both be reported correctly when they diverged.
- Downloads page version pills (Quick-Start banner, EA cards, install prerequisites) updated to show actual current versions — were lagging multiple releases.
- Admin add-note button stayed permanently stuck on “Saving…” after success — reset only happened on error.
- Admin approve-payouts button stayed permanently stuck on “Processing…” if the verification-code prompt was cancelled.
- chat.html DELETE button and admin.html health-check fetch could hang indefinitely — now bounded by
fetchWithTimeout.
Polish
aria-label added to icon-only dismiss/unpin/delete buttons (dashboard alert, chat pinned message, trader-dashboard trade template).
- Status page entrance animations honour
prefers-reduced-motion.
- EA listing thumbnails on Provider Hub now have descriptive alt text + lazy loading + async decoding.
- stripe-connect endpoint validates
SITE_URL with the same regex as stripe-checkout/downloads — defence-in-depth across all Stripe-redirect callers.
Email system overhaul & SEO sitemap upgrades
New
- Newsletter drip campaign — 5-email automated sequence for subscribers (Welcome, Social Proof, Trader Spotlight, Profit Calc, Final Push) plus 4 broadcast templates (Demo Copying, Strategy Builder, EA Builder AI, Become a Provider).
- Weekly Top 10 Traders email — ranked discovery blast every weekend to all marketing-opted-in users + newsletter subscribers, with medals and tailored intros per recipient type.
- Branded email design system — every email (26 templates) now uses the platform’s exact dark-theme tokens (#030711 bg, #6366f1 accent, #a78bfa accent-2, #10b981 green) for visual consistency with the platform UI.
- Admin email preview — preview any of 26 templates in-browser (iframe) or send to your inbox (TAN-gated) from the Email Templates tab.
- Newsletter funnel dashboard — admin sees signup totals, conversion rate, drip stage distribution, top sources. CSV export for off-platform analytics.
- Dynamic SEO sitemaps —
/sitemap-traders.xml + /sitemap-strategies.xml auto-generated from D1 with slug-based vanity URLs when available. Sitemap index ties them together.
- Public landing pages indexable — /affiliate and /settings-store now reachable by search engines (were blocked in robots.txt by mistake).
Fixed
- Chat sidebar showed empty rooms —
fetch() was passing only cookies but the platform uses JWT bearer auth.
- Sending a chat message would 401 silently — same bearer-token bug.
- Earnings statement PDF download from Provider Hub would 401.
- Newsletter unsubscribe links were dead-ending at the login page for non-account subscribers (CAN-SPAM compliance issue).
- Newsletter signup form was overwriting custom CTA labels with “Subscribe” on success.
- Hidden strategies (force_hide) were still exposed in the SEO sitemap — privacy/SEO leak fixed.
- HTTP
Link: preload header was pointing at a stale CSS/JS version (404 then re-fetch).
- Admin Browser Preview button used wrong token storage key (would 401).
- Admin disable-2FA / change-role didn’t invalidate the user’s existing JWT or push subscriptions.
- Stripe
transfer.failed async events weren’t handled — failed transfers stuck silently.
Security
- Password minimum aligned to 10 chars across the whole stack (frontend HTML attrs, frontend JS, backend) — was inconsistent (frontend 10, backend 8) so API direct-callers could create weaker passwords.
- Backup code consumption now sends a security-alert email so users notice unauthorized access immediately.
- Email-scoped HMAC tokens for newsletter unsubscribe (separate from user-scoped tokens to prevent cross-type reuse).
- Cleanup cron now purges expired admin trusted sessions and long-unsubscribed newsletter subscribers (GDPR data minimization).
Performance
- Sitemaps cached at the edge for 1 hour — crawlers don’t hit D1 on every request.
- Newsletter subscriber stats endpoint parallelizes 4 aggregate queries.
Payout approval gate & ledger reconciliation
New
- Admin-gated provider payouts — trader transfers now require explicit admin approval, no longer auto-executed.
- 30-minute trusted IP session for admin approvals — email 2FA once, then approve/decline freely.
- Drawdown alerts — copiers automatically notified when their subscription enters >15% drawdown.
- Trial engagement emails — welcome on Day 1, nudge on Day 7, final warning before expiry.
- Affiliate commission reconciliation — daily cron audits billing periods vs payouts for drift.
- Admin impersonate — support can log in as a user to reproduce reported bugs (fully audited).
Fixed
- Support button opens the correct chat thread (was showing a generic error).
- “Provider Hub → My Strategies” link lands on the strategies tab.
- HWM now resets correctly when a copier stops and re-subscribes.
- Negative ending_equity no longer poisons future billing (clamped to 0).
- Trial expiry now enforced at the signal level — no more free riding past trial end.
- Stripe
account.deauthorized events correctly flip onboarding status.
- 1¢ underpayment loophole tightened — exact amount required.
- Orphaned open trades auto-cleaned when a copier re-subscribes.
Performance
- Health endpoint latency: 150-300ms → ~40ms (parallel DB queries + edge caching).
- 10 new database indexes covering affiliate, login audit, billing, notifications, follower trades, signals, strategies, broker connections, and platform fees.
- Signal poll freshness: just-cancelled signals filtered within 500ms to prevent mid-execution races.
Security
- Stripe API version pinned across all calls — no more silent breakage on API updates.
- Webhook secret rotation has an expiry window — deprecated secrets auto-reject past their grace period.
- Stripe disputes (fraud, product_not_received) auto-flag trader for review and freeze pending payouts.
- Multi-currency destination check blocks silent FX conversion on provider transfers.
- Affiliate fee floor: skip payouts where fees would consume >90% of commission.
- JWT refresh timing edge-case closed (
> → >= on password-change check).
- Forgot-password timing jitter widened to defeat statistical enumeration.
Premium UI overhaul & visual polish
New
- “Unlock Public Listing” checklist card on Provider Hub showing email verification + Stripe Connect progress.
- Premium empty states across dashboard, strategy builder, EA builder, FAQ, brokers, and marketplace.
- Pulse animation on EA download cards when deep-linked from dashboards.
- Stripe Connect status cards with 3 variants (empty / onboarding / connected).
Google OAuth & unified registration
New
- One-click Google Sign-In on register & login pages.
- Unified account model — register once, activate Strategy Provider later from settings.
- Dual-role support: traders can copy other traders while providing their own strategies.