Apps people keep on their phone.
iOS and Android apps for your customers, riders and field teams, with M-Pesa built in and a back office to run it all. Built in Flutter or React Native on Laravel APIs, published to the stores and looked after by us.
Good for Ordering and delivery · Field sales teams · Member apps · Booking apps · Loyalty and rewards
An app, and everything behind it.
Most of the work in a good app is the part customers never see: the back office, the payments, the messages and the updates after launch. We build all of it.
iOS and Android from one build
Flutter or React Native, so both stores get the same app and updates ship together.
Works on a weak signal
Screens load from the phone first and sync when the connection returns, so no order is lost.
M-Pesa built in
STK push at checkout through Daraja, with card payments and refunds matched to each order.
A back office to run it
Orders, customers, riders and payments managed from one web console your team logs into.
Push, SMS and WhatsApp
Order updates and offers on the channel each person reads, with opens and orders tracked.
Store launch and updates
App Store and Play Store listings, reviews, crash reports and regular updates handled.
Where your team runs the app.
Every app we build comes with a web console for the people behind it. Pick a module to see what your operations team works from while customers and riders use their own apps.
- Operations
- Customers
- Business
- late1
- packing1
- with rider1
No records match.
New dashboard
No records match.
Njeri Kamau · Kilimani · Slot 10:30 to 11:30
- Items
- Maize flour, milk, eggs and 3 more
- Total
- KES 2,340, paid by M-Pesa
- Rider
- Juma Mwangi, 8 minutes away
- Address
- Argwings Kodhek Rd, gate B
- Substitute
- Brown bread for white, accepted
- Packed by
- Esther, Kilimani hub
- Proof
- Photo on delivery
- Picked up by Juma Mwangi
- Packed and checked by Esther at the hub
- Customer accepted brown bread instead of white
- Paid KES 2,340 by M-Pesa, SJK4T8QW2L
- Order placed in the app
New order
No records match.
Kilimani zone · Motorbike KMFG 482B · On shift since 07:00
- Phone
- 0712 *** 554
- Shift
- 07:00 to 15:00, Kilimani hub
- Drops today
- 17, all on time
- Earned today
- KES 2,550 so far
- Cash to hand in
- KES 1,150
- Rating
- 4.9 from 1,204 deliveries
- Picked up #40812 for Njeri Kamau
- Delivered #40806, photo proof
- Collected KES 1,150 cash for #40803
- Checked in at the Kilimani hub
Add rider
- low stock2
- in stock3
- out of stock1
- on offer1
No records match.
Dairy and eggs · Barcode 6164102338 · Kilimani hub
- Price
- KES 450 a tray
- Stock, Kilimani
- 12 trays, reorder at 20
- Stock, Westlands
- 48 trays
- Sold today
- 31 trays
- Supplier
- Poultry farm in Kiambu, Thursdays
- In the app
- Shows "only 12 left"
- Stock fell below 20 trays: reorder suggested
- 40 trays received at the hub
- Price changed from KES 480 to KES 450
- Product photo updated
Add product
- loyal2
- new2
- quiet 30 days1
- regular1
- flagged1
No records match.
Customer since Feb 2025 · Kilimani · Android app
- Phone
- 0722 *** 418
- Orders
- 23, the last one today
- Spend
- KES 41,300, average KES 1,796
- Points
- 1,240, worth KES 124
- Segment
- Weekly shopper, Kilimani
- Referred
- 3 friends, KES 600 credit
- Consent
- Push and SMS yes, email no
- Order #40812 placed, KES 2,340
- Order #40566 delivered and rated 5 stars
- Opened the Payday offer push
- Referral code used by a friend: KES 200 credit
Add customer
Order #40809 marked late. Push sent with a new time
Substitute added to #40814 and KES 330 refunded to M-Pesa
Second payment SJK4V7RT9K found, not matched to any order
Incoming call, 2:14, answered by Mary Njambi
Snoozed until Fri 9 Oct, 09:00
Marked resolved by Mary Njambi
No records match.
In-app chat · Order #40809 · 18 minutes late
- Order
- #40809, KES 1,150, M-Pesa
- Slot
- 09:30 to 10:20
- Rider
- Samuel Njoroge, 6 minutes away
- Customer since
- June 2026, 7 orders
- Agent
- Mary Njambi
- AI summary
- Order late, wants an arrival time
- Diana asked where her order is
- Order marked late, push sent with a new time
- Picked up by Samuel Njoroge
- Order placed and paid, KES 1,150
New message
- sent3
- low opens1
- scheduled2
- automatic1
No records match.
Push, SMS fallback · All customers · Fri 25 Sep, 17:00
- Message
- 10% off baskets over KES 2,000 to Sunday
- Sent to
- 17,920 phones
- Delivered
- 16,880 by push, 1,040 by SMS
- Opened
- 41%, 6,920 people
- Orders in 24 hours
- 488, worth KES 1.1M
- Code used
- PAYDAY10, 512 times
- Offer ended: 512 orders used PAYDAY10
- Results in: 488 orders within 24 hours
- Sent to 17,920 phones, by SMS to 1,040 without push
- Approved by Achieng Odera
New push
- matched3
- unmatched1
- refunded1
- to hand in1
- paid twice1
No records match.
M-Pesa · Order #40812 · Njeri Kamau
- Amount
- KES 2,340
- Paid from
- 0722 *** 418
- Paid at
- 6 Oct 2026, 10:06
- Matched
- Automatically, by order number
- eTIMS receipt
- Sent with the order confirmation
- Reaches the bank
- Wed 7 Oct
- eTIMS receipt sent with the order confirmation
- Matched to order #40812 automatically
- KES 2,340 confirmed by M-Pesa
- STK push sent to 0722 *** 418
Match payment
No records match.
Customer app · Android · Released 5 Oct 2026
- Rollout
- 50% of users, next step Thu 8 Oct
- Crash-free
- 99.7% of sessions
- Installs
- 4,820 so far
- What changed
- Saved baskets, faster checkout
- Rating since release
- 4.7 from 64 ratings
- Runs on
- Android 8 and newer
- Rollout raised from 20% to 50%
- No new crashes in the first 8 hours
- Released to 20% of Android users
- Approved by Achieng Odera after team testing
New release
Dashboard
Orders, riders on shift, collections and the app rating on one screen, with the late orders to chase: what Achieng opens at the start of a shift.
Orders
Every order placed in the app, from checkout to the customer's door.
- Live order boardEvery order on a board by status, from placed to delivered, updated as the app and riders move.
- Picking lists for the hubEach new order shows as a picking list at the hub, with the substitutes the customer agreed to.
- Substitutions by the customerWhen an item is out, the customer picks a substitute or a refund from a push.
- Nearest free riderReady orders are offered to the nearest free rider, who accepts on the rider app.
- Delivery slotsCustomers choose a time slot, and each slot closes when the hub is full.
- Phone and WhatsApp ordersOrders taken by phone or WhatsApp entered here and tracked like app orders.
- Cancellations and refundsEvery cancellation records who, when and why, and the refund goes back to M-Pesa.
- Late order alertsAn order that misses its slot turns red, and the customer is told before they ask.
- Proof of deliveryA photo, a signature or a one-time code from the customer closes the order.
Riders & field staff
Riders and field teams on the map, with every drop and visit proved.
- Live location during deliveriesEach rider's position on the map while on shift, updated every 30 seconds.
- Rider appRiders accept orders, follow the route, call the customer on a masked number and confirm delivery.
- Photo, signature or codeProof of delivery captured on the rider's phone before the order closes.
- Routes and drops for the dayDrops grouped by zone, so a rider carries several orders on one trip.
- Shifts and zonesWho works which zone and when, with check-in at the hub.
- Pay per dropEarnings worked out per drop and distance, tips added, paid weekly to M-Pesa.
- Cash on deliveryCash collected by each rider, and what they still need to hand in.
- Rider ratingsCustomers rate each delivery, and the rating shows on the rider's profile.
Catalogue & stock
Products, prices and stock per hub, pushed to the app as they change.
- Products with photosName, photos, size, price and category for every product in the app.
- Stock per hubStock counted per hub, so customers only see what their nearest hub has.
- Out of stock hides itselfA product that runs out is greyed out in the app until it is back.
- Prices on a scheduleA new price or an offer set to start and end at a set time.
- Bulk updates from ExcelPrices and stock for hundreds of products updated from one spreadsheet.
- Low stock alertsThe hub manager is told when a product drops below its reorder level.
- BarcodesScan to find a product, receive stock or check a picking list.
- VAT per productEach product carries its VAT rate, so receipts and eTIMS invoices are right.
Customers
Who downloaded, who orders again and who has gone quiet.
- Profiles with order historyEvery order, payment, address and message for each customer in one place.
- Segments by area, spend and habitGroups like weekly shoppers in Kilimani or quiet for 30 days, updated every night.
- Loyalty pointsPoints per shilling spent, used at checkout, with the balance shown in the app.
- Referral codesEach customer gets a code, and both sides earn credit on the first order.
- Saved addresses and pinsSeveral addresses per customer, with a map pin and gate notes for the rider.
- Consent and data protectionMarketing consent kept per channel, and data handled under the Data Protection Act 2019.
- Account deletionCustomers delete their account from the app, as the stores require.
- Flagged accountsCustomers with repeated failed payments or abuse flagged for the team.
Support chats
Chats from the app, WhatsApp, SMS and calls about orders, answered with the order beside them.
- In-app chatCustomers chat from the order screen, so every message arrives with its order.
- WhatsApp and SMS in the same listMessages to your WhatsApp number or by SMS land in the same inbox.
- The order beside the chatItems, rider, payment and delivery time shown next to the conversation.
- Refunds from the chatRefund an item or the delivery fee to M-Pesa without leaving the thread.
- Rider in the loopPass a message to the rider on the rider app and see the answer in the thread.
- AI suggested repliesA draft reply written from the order and the chat, for an agent to check and send.
- Saved repliesAnswers to common questions saved once and sent in two clicks.
- Reply times and ratingsFirst reply time per agent, and the customer's rating of each chat.
Push & messages
Push notifications, SMS and WhatsApp that bring people back to the app.
- Order updates sent automaticallyConfirmed, packed, on the way and delivered, sent by push with SMS as a fallback.
- Offers to chosen segmentsAn offer sent to one segment, like weekly shoppers in Kilimani, not to everyone.
- Scheduled sendsWrite a campaign now and send it at the hour customers usually order.
- SMS when a push failsIf a push is not delivered, the message goes by SMS instead.
- WhatsApp templatesApproved WhatsApp templates for offers and reminders, with an order button.
- Opens and orders per messageEach campaign shows deliveries, opens and the orders placed within 24 hours.
- A/B testsTwo versions of a message tried on small groups first, then the better one sent to the rest.
- Quiet hours and limitsNo messages at night, and a cap on how many offers a customer gets in a week.
Payments
M-Pesa and card payments matched to orders, refunds and rider cash.
- M-Pesa STK push at checkoutThe customer confirms with their M-Pesa PIN and the order goes through, built on Daraja.
- Card paymentsVisa and Mastercard in the app, with saved cards for repeat buyers.
- Payments matched to ordersEach payment matched to its order automatically, with the unmatched ones listed.
- Refunds to M-PesaRefunds for missing items or cancelled orders sent back to the customer's M-Pesa.
- Cash on deliveryCash tracked per rider until it is handed in at the hub.
- Daily settlement reportWhat came in by M-Pesa, card and cash, and what reached the bank.
- Wallet and creditReferral credit, vouchers and refunds kept as app credit if the customer prefers.
- eTIMS receiptsA KRA eTIMS receipt for each order, sent with the order confirmation.
App releases
New versions of the customer and rider apps, from store review to full rollout, with crashes and ratings.
- Customer and rider appsiOS and Android versions of both apps tracked in one place.
- Staged rolloutA new version goes to 10%, then 50%, then everyone, and can be paused.
- Store review statusWhere each version is in App Store and Play Store review.
- Crash reportsCrash-free sessions per version, with the phone models that crash most.
- Forced updatesVersions that are too old are asked to update before they can order.
- Release notesWhat changed in each version, written once for both stores.
- Ratings and reviewsStore ratings per version, and replies to reviews from one screen.
- Test buildsTest versions for your team on their own phones before the stores see them.
Custom built, not off the shelf. Every system we build is made to fit the client's needs: the modules, screens, wording and reports follow how your organisation works. The business, names and figures in this demo are examples.
Plan your app.
- A fixed-scope plan and price within 24 hours
- Live in 21 working days, then hosted and supported by us
- Built around how you work, not squeezed into a template
Your answers go straight to the people who build it.
Every order, live.
Every order placed in the app, from checkout to the customer's door.
- Live order board
- Picking lists for the hub
- Substitutions by the customer
Riders routed, proof on the phone.
Riders and field teams on the map, with every drop and visit proved.
- Live location during deliveries
- Rider app
- Photo, signature or code
M-Pesa, built in.
M-Pesa and card payments matched to orders, refunds and rider cash.
- M-Pesa STK push at checkout
- Card payments
- Payments matched to orders
Built by us, in use today.
Peni Africa and Uwitu run on platforms we built and host. We also build, host and support our own products, including DaimaFund for chama banking and MoyoMatch for matchmaking, so we know what it takes to keep an app running long after launch.
In the stores in 21 working days.
- 01Days 1 to 3
Map the journeys
What customers, riders and your team each need to do, and what the app must connect to.
- 02Days 4 to 7
Design and click through
Screens designed for both platforms, then a clickable prototype tested with real users.
- 03Days 8 to 19
Build and test
App, back office and APIs built in sprints, and tested on low-cost and high-end phones.
- 04Days 20 to 21
Publish and look after it
Store listings and approval handled, then crash monitoring, updates and support.
Tools we use Flutter · React Native · Laravel APIs · Firebase · M-Pesa Daraja · Airtel Money · Expo · Google Maps
Before you ask.
Flutter, React Native or native?
For most apps, Flutter or React Native gives you iOS and Android from one codebase, which means one budget and updates that ship together. If you need heavy use of the camera, Bluetooth or other device features, we write those parts natively in Swift or Kotlin.
Will the app work without a signal?
Yes, where it matters. Screens and recent data are stored on the phone, actions taken offline are queued, and everything syncs when the connection returns.
Can customers pay with M-Pesa in the app?
Yes. We use Safaricom Daraja for STK push, so the customer confirms on their phone with their PIN. Payments are matched to the order automatically, and cards and Airtel Money can sit alongside.
Do you publish it to the App Store and Play Store?
Yes. We prepare the listings, screenshots and privacy details, take the app through review and publish every update. The apps sit in your own developer accounts, so you own them.
What does an app cost?
It depends on the screens, the back office and what it connects to. After a free scoping call you get a fixed-scope proposal in writing, so you know the price before we start.
Let's plan your app.
A free scoping call, then a fixed-scope proposal in writing.
