*#
USSD Dialer
operator console

Safaricom KE · *100# · Daraja C2B

M-PESA in.
Bundles out.

USSD Dialer turns a till payment into a dialed *100# session on a real phone: the amount picks the plan, a phone on your rack walks the carrier menu key by key, and the sale settles on the carrier’s own final message.

No human dials. No inbound ports — phones long-poll for jobs from anywhere.

Session replayrack-02 online
listening for payments…

The pipeline

How a sale runs

Five stops between a till payment and a delivered bundle — each one recorded, none of them manual.

  1. 1:PAY
    A customer pays the till

    The M-PESA C2B confirmation lands on the API with the amount and the payer’s number. No app, no link — the till they already use.

  2. 2:MATCH
    The amount picks the plan

    Plans match by exact price: KSh 20 is 1GB for an hour, or it is nothing. No ranges, no nearest-fit guessing with someone’s money.

  3. 3:DISPATCH
    A phone takes the job

    The job goes to an online device on the plan’s network — least-loaded first, across every phone registered to your account.

  4. 4:DIAL
    The menu is walked, key by key

    The phone drives the real *100# dialog. Every keypress checks the screen first; if the carrier moved the menu, it types nothing and reports the mismatch.

  5. 5:SETTLE
    The carrier calls it

    “You have gifted 1GB…” settles the sale. Anything ambiguous is parked for review with the full transcript — never guessed.

The money path

Careful where it counts

A USSD menu has no dry run and no undo. The engine is built around that fact.

It reads before it types

USSD menus answer by position — yesterday’s “1” can mean something else today. Every step carries an expected screen; on a mismatch the engine sends nothing, cancels, and returns the transcript.

Retries that can’t double-buy

Only provably-undelivered attempts retry, three at most. An ambiguous ending goes to failed orders for a human decision — one tap to retry once you’ve seen why it stopped.

The receipt is the carrier’s

Every session keeps the network’s own words, screen by screen. Outcomes are classified from the final message, and the raw transcript is always the authority.

A rack, not a phone

Register as many devices as you need — jobs spread across whichever are online. Airtime top-ups are dial jobs too, sent from a funding phone and settled into a durable ledger.

The console

The whole rack on one screen

Sign in and watch money move: revenue and success rate up top, every order matched to its dial, every device with its heartbeat. When something needs you — a failed order, an offline phone — the console says so. Otherwise it stays out of your way.

OverviewOrdersFailed ordersDelivery activityDevicesAirtimePlansCustomers

Getting started

Live in three steps

The pipeline above runs itself. Getting there is a one-time setup — and the first tier is free.

  1. 01
    Create your operator account

    Sign up and you’re on the Free tier the same minute — one phone, one plan, no card. Upgrade later, only when a busier week asks for it.

  2. 02
    Enrol your phones

    Install the Android agent and tap once per handset. Each phone long-polls the console for work, so there are no inbound ports to open — a phone sells from anywhere it has signal.

  3. 03
    Point your till, publish your plans

    Set your Daraja C2B URL to the console and price each plan to the shilling. From then on every matching payment dials itself — you just watch the money move.

Wiring

Point your till here

Set your Daraja C2B confirmation URL to the console and every payment becomes a job. Safaricom redelivers callbacks it thinks failed — confirmations are idempotent on TransID, so a resend never buys twice.

Phones join from the Android agent: one tap registers the device and it starts long-polling for work. A test mode runs the whole dispatch-and-settle path without spending a shilling.

POST /api/v1/mobile-payments/c2b/confirmation?secret=…
{
  "TransID":       "TGH61XKQ2P",
  "TransAmount":   "20.00",
  "MSISDN":        "254722000113"
}
200 { "ResultCode": 0 } · acked, matched, dispatched

Pricing

Pay for the rack you run

Start free, upgrade when a busy week asks for it. Every tier bills straight from M-PESA — no card, no contract, renewing every 30 days until you let it lapse.

Free
Free/ no card, ever

Kick the tyres — one phone, one plan.

  • 1 phone on the rack
  • 1 sellable plan
  • 1 concurrent dial
Start free
StarterMost shops
KSh 500/ per 30 days

A small shop: a few lines, a handful of plans.

  • 3 phones on the rack
  • 5 sellable plans
  • 2 concurrent dials
Choose Starter
Pro
KSh 2,000/ per 30 days

A busy operator with a rack of phones.

  • 10 phones on the rack
  • 20 sellable plans
  • 5 concurrent dials
Choose Pro

Need more sellable plans than your tier includes? Buy plan slots one at a time from the in-console marketplace — each add-on stacks one extra slot on top of your tier, no upgrade required.