← All projects

Trading-Signal SaaS & Licensing Platform

Production platform that sells and licenses trading tools, routes TradingView alerts to MetaTrader EAs, and keeps Stripe, CRM, Discord and NinjaTrader access in sync.

Client
Trading-tools business
Year
2026
Category
Full-Stack
Stack
  • Next.js
  • React
  • TypeScript
  • Express
  • MongoDB
  • Redis
  • BullMQ
  • Stripe
  • GoHighLevel
  • MQL4
  • MQL5
  • NinjaScript
  • Pine Script

The problem

The business sells indicators and signal subscriptions on four platforms: TradingView, MetaTrader, NinjaTrader and cTrader. Every purchase, renewal, refund or failed charge has to grant or revoke access in several places at once. When that goes wrong, paying customers lose access or cancelled customers keep it.

What I built

I extended and maintained the platform, which another developer started. I also built most of the trading products it distributes.

  • Signal routing: TradingView webhooks go into a Redis/BullMQ queue. MT4/MT5 EAs poll a per-license endpoint, with optional symbol filters and event-driven long-polling.
  • Access engine: Stripe and GoHighLevel webhooks drive workflows that grant or revoke product access. A retry queue, a reconciliation cron and a per-customer audit use Stripe as the source of truth.
  • Billing fixes: idempotent license counts, cross-source transaction dedup, and fixes for renewal and expiry bugs after a Stripe API version change.
  • NinjaTrader licensing: vendor-license integration that grants and revokes NT8 product licenses through the NinjaTrader ecosystem API, with automatic token renewal.
  • AI assistants: an admin agent with tool calls against live Stripe data, and a customer chat assistant that answers from product manuals with keyword-ranked retrieval.
  • Security pass: a hardening round of about 50 fixes, plus strong passwords, a CSP header, Redis rate limiting and log rotation.
  • Products: Pine Script v5 indicators, NT8 indicators and strategies with licensing, an MT4/MT5 signal-executor EA, and a cTrader cBot.

Details

The codebase is a pnpm monorepo. A Next.js app on Vercel serves the UI and API routes. An Express server under PM2 runs queues, cron jobs and webhook workers. Both share one layered backend: domain, services, then workflows.

The signal-executor EA polls the webhook server on a timer, maps symbols to the broker’s suffixes, and checks spread, duplicates, max trades and equity limits before it trades. It then manages partial closes, breakeven and trailing stops.

I also built funnel pages, pricing and checkout pages, and an embeddable testimonial widget for the CRM site builder.