Business

Pay a Thousand Employees on M-Pesa From One USDC Transfer

·7 min read
payrollbusinessm-pesakenyausdcbatch-payoutsmerchant

The problem with paying a lot of people

Paying one person is easy. Paying four hundred is a different job.

The finance lead exports a spreadsheet, then spends the afternoon moving money in batches, because the bank's bulk upload rejects the file over a formatting rule it will not name. Someone's number has a typo. Two rows are duplicates. One amount exceeds a cap nobody documented. By evening, most people are paid, three are not, and nobody can say precisely which three without reconciling line by line.

Now add that the company earns in dollars and pays in shillings, so the whole thing also depends on an FX rate that moved while the file was being fixed.

What Minisend Payroll does

One sentence: upload a spreadsheet, send one USDC transfer, and every employee receives their exact KES salary on M-Pesa, each with a receipt.

The run has six steps.

1. Register once

A payroll organisation gets a permanent USDC deposit address on Base. That is the business's one Minisend address. If the business already takes checkout payments, payroll uses the same address, and vice versa: deposits are routed by intent rather than by having a separate address per product.

2. Upload the CSV

Four columns, one of which is optional:

code
phone,name,amount_kes,employee_ref
0712345678,Jane Wanjiku,64500,EMP-001
0723456789,John Otieno,58000,EMP-002

Phone numbers in 07XX, 01XX, or +2547 form are all accepted and normalised automatically. Excel's "CSV UTF-8", quoted names, and semicolon-delimited exports all parse without being cleaned up first.

Every row is checked on upload. Bad phone numbers, duplicates, and amounts above the M-Pesa per-transaction cap are flagged with their line numbers, so the fix happens in the spreadsheet before any money moves rather than after three payments have failed.

3. Lock a quote

One click locks the FX rate for 30 minutes and returns the exact USDC figure to send:

1,000 employees · KES 64,500,000 · send 502,513 USDC

That number is what the run costs. No estimate, no "approximately".

4. Fund it with one transfer

Send that USDC amount to the deposit address. One transfer covers the entire payroll, regardless of headcount.

5. Payouts run themselves

Each employee receives their exact KES salary on M-Pesa. Progress is live on screen — *327/1,000 paid* — and roughly 1,000 payouts complete in about 40 minutes, dispatched in batches rather than in one burst that a mobile money rail would throttle.

6. Reconcile from the run itself

Every row finishes with an M-Pesa receipt number. Failures — a deactivated SIM, a number that no longer exists — are flagged with the reason.

This is the part worth stating plainly: a failed row fails alone. The other 999 payments are unaffected, and the money behind a failed row is never lost. There is no all-or-nothing batch to re-run.

The rate protection, specifically

Quotes are struck at the buying rate minus a 0.5% buffer. The buffer exists so that a small adverse move between the quote and the payout never shorts somebody's salary.

If the rate moves beyond that buffer, the affected payment fails fast for review rather than underpaying. That is a deliberate trade: a payment held for a human to look at is recoverable, while an employee quietly receiving less than their payslip says is not.

Run statuses

StatusMeaning
DraftRows uploaded, no quote yet
Awaiting fundsQuote locked, waiting for the USDC transfer
FundedMoney arrived, payouts about to start
Paying outPayouts in progress
CompletedEveryone paid
Needs attentionFinished, but some rows failed, listed with reasons
CancelledCancelled before any money was sent

Limits, stated up front

ScopeLimit
Rows per run5,000
Payments per phone number per run1
Amount per rowKES 10 to KES 250,000, whole shillings
Quote validity30 minutes

The per-row ceiling is the M-Pesa per-transaction cap rather than a Minisend rule.

What it does not do yet

Being straight about the edges, because payroll is the wrong place to discover a limitation:

  • Kenya and Safaricom M-Pesa only. Other countries and rails are available for ordinary settlement and batch payouts, but not yet in the payroll product.
  • Funding on Base only. The deposit address accepts many chains for general use; a payroll run is funded with USDC on Base.
  • No recipient-name verification yet. The registered M-Pesa name is not checked against the name in your CSV. Validate the phone number column carefully.
  • No stored employee roster. Each run stands alone from its CSV. There is no saved list that carries between months, so the spreadsheet remains the source of truth.

Who this is actually for

Anyone paying a lot of people in Kenya from dollar-denominated funds:

  • Companies with offshore revenue and local staff. Earn in USDC, pay salaries in shillings, without a conversion appointment at the start of every month.
  • Payroll bureaus running several employers from one operational account.
  • Gig and field workforces — delivery riders, enumerators, promoters, stewards — where headcount fluctuates each cycle and a stored roster would be wrong anyway.
  • Event and project teams paying crews after a job. Same rails as stablecoin ticketing: take money in, pay the crew out.

Pricing and getting started

Payroll pricing is quoted per account, like settlement. Email info@minisend.xyz with your headcount and pay cycle.

Going live needs KYB first: incorporation documents, founder and director details, and proof of address for both the business and the director dated within the last three months. Acknowledgement comes within one business day and most reviews finish within two. Start that a couple of weeks before your first live payday, not the night before.

Open the merchant dashboard, read Minisend for business, or see the API reference.

Frequently asked questions

Can I pay salaries on M-Pesa using USDC?
Yes. Minisend Payroll takes a CSV of phone numbers, names, and KES amounts, locks an FX quote, and pays every employee their exact salary on M-Pesa from a single USDC transfer. Each payment returns an M-Pesa receipt number, and roughly 1,000 payouts complete in about 40 minutes.
How many employees can one payroll run cover?
Up to 5,000 rows per run, with one payment per phone number per run. Each row must be a whole KES amount between 10 and 250,000, which is the M-Pesa per-transaction cap rather than a Minisend limit.
What happens if one employee payment fails?
It fails on its own and the other payments are unaffected. The row is flagged with the reason, such as a deactivated SIM, and the money behind it is never lost. The run finishes in a Needs attention state listing exactly which rows failed and why, so there is no all-or-nothing batch to re-run.
How is the exchange rate handled on a payroll run?
One click locks the rate for 30 minutes and shows the exact USDC amount to send. Quotes are struck at the buying rate minus a 0.5% buffer so a small adverse move never shorts a salary. If the rate moves beyond the buffer, the payment fails fast for review rather than underpaying an employee.
What format does the payroll CSV need?
Four columns: phone, name, amount_kes, and an optional employee_ref. Phone numbers in 07XX, 01XX, or +2547 form are all accepted and normalised automatically, and Excel CSV UTF-8, quoted names, and semicolon exports parse as-is. Bad numbers, duplicates, and over-cap amounts are flagged with line numbers on upload.
Which countries does Minisend Payroll support?
Kenya and Safaricom M-Pesa only at present, funded with USDC on Base. Settlement and batch payouts to Nigeria, Ghana, and Uganda are available through the wider merchant platform, but are not yet part of the payroll product.
Do I need a separate deposit address for payroll?
No. Payroll and checkout share the same business deposit address. Deposits are routed by intent rather than by address, so a business already taking checkout payments funds payroll to the address it already has.

Keep Reading

Minisend: Convert USDC to local currency instantlyLaunch App
Copied to clipboard