Monthly B2C revenue —

[Kamel Nabil] Alpaca Challenge

Documenting my thought process; How I think and reach conclusions.

→open the next section←go backEsccollapse allor click any toggle


I chose one of the recent achievements that is related to the wealth-tech industry.
Taking IPO subscriptions at Awaed from a stuck, never launched product to a live, end to end experience in —.

Context

  • Awaed is a Saudi WealthTech platform offering retail investing across Saudi/US markets.
  • IPOs are one of the biggest moments for Saudi retail investors, and a natural way to bring new investors in.
  • This was my first major challenge in WealthTech, in a market and a regulatory setup I had never worked in before.

Problem

  • The IPO product idea existed, but it had never been launched.
  • Running an IPO touches Tadawul, compliance, the CMA's rules, trading operations, the brokerage infrastructure, engineering, product design, and finally the user.
  • Each team held one piece of the story. No one held it end to end.
  • Tadawul's subscription file specs alone had dozens of fields, rejection codes, and several reconciliation reports.
  • There was no senior product ownership to bridge the gaps, identify the problem, define it into phases, and turn it into something shippable.
End-to-end ownerKamel
TadawulComplianceCMA rulesTrading operationsBrokerage infrastructureEngineeringProduct designThe user
Each team held one piece of the story. The gaps sat between them.

I owned it end to end, from understanding the problem to getting it live.

  1. 1Go to the sourceI flew to Riyadh and sat with each team, one by one.
  2. 2Walk the process from every angleCompliance, business, trading operations, Tadawul, engineering and design.
  3. 3Map one end-to-end journeyUsers and operations on the same page, from prospectus to listing.
  4. 4Define a shippable scopeTogether with engineering.
  5. 5Launch and stabilizeStay with the teams until every issue was resolved.
Ownership
End to end

A clean version of my working whiteboard, connecting every team in one flow.

User
Awaed app
Operations
Tadawul
Receive IPO prospectus
Create IPO data + status
Open IPO, users notified
User subscribes, money on hold
Every 2 hours, export subscriptions
Trading ops upload file to Tadawul
Tadawul result
Accepted, or Rejected and money released
IPO closes, allocation file received
Allocations pushed to user accounts
Full, partial or none: shares added, the rest released
Listing on exchange

I recall 5 decision moments where I chose one path over another, and had principles behind each.

What I did
Went to Riyadh and sat with each team before writing a single requirement.
The alternative
Collect requirements remotely and stitch documents together.
Why I didn't
Each team only knew its own piece. The gaps sat between the teams, and they only show up when you walk the full process.
Go to the source. The real problem lives where the work happens.
What I did
Instead of waiting for a fully automated Tadawul integration, we launched with a file exchange every 2 hours, run by trading operations, who already had Tadawul access.
The trade-off
Some manual work for operations, in exchange for going live in weeks, not months.
What I refused to cut
Anything compliance or Tadawul required.
Scope is the lever. Compliance and correctness are not.
What I did
Mapped the operations journey with the same care as the user journey: who creates the IPO, who exports and uploads files, who pushes allocations, and what happens when Tadawul rejects a subscription.
Why
A beautiful app is worthless if the back office can't run the process reliably every 2 hours.
Operations is a user too. If the back office breaks, the experience breaks.
Simple statuses
Tadawul returns many result codes and reports. Users see a few clear statuses, each with a notification:
ReceivedAccepted or RejectedFully or Partially AllocatedCancelled
Money held, not taken
The amount is held at subscription. After allocation, we deduct only what was allocated and release the rest automatically.
Users should always know where their money is, without needing to understand how an exchange works.

Once the Saudi flow worked end to end, I took the same model to the US market. The journey was familiar; the infrastructure was not.

Omnibus accountEvery order goes through one Awaed account. The provider sees one investor, while we hold many individual subscriptions.
Limited allocation flexibilityWe receive one combined allocation and final price, and have to divide it among our users ourselves.
New market rulesPrice ranges instead of fixed prices, FINRA Rules 5130 & 5131 attestation, USD offerings for SAR-based users, and lock-up rules after allocation.
The real dilemmaA fully digital integration would take months. A manual flow could go live in weeks.

I split the problem in two, so speed and scale didn't have to compete.

Approach 1 · Manual Ops Flow (MVP)

Go live fast and learn

Reuse the Saudi product with small changes; operations handle the provider steps manually.

Engineering scope: market setting per IPO, US tab, price ranges.

Live in —

+

Approach 2 · Digital Integration

Scale without manual work

Integrate with an IPO provider's API end to end, run from an admin portal.

Engineering scope: IPO fetching, review and publishing, order aggregation, allocation engine, audit.

Phased roadmap, each phase releasable on its own

V0Market and price-range differentiation, USD to SAR conversion, clear wallet states
V1Subscription by value, attestation, validations and error handling
V2Education, timeline updates, editing orders until cutoff, postponement and cancellation handling, lock-up countdown
V3IPO calendar and advanced order rules
Ship manually to learn, then digitize what's proven. Speed and scale don't have to compete.
01Translated the exchange's language into engineering language

I turned Tadawul's file specification into a field-by-field mapping for engineers, showing how each calculated field is computed.

02Defined the contract between systems

The subscription and allocation statuses, and exactly what each one triggers: hold, deduct, release, notify.

03Unblocked daily

Worked through blockers with the engineers day by day, making scope calls on the spot so we never stopped moving.

04Connected engineering directly with trading operations

So the file loop could be tested end to end before going live.

05Stayed through launch

Until every issue that came up was resolved.

—weeks from never launched to live, with a fully digital journey from subscription to allocation
—IPOs in the first two quarters, all running on the same journey
—successful allocation
—subscribed (—): SAR —M in Q3 and —M in Q4. The gap between the two quarters is due to a large single IPO in Q3.
—investors, all first-timers, new to Awaed. An acquisition engine.
—first-timers in Q3 generated nearly all of the —

I broke down what is required in the task into kind of step by step points,
so I can clearly show how I reached any conclusion.

The steps I followed, so every conclusion can be traced back to the data.

1Understand & clean
2Decompose revenue
3Segment accounts
4Volatility & correlation
5Alpaca context
→The Outcome
—rows: 1 account × 1 month
—unique accounts, May 23 – Apr 25
—duplicate account-months
I made sure no duplicate account.
I found a duplicate column and dropped itcrypto_wallet_revenue appears twice with identical values.
I found negative values and kept as reported— values (—), treated as rebates or adjustments.
I didn't find a currency label and assumed it US dollars.

I decomposed the revenue from 3 angles:

All accounts, — months (May 23 – Apr 25).

StreamShare of 24-month revenueLive since

Total: — over 24 months.

◆
Key component: 2 streams, stock PFOF and cash interest, produce — of revenue.

All accounts, 24 months, streams grouped by how Alpaca earns them.

◆
Key component: Interest and trading carry — of revenue. Subscriptions are only —.

All accounts, month by month (May 23 – Apr 25). Did we grow because we got more customers, or because each customer became worth more? And is the mix still the same?

↗
Trend: Monthly revenue grew — (— → —).

I segmented the accounts from 4 angles:

All accounts, 24 months (May 23 – Apr 25).

SegmentAccountsShare of accountsRevenue ($M)Share of revenue
◆
Key component: — legal entities produce — of revenue.

Individuals only, last 6 months (Nov 24 – Apr 25), after Argentina took off. — of the — Argentine accounts make — of it.

SegmentAccountsShare of accountsRevenue ($M)Share of revenue
◆
Key components:
  • The USA is the biggest market: — of accounts and — of individual revenue.
  • But the concentration is in Argentina: — accounts (—) produce — of individual revenue, and just — of them make — of it.

All accounts, 24 months, ranked by total revenue.

SegmentAccountsShare of accountsRevenue ($M)Share of revenue
◆
Key component: The top 1% of accounts produce — of all revenue.
(Top 1% = — accounts = — + — = —)

All accounts, month by month (May 23 – Apr 25).

Revenue per month—— → —
Accounts—— → —
↗
Trends:
  • Monthly revenue grew — (— → —)
  • While accounts grew only — (— → —)

I want to measure what swings the most and what moves together. I tested the streams from 3 angles:

All accounts, 24 months:

  • Typical monthly swing = how much a stream usually moves up or down from one month to the next.
  • How I calculated the swing: the % change of each month vs the month before.
StreamTop 10 accounts' share of the streamTypical monthly swing

Total revenue: —

〰
  • Streams that a few accounts control swing the most.
  • Total revenue swings only —.
  • Market data at —: it makes about — a month, and next month usually lands within about — of that.
  • Non-retail at —: it can double, drop to almost nothing, or even turn negative from one month to the next.

Individuals only, last 6 months (Nov 24 – Apr 25). Correlation runs from 0 (no link) to 1 (always together).

  • Why individuals only: this is a customer behavior question (which products does the same person use?), and the recommendations target individuals. Legal entities behave like institutions and would make products look linked when no retail customer behaves that way.
  • Why the last 6 months: every product was live by then (options from May 24, the sweep from Nov 24), so every account had the chance to use all of them.
StreamCorrelation with stock PFOFHow to read it
⇄
  • Stock traders also use cash, margin and stock borrow.
  • Market data subscribers use nothing else.

Individuals only, last 6 months. The top 1% of accounts are excluded so a few big accounts don't set the averages.

▲
Accounts using 5+ products earn — the revenue of accounts using one.

I checked how Alpaca's B2C product actually works.

$Market data plans

Basic is free; Algo Trader Plus is —/month.

→ I assumed that to the — rows.

Source: Market Data API ↗
★Alpaca Elite

Already exists for active traders (from — deposits).

→ I build on it rather than propose a new program.

Source: Alpaca Elite ↗
◆Business accounts

Exist on the Trading API.

→ This likely explains the legal entities in a B2C dataset.

Source: Business Accounts ↗
!
My B2C assumption: I report totals on all accounts, and analyze behavior on individuals only (excluding the — legal entities). Every number below says which one it uses.

As explained above (revenue by stream, and by stream category).

As explained above (account type concentration).

As explained above (accounts geography concentration).

As explained above (accounts volume concentration).

What I found:

  • Revenue grew — (— → — a month). Accounts grew only —.
  • Most of the jump came in one quarter, Jun → Sep 24 (— a month). — of that came from three groups of large new accounts: Argentina, one Cayman legal entity and 4 Spanish accounts.
  • Since then, everyone else grew — (— → — a month). The Spanish accounts stopped earning after Sep 24.

Conclusion

  • The step change came from landing a few large accounts, which makes revenue fragile.
  • Lasting growth needs more accounts earning, not only more revenue from a few.

What I found

  • Cash interest fell from — → —.
  • Stock PFOF rose from — → —. About half of that rise came from the new Argentine traders.
  • Newer products went from — → —.
Share of monthly revenue (2023 average) → last 6 months, Nov 24 – Apr 25

Conclusion

  • Revenue depends less on interest income.
  • It depends more on trading by a few large accounts, so it's less diversified than it looks.

What I found:

  • Signups tripled, from — a month to — a month.
  • New signups convert well: — earn at least once, most of them in their first month.
  • The older base doesn't: only — earned anything in 24 months. Why the older base never started isn't in the data. Funding, first-trade and login data would tell us which, and give a full funnel.

New accounts per month

Who earns at least once

New signups
—
Older base
—
—open accounts have never earned anything

Conclusion

  • Acquisition works. Getting accounts to start earning is the gap.
  • — open accounts have never earned anything, most of them in the older base.

What I found:

  • Cash interest grew — (— → — a month).
  • One Cayman legal entity, which joined in Apr 24, makes — of that —.
  • Everyone else stayed flat at —–— a month. Paying accounts grew —, so interest per account fell (— → — a month).

Explanation:

  • The jump is one account, most likely holding a large cash balance.

Conclusion

  • The cash interest "growth" is one account.
  • For everyone else, interest income per account is shrinking.

What I found:

  • US: grew — (— → — a month). Paying traders rose — (— → —) and PFOF per trader doubled (— → —).
  • Argentina: a dozen new accounts made — of individual stock PFOF since Aug 24.
  • Other international: a spike in Jul–Sep 24, mostly 4 Spanish accounts, that faded.

Explanation:

  • Argentina likely reflects strong local demand for US-dollar assets.
  • US growth reflects more active traders trading more in a strong market. (I can't separate trading volume from PFOF rates without trade data).

US stock PFOF per month, individuals

Conclusion

  • US growth is the healthiest growth in the dataset: broad and repeatable.
  • Argentina is a big opportunity and a big concentration risk at the same time.

What I found:

  • Margin interest grew — (— → — a month on average since Oct 24).
  • Borrowers more than doubled (— → —).
  • Outside the top 10 accounts, margin revenue grew — (— → — a month).

Explanation:

  • More customers are borrowing to trade.

Borrowers per month

Margin interest outside the top 10

Conclusion

  • Margin is a healthy, broad stream worth growing.
  • Margin borrowers are a natural next step on the product ladder (see Correlations).

What I found:

  • Market data (Dec 23): — in Jan 24 → — a month. The — plan grew from — → — subscribers.
  • Options PFOF (May 24): — in Apr 25, from — traders, — the first month.
  • Crypto wallet (Dec 23) and the FDIC sweep (May 24) stay below — a month. Crypto had — payers in Apr 25.

Explanation:

  • Market data sells to developers building on Alpaca's API (see Correlations), so it grows with API adoption.
  • Options is still ramping, with monthly spikes.
  • Crypto: no clear reason in the data; likely a weak fit for an audience that comes for stocks and APIs.

Market data

Options PFOF

Crypto wallet

Conclusion

  • Market data and options are working.
  • Crypto isn't, as a B2C stream.

What I found:

  • The streams few accounts control swing the hardest.
  • Market data is the steadiest (—): its top 10 hold just —. It makes about — a month, and next month usually lands within about — of that.
  • Concentration alone doesn't cause the stream volatility problem (margin is — top 10 but swings only —).
  • Total revenue swings only —, because the streams partly offset each other.

Typical monthly swing vs top 10 accounts' share

StreamTypical monthly swingTop 10 accounts' shareMy comments

Conclusion

  • The streams a few accounts control swing the hardest.
  • Market data is the most predictable revenue.

What I found:

  • Stock PFOF moves with cash interest (—), margin (—) and stock borrow (—).
  • — of margin borrowers (—) and — of stock borrow payers (—) also trade stocks.
  • Options is only weakly linked (—): just — of stock traders (—) trade options.
    • Why? If I have the data of "options eligibility, approval level and application status", it would help me answer "maybe not eligible, not approved, or not aware?"
    • One interesting point: options also reaches people beyond stock traders. — of options traders (—) don't trade stocks at all.
Every product was live in the last 6 months (options from May 24, the sweep from Nov 24), so every account had the chance to use all of them.

Conclusion

  • A funded, active stock trader tends to use several products, so cross-selling should start there.
  • Options is the least-used add-on among stock traders (—).

What I found:

  • Revenue per account rises with every product: — (1 product) → — → — → — → — (5+), —.
  • — of accounts (— of —) use only one product.
  • Stock traders who also trade options earn — vs —; those who also use margin earn — vs —.

Conclusion

  • The product ladder is real, and most accounts are on the first step.
  • Heavier traders pick more products on their own, so cross-selling should be tested with holdouts (Rec 2).

What I found:

  • Market data has no link to any other stream (— with stock PFOF).
  • The — plan adds real-time data from all US exchanges. Yet in Apr 25, only — (— of — — subscribers) generated any revenue beyond the —.
  • Subscribers who also trade stay longer, in every month since Jan 24: on average — still pay the next month, vs — for data-only. In early 2025 (— vs —), — traders stopped paying in an average month, vs — data-only.
  • When they stop paying, — data-only subscribers (—) close their account, vs — traders (—) (Feb 24 – Apr 25).

Still paying the next month

When they stop paying, they close their account

Data-only
—
Traders
—

Conclusion

  • The — plan attracts serious algo builders, but most use Alpaca for data, not trading.
  • Getting them to trade pays twice: trading revenue on top of the —, and longer subscriptions.
  • The first month is the lever: new subscribers who trade in month 1 stay at —, vs — for data-only (Rec 3).

Before showing my 3 recommendations, I want to share how I reached them.

  • I listed all the identified opportunities in the whole exercise, then prioritized them,
  • then came up with multiple recommendations, then focused on 3 recommendations.
Listedall identified opportunitiesi
Prioritizedthemi
Draftedmultiple recommendationsi
Focused on 3i

Hover a step to see the details behind it.

—of Apr 25's — (—) came from — Argentine accounts and one Cayman entity.
  • — of the Jun → Sep 24 jump (—/month) came from a few large new accounts.
  • The top 1% (— accounts) make — of revenue, and the streams they control swing the hardest.

What I see is that the accounts that carry revenue today are also the biggest growth upside.

  1. Watch revenue-at-risk: alert when a top 300 account's activity drops vs its own 3 months average, with a named owner for each account.
  2. Proactive Elite invites for eligible accounts (from — deposits). We don't wait for top accounts to find Elite on their own. Invite them, so they feel valued and are less likely to leave.
  3. Find more like them: trace how the mid-2024 accounts arrived (partner, referral, sales), then run a look-alike test in that channel, starting with demand for US dollar assets like Argentina's users.
Protect ~—/monthEach Argentine-sized account we keep is worth ~—/month (— ÷ —).
+~—/monthGrowing: every 5 new accounts of that size.

Success metrics:

  1. Growth: number of accounts earning $1K+/month (— in Apr 25)
    How many accounts bring in $1K or more in a month. If we're finding more high-value accounts, this count rises above today's —.
  2. Protection: 90-day revenue retention of the top 300 accounts
    Of what the top 300 accounts earn us this month, how much the same accounts still earn us 90 days later. Close to 100% means we're keeping them; a drop is an early warning.
  3. Health: top-12 share of revenue falls while total revenue grows
    It should go down while total revenue goes up, meaning growth is spreading across more accounts, not that we lost the big ones.
  • Top accounts are real customers, not misclassified omnibus or professional accounts.
  • Argentina's demand for US-dollar assets continues.
  • We can find out how these accounts arrived.
—open accounts have never earned anything (— in the older base, — new signups).
  • — of earning accounts (— of —) use only one product, while revenue per account climbs from — → — with 5+ products.
  • Funded stock traders already add cash, margin and stock borrow on their own. Yet only — of them (—) trade options and ~— (—) use margin.

→ Most accounts sit on step 0 or 1, and the ones that climb earn much more.

I propose 4 levers. A lever is one action we pull to move accounts up the ladder.

Step 0 → 1Lever 1, new signupsPush them to a first trade in month 1, when most new earners start.
Step 0 → 1Lever 2, older baseRe-engage the accounts that never earned anything.
Step 1 → 2Lever 3, marginOffer margin pre-qualification to funded stock traders.
Step 1 → 2Lever 4, optionsOffer options approval to funded stock traders.

Step 0 → 1: track the first steps (KYC, funding, first trade) to see where accounts stop. Test every lever with a 10% holdout: keep a random 10% of eligible accounts out of each lever, and compare them with the rest. The gap between the two groups is our real impact, since heavier traders may add products on their own anyway.

→ In total, ~—/month (~—/year). It's smaller than Rec 1, but it comes from thousands of accounts rather than a dozen, so it's steadier. The holdouts will show how much of it is real.

Success metrics:

  1. Ladder: % of accounts using 2+ products (— today)
  2. Activation: never-earned accounts making their first revenue each month
  3. Attach: options and margin uptake among stock traders, vs holdout (— and — today)
  • Converted accounts earn like today's average accounts outside the top 1%.
  • Options and margin need suitability approval.
  • The — accounts are still open and reachable.
—new subscribers leave after month 1. Those who trade in month 1 stay at —, vs — for data-only.
  • Market data is the steadiest stream (—) and grew from — → — subscribers. Which is a great entry point.
  • Only — (— of —) generate any revenue beyond the —.
  • When "data only" subscribers leave, — close their account, vs — of traders.

The first month decides whether a subscriber stays, and whether they ever trade.

  1. Make the move from paper to live seamless: I haven't seen how this move works today. So my first step is to walk through it with the team, find every blocker that stops a developer from going live, and remove it.
  2. Better first-month onboarding: guide new subscribers step by step toward their first real trade.
  3. An incentive to go live: for example, refund the first — once they deposit money and place a real trade.
  4. An early-warning alert: when a new subscriber's activity drops in month 1, reach out before they cancel.
Month-1 retention today
—
Target
—
+— subscriberslong-term (— → —) → ~—/month (~—/year) in data revenue.
+1 point = — subscribers(—/month). For example, going from — to — keeps about — more people paying —.
Plus trading revenueeach subscriber who starts trading generates about —/month more on top of the —.

Success metrics:

  1. Retention: month-1 retention (— today, target —)
  2. Activation: % of new subscribers trading live within 30 days (— today)
  3. Business: total revenue per subscriber (data + trading)
  • The — rows are the Algo Trader Plus plan.
  • Trading partly causes the higher retention, rather than only reflecting more committed users.
  • — new subscribers a month holds.
  1. We see revenue, not what drives it. No balances, trades, prices or costs: I can see what we earned, but not why, or what it cost us.
  2. We can't see the customer journey. No signup, funding, first-trade or closing dates; an account's first month in the data stands in for its signup.
  3. The "B2C" data isn't pure B2C. It includes — legal entities and non-retail revenue, and some negative values with no explanation.
  4. 24 months is short. It includes rate cuts, an election and strong markets, so one-off events are hard to tell apart from trends.
DataWould answer…
How each big account found us (partner, referral, sales), and what we launched or ran each monthWhy did Argentina, the Cayman entity and Spain arrive in mid-2024, and how do we find more like them? (Trend 1)
Each account's first steps: KYC approved, funded, first trade, last login, paper or liveWhere did the — dormant accounts stop, and why? (Trend 3)
Cash balances and the interest rate we pay customersIs cash interest falling because of rates, the sweep, or less cash? (see Contributing Factors)
Number of trades and the PFOF we earn per tradeDid US traders trade more, or did we earn more per trade? (see Contributing Factors)
Options eligibility and approvalWhy do only — of stock traders trade options? (see Correlations)
Free-plan users, API and paper trading usage, cancellation reasonsWhat moves a developer from free to — to live trading, and why do new subscribers leave after one month? (see Correlations)
i
Disclaimer:
I used Claude as my data analysis partner to process — rows and break it down in the way I needed.
I used it also to draw charts to help visualize my raw Excel data findings.
▦
Working sheet:
I worked on the PM Interview Data sheet ↗ that I received. I built on it all the analysis tabs I needed.
Everything here in the notion document file is based on my findings in the sheet.