NahaTap Platform Design v1

South African merchant operating system for informal and small businesses, starting in Soweto. 8 Nov 2026. Status: PLANNING ONLY - no code, no sends. Existing nahatap.pages.dev is a prototype only.

0. Positioning and non-negotiables

NahaTap is the software layer behind QR and NFC merchant identification and payment experiences. A licensed payment partner (Paystack or PayFast - OPEN) processes and holds all funds. NahaTap never holds customer money. It is not a bank, not a wallet, not a payment processor: it is the merchant's till, sales book, customer book and storefront in one.

1. User journey maps

Journey A - Merchant's first day (onboarding to first sale)

Hears about NahaTap (word of mouth, stand at Maponya)→ Opens link, enters SA cellphone number→ OTP via SMS/WhatsApp→ Names business, picks category→ Adds bank details for payouts (partner KYC)→ Gets personal QR code (print or screen)→ Adds first 3 products→ First customer scans & pays→ "You made a sale" screen + SMS

Time target: under 10 minutes from link to live QR. KYC review by the partner runs in the background; the merchant can trade immediately in "verification pending" mode with a payout hold, never a payment block.

Journey B - Daily trading rhythm (existing merchant)

Opens app shell (home dashboard: today so far)→ Customer scans QR / taps NFC stand→ Customer pays on own phone→ Merchant sees Paid (only after partner confirms)→ Cash sales recorded manually in same book→ Evening: daily report (card + cash together)→ Weekly payout from partner to bank

Journey C - Repeat customer & loyalty

Customer pays→ Optional: "Get specials on WhatsApp" opt-in tick→ Customer auto-added to merchant's customer book (POPIA consent stored)→ 5th visit: loyalty reward unlocked→ Merchant sends WhatsApp special to repeat customers→ Customer returns, pays again

Journey D - Owner with staff and two stalls (later phase)

Owner adds branch (second stall)→ Invites staff member by cellphone→ Staff sell on own phones, no access to money screens→ Owner sees both branches side by side→ Owner removes staff member in one tap

2. Merchant onboarding flow (screen by screen)

#ScreenWhat happensWhy it exists / rules
1Welcome"Sell anything. Get paid on the spot." + Start buttonNo email, no password. Cellphone number is the account.
2Cellphone + OTPEnter number, receive 6-digit code by SMS (WhatsApp fallback)SA merchants live on their numbers. OTP code never shown as "verified" until server confirms.
3About your businessBusiness name, category (food, hair, clothes, airtime, other), area (Soweto township list)3 fields max. Category drives the starter catalogue template.
4Your money (partner KYC)Legal name, ID number, bank account for payouts - handed to Paystack/PayFast subaccount flowNahaTap never stores full ID or account numbers - tokenised by the partner. Clear line: "Your money goes straight from your customer to your bank. NahaTap never holds it."
5Your QR is readyPersonal QR shown big; buttons: Download, Print help, Share on WhatsAppThe "magic moment". QR works even before KYC clears (payments held by partner, not blocked).
6Add your first itemsTemplate list by category (e.g. kotas: chips, russian, cheese) with editable prices, 3 items to startA storefront with items converts; empty pages do not. Skip allowed.
7Done - home dashboard"You're open for business" + today counter at R0.00End state is the daily dashboard, not a settings page.

3. Customer payment journey (no app, no signup)

Scan QR / tap NFC→ Merchant page opens in any browser (<100 KB)→ Pick items or type amount→ Pay: card, instant EFT, Capitec Pay, SnapScan (per partner)→ "Waiting for payment" (pending, yellow)→ Partner webhook confirms→ "Paid" (green) + reference; optional WhatsApp opt-in tick
StatusShown to customerShown to merchantRule
initiatedCheckout openedNothing yetNo sale counted.
pendingYellow "Waiting for payment - do not close"Yellow "Payment pending" in sales book, not in totalsNEVER counted as money. Auto-expires after partner timeout.
paidGreen "Paid R55.00" + referenceGreen, counted in today/week totals, SMS/WhatsApp pingOnly after signed webhook from partner.
failedRed "Payment did not go through - try again"Grey failed row (kept for honesty)Never silently deleted.
reversed"Refunded"Red reversal row linked to original saleTotals adjust; audit trail kept.

4. Every screen and its purpose

MVP = build first. LATER = roadmap. Each screen has ONE main job.

ModuleScreenPurpose (one job)Phase
1. Registration & onboardingWelcomeStart account with cellphone numberMVP
OTP verifyProve number ownershipMVP
Business detailsName, category, areaMVP
Payout setup (partner KYC)Hand bank/ID details to payment partnerMVP
2. Merchant dashboardHome (Today)Today's money (card + cash), sales count, alertsMVP
Week/Month toggleSame numbers, longer windowMVP
Alerts stripPending payouts, stock lows, staff actions needing approvalLATER
3. QR/NFC identityMy QRShow, download, print-help, share merchant codeMVP
NFC tag managerLink/relink NFC stand or band to the same identity URL, mark lostLATER
4. Storefront & payment page (customer side)Merchant pageCustomer-facing page: items or amount, Pay button, WhatsApp orderMVP
Checkout (partner hosted)Card/EFT/Capitec Pay via partner's hosted pageMVP
Payment resultWaiting / Paid / Failed with honest statusMVP
5. CatalogueMy itemsList, add, edit price, hide sold-outMVP
Item photosCompressed photo per itemLATER
6. Sales bookSales listEvery sale: card (status-coloured) + manual cash, filterableMVP
Sale detailOne sale: items, status, reference, refund actionMVP
7. CustomersCustomer listRepeat customers with consent flag, visit count, last seenMVP
Customer profileOne customer's history + loyalty state + remove-my-data button (POPIA)MVP
8. LoyaltyRewards setup + customer view"Buy 5 get 1 free" style rules; stamp progressLATER
9. InventoryStock listQuantity per item, -1 on each saleLATER
Low-stock alerts"Only 3 bread left" nudgesLATER
10. WhatsApp engagementMessage builderSend a special to opted-in customers via WhatsApp deep linksLATER
Order-by-WhatsApp buttonCustomer page button prefilling an order messageMVP
11. ReportsDaily / weekly / monthly reportMoney in, top items, card vs cash, export CSV/PDFMVP (daily first)
12. Staff & branchesStaff list + inviteAdd seller (phone invite), role: seller onlyLATER
BranchesSecond stall: own QR, own book, rolled up to ownerLATER
13. Subscription & billingMy planCurrent fee model, what NahaTap took, invoicesMVP (read-only)
Plan picker% vs monthly choiceLATER OPEN
14. Support & settingsHelpFAQ + "WhatsApp us" + call-back requestMVP
SettingsLanguage, PIN, payout account status, delete my accountMVP
15. NahaTap admin (internal)Admin homeAll merchants, GMV, active stands, issuesMVP
Merchant detailKYC state, sales, payout health, suspendMVP
Partner reconciliationPartner payouts vs NahaTap ledger, mismatch queueLATER

5. Navigation and information architecture

Merchant app shell: 5 bottom tabs. Thumb-reach, one hand, icons + words (never icons alone).

TabContainsMain question it answers
1. HomeToday dashboard, alerts, daily report shortcut"How is business today?"
2. SellBig "New sale" (my QR + record cash sale), my items"How do I take money now?"
3. MoneySales book, payout status, reports"Where is my money?"
4. CustomersCustomer book, loyalty, WhatsApp specials"Who buys from me?"
5. MoreMy QR, staff, branches, plan, help, settings"Everything else."

Customer side has no navigation - one page, one scroll: items → amount → pay → result. Fewer than 3 taps to payment.

Admin (internal) has a left rail: Merchants, Money (GMV + reconciliation), Devices (QR/NFC stands), Issues (support + suspensions), Settings.

6. Screen-by-screen wireframes (key screens)

Grayscale on purpose: layout before colour. Colour directions are in section 7.

Sell anything.
Get paid on the spot.
START
Welcome
0 8 2 _ _ _
SEND CODE
VERIFY
Cellphone + OTP
Business name
Category
Area
CONTINUE
Business details
Legal name
ID number
Bank account
Your money goes straight to your bank
CONTINUE
Payout setup (partner KYC)
[ QR CODE ]
DOWNLOAD
SHARE ON WHATSAPP
My QR (magic moment)
R 412.50 TODAY
13 sales - view
DAILY REPORT
Home - Today
SHOW MY QR
Pick items
Type amount
RECORD CASH SALE
Sell - New sale
R55 PAID 10:32
R20 CASH 10:15
R80 PENDING
FILTER
Money - Sales book
PAID R55.00
REFUND
Sale detail
Sipho - 12 visits
Thandi - 8 visits
Musa - 5 visits
SEND SPECIAL
Customers
Sipho
LOYALTY: 3/5
Remove my data
Customer profile
TODAY R412.50
Card R300 - Cash R112.50
EXPORT CSV
Daily report
DEMO KOTA & GRILL
Kota R35
Chips R20
PAY NOW
WhatsApp order
Customer page (browser)
PAID R55.00
Get specials on WhatsApp [ ]
DONE
Payment result

NahaTap admin dashboard (desktop rail layout)

Left railMain panel
Merchants
Money / GMV
Devices (QR/NFC)
Issues
Settings
Admin home: total merchants, active today, GMV today/week, pending KYC queue, failed-webhook alerts, newest signups. Merchant detail: KYC state, sales history, payout health, suspend/unsuspend, impersonate-read-only for support. Money: partner payout reconciliation vs NahaTap ledger, mismatch queue. Devices: stands issued, lost/relinked tags. Issues: support tickets, POPIA deletion requests (30-day SLA).

7. Visual design system + three directions

Shared rules whatever direction he picks: system fonts only (low-data), 48px minimum tap targets, money always in tabular figures, status colour + WORD (never colour alone), one primary button per screen, 4.5:1 contrast minimum, POPIA consent always an unticked box with plain words.

Three distinct directions - he picks ONE before implementation (reply PICK A, PICK B or PICK C):

Direction A - "Mzansi Trust"

Deep green + gold on warm off-white. Feels like a stokvel meeting a modern bank: warm, established, proudly South African. Rounded corners, soft shadows, friendly. Best fit if the brand should feel like community wealth and trust first.

Direction A board

Direction B - "Kasi Energy"

Charcoal + signal orange on white. Bold, loud, street-commerce energy - the spaza wall painted bright. Heavy condensed headings, sharp edges, high contrast. Best fit if the brand should feel young, fast and unmistakably Soweto.

Direction B board

Direction C - "Clean Ledger"

Navy + teal on white, ultra-minimal. The serious fintech: thin lines, big whitespace, bank-grade calm. Best fit if the brand should feel like infrastructure that banks and partners trust above all.

Direction C board

8. Database and entity architecture

Relational (Supabase Postgres free tier or Cloudflare D1 - both free). One row per fact, soft deletes, full audit on money events. NahaTap stores NO card, ID-document or bank-account data - partner tokens only.

EntityKey fieldsRelationships / rules
merchantsid, phone (unique, OTP-verified), business_name, category, area, language, kyc_status, partner_subaccount_id, created_atHas many branches, staff, products, sales, customers. kyc_status: pending / verified / rejected.
branchesid, merchant_id, name, address, is_mainEach branch gets its own QR identity and sales book.
staffid, merchant_id, phone, name, role (owner/seller), activeSellers record sales; never see payout or plan screens.
devicesid, merchant_id, branch_id, type (qr/nfc), public_code (unique URL slug), status (active/lost/replaced)The QR/NFC identity. Public URL = /m/{public_code}. Relinking never changes sales history.
productsid, merchant_id, name, price_cents, photo_url, stock_qty, hiddenCatalogue + inventory in one; stock_qty nullable (most informal traders won't track stock at first).
salesid, merchant_id, branch_id, staff_id, channel (card/cash), status (initiated/pending/paid/failed/reversed), total_cents, partner_ref, created_at, paid_atTotals count paid only. partner_ref links to the partner webhook event.
sale_itemsid, sale_id, product_id, qty, unit_price_centsLine items; cash sales can be amount-only.
customersid, merchant_id, phone, name, consent_whatsapp (bool + timestamp), visits, last_seen_at, deleted_atPOPIA: created ONLY with consent tick; deletion request sets deleted_at and purges contact data in 30 days.
loyalty_rules / loyalty_stampsrule: id, merchant_id, buy_n, reward_text, active. stamps: id, rule_id, customer_id, count, redeemed_atSimple "buy N get reward" engine.
payment_eventsid, sale_id, partner, event_type, payload_hash, received_atImmutable webhook audit log - the source of truth for statuses.
payoutsid, merchant_id, partner, amount_cents, status, paid_atMirror of partner payouts for the Money tab.
subscriptionsid, merchant_id, model (percent/subscription), rate_bps, active_fromOPEN fee model stored per merchant so the decision can change later without rebuild.
support_ticketsid, merchant_id, type, body, status, created_atIncludes POPIA deletion requests with SLA clock.
admin_usersid, email, roleNahaTap internal team only; every admin action logged.

9. Payment partner integration journey

Merchant completes payout setup→ NahaTap creates partner subaccount (API)→ Customer pays on partner hosted checkout→ Partner splits: merchant share + NahaTap commission→ Webhook signs the result→ Sale flips pending → paid, totals update→ Partner pays out to merchant bank (their schedule)

10. Dashboards summary

DashboardAudienceTop 3 things it shows
Merchant homeTraderToday R, sales count, payout on its way
Merchant reportsTraderCard vs cash, top items, best day
NahaTap adminNahaLabsGMV, active merchants, KYC/payout issues

11. MVP versus future roadmap

PhaseScopeWhy this cut
MVP (build first)Onboarding + OTP, partner KYC handoff, My QR, customer payment page with honest statuses, catalogue (text items), sales book (card + cash), customer book with consent, order-by-WhatsApp button, daily report + CSV, plan (read-only), help/settings, admin home + merchant detailProves the loop: sign up → get QR → get paid → see your money. 5-vendor Soweto pilot runs on this alone.
Phase 2Loyalty engine, WhatsApp specials builder, week/month reports, NFC tag manager (hardware order), stock tracking + alertsAdds retention and the NFC hardware story once the loop is proven.
Phase 3Staff + branches, plan picker / subscriptions, reconciliation console, isiZulu, item photos, Lesotho rails (MoPay / M-Pesa / EcoCash)Scales beyond owner-operated single stalls and beyond Gauteng.

12. Decisions he must make (OPEN)

ChoiceOptionsDefault if he says nothing
Visual directionPICK A Mzansi Trust / PICK B Kasi Energy / PICK C Clean LedgerNo default - he must pick before implementation.
Platform fee5% vs 3% per sale5% (his earlier call)
Fee modelPercent only vs percent + R49/monthPercent only
First payment partnerPaystack vs PayFastPaystack (replies may change this)
Domainnahatap.co.za ~R119/yr vs stay on pages.devRegister at Go

Design v1, 8 Nov 2026. Planning only - no code was written, pushed or sent for this deliverable. Existing nahatap.pages.dev remains a prototype demo.