A six-person design and web agency in Nairobi runs maybe a dozen active jobs at a time - some fixed-scope projects, some monthly retainers - and pays a rotating bench of freelance designers, developers, and copywriters. The work is the easy part. The month-end scramble to figure out who has paid, who hasn’t, and whether there’s enough in the account to pay the contractors is what quietly eats the founder’s weekends.
Where the money actually leaks
- Deposits are agreed on WhatsApp and then chased for two weeks because the invoice went out as a PDF with bank details buried at the bottom
- Clients ask for “the account number again” instead of just paying
- Retainer invoices are raised by hand, so one gets forgotten every couple of months
- Money coming in from clients and money going out to freelancers live in two different apps and a spreadsheet in between
The billing flow, end to end
Build the invoice properly. Add line items for design, development, and pass-through ad spend, each with its own quantity, unit price, and VAT rate - so a zero-rated disbursement and a 16% service line sit correctly on the same invoice. Your logo, address, and KRA PIN render on the PDF automatically, in your brand accent colour. Every invoice gets a gapless number like INV-2026-0042 - no gaps, no duplicates, which is exactly what an auditor wants to see.
Send it where the client actually is. Email delivers the branded PDF with a QR code and a secure pay link; you can also send the pay link over SMS or WhatsApp. The send succeeds as long as one channel reaches them - a phone-only client no longer blocks the invoice.
Get paid without friction. The client taps the link, lands on a public pay page - no login, no app, no account - enters their number, and approves an M-Pesa STK push on their phone. It runs on SasaPay or Safaricom’s official Daraja, into your own M-Pesa or paybill, not a pooled account. Card payments work too, via Paystack.
Take the deposit first. Send a partial invoice for the 50% deposit, collect it by M-Pesa, and Zana tracks the running balance for you - so the invoice moves to partially paid and clears itself to paid the moment the final instalment lands.
Worked example. A KES 180,000 website build. You invoice a 50% deposit (KES 90,000), the client pays it by STK push, and the invoice shows partially paid, KES 90,000 due. On delivery the client pays KES 95,000 - a KES 5,000 tip on a round number. Zana settles the invoice to paid and holds the KES 5,000 as customer credit, automatically applied to their next invoice.
Pay your freelancers from the same balance
When money lands, pay your contractors straight from Zana to M-Pesa, Airtel Money, a bank account, or a paybill/till - B2C and B2B disbursements over SasaPay. For control as the team grows, require a second person to approve any payout (the approver must be a different person from whoever created it), set a daily limit, and put an approval threshold on larger amounts. Every payout is stamped with who initiated it and who approved it.
Why it reconciles itself
This is the part that gives founders their weekends back. When a payment confirms, the webhook is idempotent and deduplicated - a provider that fires the same callback twice, or an M-Pesa statement you re-import, settles the invoice once, never twice. A callback claiming more money than was requested is treated as suspect and held for review rather than blindly applied. On success, Zana assigns a gapless receipt number, updates the balance, and emails the client a branded PDF receipt - automatically. You get a clean, auditable trail per invoice instead of a reconciliation spreadsheet.
What you’ll need
Retainers run on any paid plan - Starter at KES 1,000/month (150 invoices, recurring billing, API access, 5 team members) covers most small agencies; Pro at KES 2,500/month adds CRM and 500 invoices when you want to run client campaigns from the same contact list. Set up a workspace, connect your M-Pesa, and send a real invoice in a couple of minutes.

