Shahria Emon
Project Nexus · IB CRM · Vantage sync

Built for 12,000 members. Went live with 56,000.

A CRM that auto-syncs a whole Vantage IB network every 20 minutes, plus a Telegram bot that checks every channel member against it.

1 day
from takeover to Milestone 1 approval
4.7x
the member base in the brief
1.8ms
per account check, target was 100 ms
5/5
Upwork review, then a paid follow-on
In 30 seconds
The problem
A paid Telegram channel for a forex IB network on Vantage, tens of thousands of subscribers, and no way to see who was still an active, funded client.
What I did
Took the project over mid-milestone, proved a key assumption against the live Telegram API, then led the build of the Vantage-synced CRM, the rules engine and the Telegram bot.
The outcome
Approved the day after the takeover, live at about 56,000 members, a 5-star review, and the client came back for a paid scope amendment.
Role Lead developer, Core Devs LtdClient UK master IB (anonymised)Live July 2026, 18 releasesStack Node, Next.js, MongoDB, grammY
01The problem

Telegram knows nothing about anyone's broker account.

Members should only stay while they trade through the IB network. Nobody could check that by hand.

A UK master Introducing Broker (IB) on Vantage runs a gold-trading signals service through a paid Telegram channel. A subscriber should stay only while three rules hold: their account sits under the client's IB or any sub-IB beneath it, they have traded within a set number of Gold trading days, and their balance stays above a minimum, with a warning and a grace period first. A member with several MT4/MT5 accounts passes a rule if any one of them does.

The support team was cross-checking spreadsheets and removing people one at a time, so members who stopped trading or moved broker stayed in for free. The data lives in the Vantage partner portal, which has no public API for it and sits behind bot protection and a CAPTCHA. The signed spec ran to 52 requirements, including a mandatory dry run before the first real removal.

02The takeover

Inherited mid-milestone. Approved the next day.

The original backend was technically strong. The process around it had gaps, and one wrong assumption.

The original developer had cracked the hardest part: getting live data out of a portal that blocks every direct request. But the milestone demo used a Telegram group where the signed spec said channel, on the belief that a bot cannot remove members from a broadcast channel. In a group, every subscriber sees who was accepted and who was removed. The demo showed 6 of the 12 acceptance criteria, and the regression, code and security audits had not been run.

12 Jul

Tested the assumption instead of debating it

On a real broadcast channel, through the live Bot API, the bot approved and declined join requests and removed and unbanned members, with nothing visible to subscribers. Switching to a channel was a configuration change.

12 Jul

Built the missing demo tooling

Scene commands put test members into each rule's state and ran the real rules engine with compressed timers, so all 12 criteria could be shown on live data with nothing faked.

12 to 13 Jul

Ran the skipped quality gates first

Regression at 95 of 95, a code audit and a security audit, before the recording. The audit caught a client-facing defect in the welcome message straight away.

13 Jul

Milestone 1 approved

The day after the takeover.

1 day
From takeover to approval.Verify the load-bearing assumption against the real system before you build on it.
03How it works

A CRM synced with Vantage, a rules engine and a Telegram bot.

Everything starts with the sync: every 20 minutes the whole Vantage IB network lands in the CRM, so the bot never waits on the broker.

A sync engine logs into the Vantage partner portal every 20 minutes and pulls the full client list for the whole IB network. The Telegram bot handles channel join requests and checks each account number against that data. A rules engine runs after every sync and warns, removes or leaves each member alone, always with a private message saying why. The CRM dashboard gives the owner, the support team and each sub-IB their own view.

1.8 ms
Per account verification.The target in the spec was under 100 ms.
  1. Abuse is capped, humans can override

    Repeated wrong account numbers block the user and route them to support, who can clear the block in one click.

  2. Every outbound action is throttled

    Approvals, removals and messages go through a queue that stays inside Telegram's rate limits and survives restarts, so bulk actions never get the bot banned.

  3. Removal always comes with a reason

    Before any kick, the member gets a private message naming the rule they failed: no trades, balance below minimum, or no longer under the IB.

04The dashboard

The scope grew 70 percent. The date did not move.

Before writing dashboard code, I audited the contract. Fourteen of 52 signed requirements were covered by nothing.

Eight of those were real, unplanned work, and six had not been known to anyone: role-based access control, Telegram membership tracking, the dashboard half of the dry-run safety feature, audit-log writes and a stale-data guard among them. Our PM added all of it, two days before the demo date, with standing rules: no quality gate weakened to save time, and nothing reported as done that was not.

Signed milestone
  • 10 acceptance criteria
  • Dashboard not started
  • No role-based access in any plan
  • Demo date two days away
Delivered in about three days
  • 17 acceptance criteria, on the original date
  • 115 unit and integration tests, 11 real-browser E2E
  • Independent code and security audits, no critical issues
  • Login brute-force limiter added and verified live

A rehearsal against real broker data showed the account owner arriving in a different field from the one documented, so IB attribution was fixed before the demo. Milestone 2 was approved on 14 July 2026, and the contract closed with a 5-star Upwork review.

Rules enforcement · dry run
Rules enforcement dry run listing which Telegram members would be removed and why, before anything happens
The dry run: nobody is removed until the owner authorises it.
Rules configuration
Rules configuration with no-trade threshold in Gold trading days, minimum balance, grace period and verification attempts
Business rules the owner can change without a developer.
Inheriting a project that is slipping?I audit it against the contract before writing a line of code.
Talk it through
05In production

Live at 4.7 times the brief, and four real incidents fixed at the root.

The brief said about 12,000 members. The live system found about 56,000, and 66,000+ records by late September.

Scale problems surfaced on day one and were fixed on day one: a missing index meant the sync never finished at 56,000 records, and a filter dropdown with 3,681 options made each dashboard page 789 KB until it became a type-ahead search. Enforcement launched in dry-run mode, so nobody was removed until the owner switched it on.

90 s
To clear a 2,150-message backlog.The same night a 7,000-person join rush froze the bot.
A 7,000-person rush froze the botSame-night fix, then a redesign that makes it impossible

One process was running the full sync, the bot and a browser-based fallback, and every re-login under load stalled replies. A database-only bot mode cleared the backlog in about 90 seconds. The permanent fix split the bot into its own browserless, concurrent service. Over the next 19 hours the engine re-logged 59 times under the same pressure and the bot's backlog stayed at zero.

Server migration with zero data lossChecksum-verified, count-checked, rollback kept

Production moved to a larger AWS server: writers frozen, a checksum-verified backup, restore, and every collection count-checked against the old server before DNS switched, with the old server kept for rollback. Then hardening: automatic restarts, daily backups, TLS auto-renewal, durable queue storage and capped logs.

Removing the wrong people is worse than removing nobodyA completeness guard and three fixes for a rejoin loop

When the broker feed once dropped by half in a single cycle, a new payload completeness guard started pausing "no longer under the IB" removals whenever the feed shrinks well below its baseline. A rejoin loop was traced with data and closed with three fixes, including a rule that an IB removal only fires after several consecutive absent syncs. Two independent adversarial reviews then audited every admit, retain and exclude path.

The broker rebuilt its login page overnightFrom crash loop to alert-and-stay-up

Every login failed after Vantage moved its portal to a new component library. A diagnostic tool saved the live page and ruled out an IP ban, the CAPTCHA, resources and the browser profile one at a time. Login now uses ordered fallback selectors tested offline against a saved copy, and the engine stays up and alerts instead of crash-looping.

Kicked clients report
Kicked clients report with the rule that removed each member, date, assigned IB and an allow-rejoin action
Every removal, the rule behind it, and a one-click allow-rejoin.
Audit log
Audit log recording who changed rules, bot messages, accounts and verification blocks, and when
Every sensitive action, who did it and when.
06The follow-on

The client came back: a login for every sub-IB, isolated by design.

Each sub-IB sees only their own clients and their network beneath them. One IB must never see another's book.

  1. The IB tree is imported, not typed in

    A read-only probe of the Vantage portal returned the real tree: about 2,000 IBs, 12 levels deep. "Autofill from Vantage" pre-fills each parent, and nothing is saved until the owner confirms.

  2. Names are never keys

    41 IB names appear on more than one node. Scope uses exact numeric account matching, resolved per person, so someone with several accounts sees their whole book and nobody else's.

  3. Authorization fails closed

    Every route must declare its roles or the code does not compile, and a test checks every route against a permission matrix. Out-of-scope records return "not found", so their existence is never confirmed.

  4. Tested at production shape

    A fixture rebuilt production's structure with no real identities and caught bugs that only appear at scale, such as a 47,000-pixel page. Viewer queries now run in 3 to 35 ms.

IB network
IB network management with Autofill from Vantage, IBs awaiting a parent, and the current hierarchy
A 12-level partner network, filled from the broker's own tree.
IB Viewer · My network
IB Viewer landing page showing only that partner's own network totals and sub-IBs
What a sub-IB sees: their own network, and nothing else.

The first demo of the new role was turned down as confusing because it opened with internal plumbing. The second opened with what an IB actually sees and was approved. It went live on 2 September 2026.

Results

What the project delivered.

Every figure below comes from the project's repository, release tags and signed documents.

1 day
from takeover to Milestone 1 approval
17
acceptance criteria on the original date, up from 10
4.7x
the member base in the brief, about 56,000 vs 12,000
1.8ms
per account verification, target was 100 ms
677
automated tests, including real-browser E2E
38
acceptance criteria in total, against 22 planned
0
data lost in the production server migration
18
tagged releases, v1.0 to v1.5.7
5-star Upwork review, then a paid scope amendment from the same client
Stack

What it runs on.

Engine
Node 22TypeScriptPuppeteer, real ChromeStreaming JSON
Data and queues
MongoDB 7 + MongooseRedisBullMQ
Telegram and dashboard
grammYNext.js 16React 19Role-based access
Security and infra
AES-256-GCM secretsbcryptAWS EC2nginx + Let's Encryptsystemd
FAQ

Questions this project answered.

Can a Telegram bot remove members from a broadcast channel?

Yes. A bot that is an admin of the channel can approve and decline join requests, and remove and unban members, through the Telegram Bot API. With join-request approval on a broadcast channel, subscribers see no "joined" or "removed" messages. We confirmed this against the live API before building on it.

How do you verify Telegram subscribers against a forex broker account?

Telegram has no broker data, so the bot asks each applicant for their MT4/MT5 account number and checks it against a regularly synced copy of the IB's client list. In Project Nexus the sync runs every 20 minutes and a check takes about 1.8 ms, so the bot never waits on the broker.

How do you keep IB partners from seeing each other's clients?

Import the real IB tree from the broker, key everything by numeric account rather than name, resolve each viewer's scope per person, check it on every query and export, and make route permissions fail closed. Out-of-scope records return "not found" so their existence is never confirmed.

How do you avoid removing paying members by mistake?

Start with a dry run the owner reviews, give new and re-admitted members a grace period, require several consecutive absent syncs before an IB-allocation removal, pause those removals automatically when the broker feed looks incomplete, protect channel admins, and audit every action.

Let's talk

Need a Telegram bot, trading automation, or an IB dashboard?

Tell me what you're building, your timeline, and a rough budget, and I'll tell you honestly if I can help.

Thanks, your message is on its way. I'll reply within a day.
Shahria EmonCOO, Core Devs Ltd
Prefer email?
hello@shahriaemon.com
  • A reply within a day, from Dhaka (GMT+6)
  • An honest yes or no on whether I can help
  • 5/5 on Upwork with the Core Devs team
Next case study
3 languages
Teaching an AI to sell like a Bangladeshi shopkeeper.
MyMod, an AI sales assistant for Facebook sellers.
Let's talk