LA
Layby Africa.
Build log · public
Velocity, in the open

Four months. Twenty-three versions. One platform shipping.

Every change pushed to production since day one. We publish this because the platform IS the proof — talk is cheap, version history isn't. Each version below ties to real commits on the main branch and real features in the live product.

23
Versions shipped
835
Commits to main
5
Live storefronts
~6.8
Avg commits/day
v0.1.0 · Foundation

Single-tenant A&H goes live

10–11 May 2026

First commit to production. Appliance & Home gets a working layby system end-to-end: customers apply, staff approve, payments record, audit trails write.

  • Express + SQLite stack on Fly.io with automated TLS
  • Customer apply form (public) + staff admin dashboard (auth-gated)
  • Payments with multi-currency (USD + ZiG), proof-of-payment uploads
  • Product images: upload, server-side resize, full lightbox display
  • Category management with duplicate prevention
  • Audit log for every state change, CSV exports for ops
  • Bank + EcoCash payment metadata in customer comms
  • Pre-launch security hardening pass
20 commits 2 days
v0.2.0 · Public funnel

/apply opens to the public + WhatsApp comms

12–13 May 2026

The customer side gets a real face. The apply form is renamed and restructured, validations tighten, and WhatsApp template messaging is wired through Twilio for the first time.

  • Templates tab on layby detail — one-click pre-filled WhatsApp drafts for staff
  • ZimLayby marketing site + retailer waitlist capture
  • Rename /intake → /apply with root redirect
  • Apply form: products-first wizard, strict Zim mobile + national ID validation
  • Inventory: auto-reserve on approve, consume on completion, hide out-of-stock
  • Brand column on products + brand filter on apply page
  • Twilio WhatsApp wrap (later swapped for Meta direct)
22 commits 2 days
v0.3.0 · Operational depth

Email receipts, quotations, items-edit, real-customer fixes

14 May 2026

First production day with real customers exposed real edges. Crystal incident — a stuck submit produced 9 duplicates — drove a deduplication fix. Email confirmations replace WhatsApp as the reliable channel.

  • Email payment confirmations + receipts (HTML branded, plain-text fallback)
  • Edit items on an existing layby (staff-side amendment workflow)
  • Quotations feature for cash clients with optional 15% VAT breakdown
  • PDF agreement + receipt layouts with real logo, fixed pagination
  • Crystal incident fix: rapid-resubmit deduplication on /apply/submit
  • Critical: rename email module to mailer (variable-shadow 502 fix)
  • 1GB memory bump for layby + email rendering headroom
17 commits 1 day
v0.4.0 · Multi-tenant platform

Phase 2 — Sofa & Couch lands as tenant #2

17–18 May 2026

The single biggest architectural shift. A&H becomes one of many — the system becomes a true multi-tenant platform. Per-host resolution, per-tenant branding, cross-tenant reporting, unified customer accounts.

  • Phase 2: host-based tenant resolution. Strict per-tenant data isolation.
  • Sofa & Couch Centre live at sofaandcouch.zimlayby.com — different brand, catalogue, code series (SC- vs LB-), admin login
  • Platform admin portal at admin.zimlayby.com — cross-tenant view for Layby Africa ops
  • Cloudflare DNS automation: tenant onboarding auto-adds CNAME records
  • One-click "Approve & onboard" tenant from the waitlist
  • Tenant offboard flow (DB + Cloudflare DNS + filesystem cleanup)
  • Cross-tenant P0 reports: GMV chart, leaderboard, funnel, outcomes
  • Promo Planner + cross-tenant Promo Report
  • Inventory low-stock alerts at both tenant admin + platform level
  • Customer portal: unified at zimlayby.com/me (same customer, all tenants)
  • Tiered progress bars, green receipts, contextual progress hints
  • Legal pages: privacy, terms, data deletion (for Meta app review)
  • App icon builder + Meta verified WhatsApp display name
32 commits 2 days
v0.5.0 · Browse-first commerce

Public shop catalogue + Africa-level positioning

18–19 May 2026

Customers can browse before they apply. Layby Africa as a parent brand surfaces with the Atlas — the country-pipeline dashboard. Restapedic sandbox tenant lands as proof-of-concept for partner onboarding.

  • Shop catalogue: browse-before-apply with SEO-indexable product pages
  • Social proof counters + per-tenant phone mockup on the shop hero
  • Apply form: schedule dropdown (was hiding the Weekly option on narrow phones)
  • Restapedic sandbox tenant: 5 products + real brand logo + favicon extraction
  • Layby Africa Atlas: real Africa SVG map with country-pipeline pulse
  • laybyafrica.com home: live traction stats fed from the database
  • Tenant pitch landing page for the retailer waitlist
  • Platform admin: replace tenant DELETE with deactivate/reactivate
  • Fix: strip inline fill styles from Africa SVG (gradients weren't showing)
13 commits 2 days
v0.6.0 · Brand layer + agreement

Physical presence, partnership artefacts, infra readiness

20 May 2026

Polish day. Tenant agreement gets the physical-presence schedule (showroom / viewing-and-collection / pickup point tiers). Office partnership portrait ships for Steve's wall. Twilio adapter becomes env-switchable so we can route around Meta-side blocks.

  • Tenant agreement: add Schedule A.2 with tiered physical-presence requirements + permitted alternatives (hosted fulfilment, 90-day transitional period)
  • Office partnership portrait — A4 poster with brand bar + PNG download via self-hosted html2canvas
  • WhatsApp service: env-switchable Meta / Twilio backend (insurance against future Meta blocks)
  • Customer change request: deposit is now editable
  • Admin: deposit editable from Edit Plan modal
  • Mobile shop: surface category + brand filters that were hidden on narrow viewports
6 commits 1 day
v0.7.0 · WhatsApp end-to-end + Restapedic deal

The night sprint — broken-to-shipping in twelve hours

21 May 2026

The single highest-velocity day. Cracked the Meta WABA mystery (templates had been failing for two months with error 141008 — turned out the env var pointed at the wrong WABA). Built the inbox, the auto-reply, the supplier-invoice workflow, the Restapedic catalogue, the shop redesign, the apply form rewrite, and got auto-deploy live — all in one focused stretch.

  • Meta WABA correctly wired — application_received, payment_received, layby_activated templates firing again after two months silent
  • Two-way WhatsApp inbox — webhook receiver with HMAC-SHA256 signature, media auto-download, auto-match to layby via regex on body
  • Payment auto-receipt with HMAC-tokenised public PDF link (30-day expiry, no portal login required)
  • Inbound auto-reply with 24h cooldown — points customers at support numbers + business address
  • Restapedic Apr 2026 catalogue — 95 SKUs across 8 ranges, both retail and Group 3 wholesale loaded for margin tracking
  • Hosted-fulfilment supplier invoices — auto-generated row on every completed layby for tenants with distributor_cost_usd populated
  • Per-tenant payment config — bank + EcoCash moved from env vars to tenants table columns
  • Apply form rewrite — returning-customer prefill, deposit promoted to hero with live "$X due today" preview, tenant-branded portal CTA
  • Shop redesigned 2026-style — killed magazine-hero, product-dense grid + category strip + announcement bar
  • LA traction stats honest funnel — "113 sign-ups · 8 active laybys · $6.8K" replaces inflated "113 customers using"
  • Restapedic-specific pitch at restapedic.zimlayby.com/pitch with worked margin examples + FAQ
  • Brand marks PNG download page at /marks for LA, Z, AH at any size
  • GitHub Actions auto-deploy — git push to main = production in ~90 seconds
  • Sprint-log portrait at /night — A4 keepsake of the build night
  • Resend application_received admin button (per layby)
  • Inbox → Record Payment one-click shortcut with auto-attached POP image
  • Enterprise security hardening pass: per-account staff lockout, Permissions-Policy, global API rate limit, MIME-validated uploads
13 commits 1 day · 12-hour focused sprint ~37 distinct features
v0.8.0 · Catalogue UX

Sold-out states, promo cap fallback, plan-step rebalance

22 May 2026

The day after the night. Customer-facing edges that surfaced once real traffic hit the new shop — sold-out items being adoptable into cart only to fail at apply, promo cap blocking sales that should fall back to regular price, and the plan-step deposit being too quiet to register.

  • SOLD OUT centre badges + low-stock corner pills on shop grid + scroll + home cards + detail page
  • Sold-out items sink to the bottom of their category, faded, add-to-cart disabled
  • Server-side TOCTOU validation at submit: live recount of reservations against open laybys
  • Promo cap reached now falls back to regular price — customer can still buy at original_price_usd, no hard block
  • Plan step UX: schedule promoted from dropdown to button cards, deposit gets the loudest treatment (20/30/50/Custom + live "$X due today")
  • Apply form: returning-customer detection extended through the full flow
  • Generic wipe-customers-by-name script (saved the day on a "Ron" substring near-miss)
  • Inbox: Unknown-sender now shows the linked customer name + "(via different #)" hint
12 commits 1 day
v0.9.0 · Storefronts & marketplace

Beds + Horizon go live, a cross-store marketplace, the diaspora unlock

23–25 May 2026

Two new storefronts land — Beds (full KDV mattress catalogue) and Horizon Solar. A cross-tenant marketplace surfaces every store in one place, the two-way WhatsApp inbox arrives on the layby detail page, and the apply form opens to the diaspora.

  • Beds by A&H live — full KDV catalogue with real photos, brand chips, instalment-first apply, beds-specific branding
  • Horizon Solar Systems onboarded as a live storefront with full catalogue + flyer-style dark hero
  • marketplace.zimlayby.com — cross-tenant discovery surfacing every store in one place
  • Two-way WhatsApp inbox on the layby detail page — reply to customers from the conversation thread
  • Diaspora unlock — apply form now accepts international phone numbers + passport IDs
  • Passwordless magic-link portal sign-in (replaces the weak default PIN)
  • Every WhatsApp send persisted + Meta delivery callbacks captured; admin alert when the WABA is blocked
  • Tenant-aware emails (each store sends from its own identity); inbox scoped per tenant
  • Sprint-log build journal that auto-generates from git on every deploy
45 commits 3 days
v0.10.0 · AI proof-of-payment

POP auto-detection — the AI that reads payments and activates laybys

26 May 2026

The platform's standout capability. An inbound WhatsApp payment screenshot is read by a vision model, matched to the right layby, and — when it's safe — activates it automatically. Zero staff touch on the happy path, with hard safety gates on everything else.

  • Vision extractor reads amount, reference, date, sender + recipient off a payment screenshot and pre-fills the Record Payment modal
  • Phase 2 auto-activation — safe matches go live end-to-end: customer paid, layby active, receipt sent, no staff touch
  • Decision engine + safety gates — recipient name must match, deposit-shortfall blocks auto-activate, low confidence routes to a human verification queue
  • Google Gemini as default extractor — ~45× cheaper than the first cut, same accuracy
  • Admin verification queue for everything the engine won't auto-confirm
  • Paired UX: Horizon dark-hero theming · Android floating-button + Continue-to-Plan fixes · admin laybys product/source filters + 48h promo TTL
  • Security: closed two cross-tenant data leaks (users list + inbox detail)
24 commits 1 day the AI moat
v0.11.0 · Fraud, dedup & deliverability

Hardening the POP pipeline and finally fixing WhatsApp templates

27–29 May 2026

Real proof-of-payment traffic exposed every edge — duplicate screenshots, cross-customer fraud, app-vs-SMS shots of the same transaction. All closed. In parallel, the two-month WhatsApp template saga gets resolved.

  • Cross-customer fraud detection — the same screenshot from two customers is a fraud signal → admin alert
  • Reference + fingerprint dedup — catches the same transaction sent twice, including app + SMS screenshots
  • Duplicate POPs now notify the customer + write an audit trail (no more silent skips)
  • POP safety-net sweeper — re-discovers any proof the live pipeline dropped
  • Combined layby_welcome template — one greeting carrying summary + pay details + support; auto-retry on transient 131042 errors
  • Kill switch on the payment_instructions auto-fire that was causing ~80% of WABA failures
  • CRITICAL: layby_activated no longer claims a deposit was paid when none was
  • Auth: stopped the global rate limiter from locking out legitimate staff sign-ins
  • "Tenant" → "Merchant" across all user-visible copy; server-side FOUC fix (logo + colours)
38 commits 3 days
v0.12.0 · Layby Africa operator layer

The parent brand gets its own console + the two-entity model

30 May – 2 Jun 2026

Layby Africa stops being just a marketing surface. A dedicated operator console, a first-party / third-party operator split, and a clean two-entity story — the infrastructure company vs the Zimbabwe marketplace.

  • Layby Africa operator console at admin.laybyafrica.com — LA-branded, host-aware, with the 1P (ZimLayby-operated) / 3P (licensee) split threaded through onboarding
  • Two-entity repositioning across the sites + pitch — Layby Africa the rails, ZimLayby the marketplace
  • Customer portal PINs hashed at rest + the last-4 backdoor retired
  • Deactivated stores redirect cleanly (tenant active-flag honored everywhere)
  • Customers can layby 2+ of the same product (shop + apply quantity controls)
  • Dashboard "who paid today" + cash-up lifted to the top of Reports
  • /team operating-map + /90-days rebuilt with the real founding team + a fintech-grade budget
  • WhatsApp Graph API bumped v17 → v21 (off the deprecated version)
20 commits 4 days
v0.13.0 · Groceries, contracts & collection

A fifth storefront, fixed-price contracts, and cross-store carts

3–7 Jun 2026

Groceries By ZimLayby lands as storefront #5. Laybys become true fixed-price contracts. The marketplace gets a unified cross-store cart, and collection logistics get real paperwork.

  • Groceries By ZimLayby live — custom trolley mark + grocery-specific shop landing with a fresh-green accent
  • Laybys lock item prices on edit — a layby is a fixed-price contract, not a live-priced basket
  • Unified cross-store marketplace cart → one combined layby across stores; in-progress basket survives a refresh
  • Inventory now reserves stock on first payment (not on approval) — pending applications stop tying up stock
  • Receipt link delivered via an approved WhatsApp template (no portal login needed)
  • Layby Africa operator pitch at laybyafrica.com/pitch + one pricing model (subscription + 1.5–3%)
  • Shop 2026 storefront chrome: category search, How-it-works, cleaner nav
  • Carpet image disclaimers (Sofa & Couch) on grid, detail + commit step
33 commits 5 days
v0.14.0 · Conversion, reconciliation & cleanup

Fixing the funnel, paying suppliers right, trimming dead weight

8–9 Jun 2026

Pulled the live numbers and acted on them. Application activation was leaking because customers never learned how to pay — fixed by putting pay details on the success page and chasing cold applicants. Supplier reconciliation gets a real payables statement, and a deliberate pass removes dead features.

  • Apply-success now shows bank + EcoCash + reference on-page — was hidden behind a WhatsApp tap that ~47% of applicants never made. The activation fix.
  • Pending-deposit email nudges — automatically chase applicants who applied but haven't paid (Day 2 / 5 / 9)
  • Killed a WhatsApp refire storm (131042) that was burning the number's quality rating
  • Supplier Payables statement — what we owe KDV per completed layby, with collection status (reconciliation)
  • Collection Request PDF (supplier + client copy) + paperless supplier dashboard
  • Payments: editable transaction date + staff edit of payment metadata
  • Per-product minimum order quantity (MOQ) for Groceries bulk items
  • ZimLayby team task manager at tasks.zimlayby.com — per-task comments + team dashboard
  • Cleanup: removed the dead Quotations feature + stripped ~210 lines of dead Supplier-Invoice UI
18 commits 2 days
v0.15.0 · Marketplace & the chase

The marketplace becomes real + the deposit chase switches on

9–11 Jun 2026

Two days, two thrusts. The cross-store marketplace was rebuilt from a brochure into an actual marketplace — categories, search, deals, instalment framing on every card. And the full deposit-chase stack went live: cold applicants now get chased automatically on email AND WhatsApp until they pay or expire.

  • WhatsApp deposit-reminder chase is LIVE — Meta-approved template, Day 2 / 5 / 9 stages, capped per sweep; the first sweep reached 25 unpaid applicants within seconds of going live. Paired with the email nudges = the complete chase stack.
  • Marketplace rebuilt utility-first — storefront rail on top, category sidebar + cross-store search, deals strip with save-%, "from $X dep · ~$Y/mo" instalment framing on every card, one-tap "Ask on WhatsApp" per product, and an attainable-first grid (one good item from each shop, not a wall of fridges). Filtered views are shareable URLs — built for the social audience.
  • Groceries listed on the marketplace — 68 products under Groceries & Essentials, with bulk MOQ badges
  • Payonify gateway foundation merged — one shared, atomic payment-recording core now serves staff recording and the future mobile-money webhook; ships inert until gateway credentials land. The pay-by-link groundwork.
  • One person, many stores — staff emails are now unique per store, so a single teammate can run several storefronts under one address
  • All-time applications + value-applied-for tiles on every store dashboard, the platform Pulse, and tenant cards — the lifetime funnel in hard numbers
  • Team tasks grew up — dashboard landing with a self-serve "up for grabs" pool, ✋ one-tap self-allocation, task contents visible on every row, and delete locked to admins
9 commits 3 days
v0.16.0 · The mobile app

A native ZimLayby app, built and packaged — waiting on one thing

12–26 Jun 2026

Two weeks of parallel-track work: a native Flutter customer app on top of a brand-new token-authenticated mobile API. The app browses every store, shows cross-store laybys, and onboards new customers at apply time. It is built, signed and packaged — deliberately held from public launch until the payment gateway lands, so day-one users can pay in-app instead of being bounced to a bank transfer.

  • ZimLayby customer app (Flutter) — open marketplace browsing across every store, tenant brand identity on store cards, cross-store layby view, instalment pay flows
  • /api/v1 mobile API — token-authenticated endpoints for browse, apply, laybys and payments; plus cross-store /deals, /categories and unified /products powering both the app and the web marketplace
  • Apply-time onboarding — new customers sign up inside the apply flow, no separate registration step
  • Release plumbing done — signing config, release manifest, versioned builds (1.0.1+4). Launch is a switch-flip once the gateway is live.
54 commits 15 days
v0.17.0 · The hardening pass

A deliberate security & reliability sweep before the next growth push

2 Jul 2026

One focused day acting on a full system evaluation: close every cross-tenant exposure, make the money paths refuse to fail silently, and give the process itself crash discipline. Nothing here is a feature — all of it is why the features can be trusted.

  • Cross-tenant & public data-exposure gaps closed — tenant gates on every remaining route, audit feed scoped per store, spoof-proof client IP, secrets checked at boot
  • Webhooks fail closed — unverifiable payment callbacks are rejected, not trusted
  • Payment safety rails — input validation, overpayment guard, cooling-off refund path, and payment-reference dedup so the same transfer can never credit twice
  • Inventory double-consume fixed + proof-of-payment credit to closed laybys blocked
  • Crash discipline — async error boundary, process-level handlers, fetch timeouts, and reconciliation sweeps that catch anything a webhook missed
10 commits 1 day
v0.18.0 · One address, one order

The marketplace takes the apex + a whole basket becomes ONE ZimLayby order

4–6 Jul 2026

The biggest customer-experience shift since launch. zimlayby.com now IS the marketplace — and a basket spanning any of the stores checks out as a single ZimLayby order with one reference code, one deposit, one payment. The WhatsApp number got smarter about serving every store at once, and the public faces now run on live numbers.

  • Marketplace moved to the apex — zimlayby.com is the storefront now; the old brochure lives on at /about, and the old subdomain 301s home
  • Unified cross-store cart → one ZL order code — a mixed basket (groceries + a fridge + a sofa) becomes ONE order: ZL-2026-NNNN as the single payment reference, one combined deposit at each store's own rate, one confirmation page, one bundled WhatsApp welcome. Proof-of-payment reconciles the single code exactly as before — no juggling per-store codes.
  • Groceries deposits from 10% — FMCG-friendly entry deposit (26-week plans), respected inside combined marketplace orders
  • Store admin knows marketplace orders — 🛒 badge with store count, per-item store labels so mixed orders are picked from the right stockroom, and a Marketplace filter
  • Platform console Marketplace tab — read-only monitoring of every ZL order with per-store composition and deep links to where it's actioned; the merchant leaderboard now splits marketplace volume out instead of flattering one store
  • WhatsApp answers the question asked — a product-interest tap now gets the item, the right store's number and a start-layby link (was: a generic dump of unrelated laybys); and customers with laybys at several stores are asked which layby a codeless payment is for instead of the system guessing
  • laybyafrica.com runs on live numbers — landing stats wired to production data, with a completed-laybys proof point
  • Conversion Report PDF v2 — the full weekly-style report (funnel, trends, per-store commit rates) downloadable from platform reports
  • Proof discipline — POPs need a payment reference to auto-credit, and typed "I paid" claims are nudged to send the actual screenshot
28 commits 3 days
v0.19.0 · Supplier storefronts & the phone in your hand

Two new brand storefronts + the mobile web experience fixed properly

6 Jul 2026

Supplier week. Capri got a full storefront built from their real brand and range for the partnership presentation; Restapedic's store was finished to catalog standard — every line live with real photos and marketing copy. And the storefront template finally treats phones as first-class: the filter wall is gone, the overflow is gone.

  • capri.zimlayby.com — new storefront in Capri's real brand blue with the real logo and all 81 products from their official range (fridges, freezers, cookers, AC, laundry, smalls) with official photos; standalone pending the partnership, prices to follow their sheet
  • Restapedic completed — all six lines live (Lotus, Dream Wave, Opulence, Master Orthopedic, Master Sleep, Master Comfort) with real prices, catalog photography and the catalog's own marketing copy; crisp transparent logo; a marketing asset pack (textures, embroidery details, lifestyle shots) extracted for campaigns
  • Mobile shop fixed — the 50-brand filter wall is now a clean Filters drawer (wrapping chips, capped scrolling), the product grid is a tidy 2-up, and the sideways-scrolling page is gone on both mobile and desktop
  • /me portal upgrades — hero stats and pay-deposit panels, with the apex portal routing straight to the unified customer portal
22 commits 1 day
v0.20.0 · Marketplace polish & the backlog nudge

Dark mode, honest storefront copy, and the first sweep of stale applications

15–20 Jul 2026

The marketplace grew up: OS-aware dark mode at token level, a branded fallback for products without photography, and Restapedic listed alongside Beds with a working size filter. Layby Africa's public pages were rewritten marketplace-first. And the first attempt at the pending-application problem shipped — a sweep that nudges anyone sitting unactivated for more than three weeks.

  • Marketplace dark mode — implemented at the design-token level and following the OS setting, with a nav toggle, so it is one theme system rather than a second stylesheet
  • Staff-initiated payment voids — with admin approval, so a mistyped payment can be corrected by the person who made it without handing out database access
  • Tenant-correct PDF branding — receipts and statements carry the issuing store's identity, with explicit page breaks so a multi-item layby no longer runs off the page
  • Deposit-nudge backlog sweep — applications pending more than 21 days get a reminder; the first admission that approved-but-inactive was the real bottleneck
  • Public pages de-staled — atlas and revenue rewritten to lead with what is actually live
14 commits 4 days
v0.21.0 · The team runs on the platform

Task management, meetings and reminders — over WhatsApp, in the language people already use

23–25 Jul 2026

A week spent on the half of the business that is not customers. The team's work moved onto the platform: tasks with subtasks and per-person visibility, meetings with staged reminders, and capture straight from WhatsApp — message the business number in plain language and a task exists. No keywords, no syntax. Alongside it, cross-store checkout let one basket become one order across several storefronts.

  • Tasks v2 — subtasks, roles with per-person visibility, meetings, Board and Today views, an in-app Team panel that retired the fly-ssh user-management scripts
  • WhatsApp task capture — keyword-free: a tasky message becomes a task, and a message that looks tasky but is ambiguous gets coached rather than ignored
  • Staged reminders — 1 day, 1 hour and 10 minutes before a meeting; timed tasks get their own 1h/10m nudges with named-assignee confirmations
  • Cross-store checkout — one ZimLayby order (ZL series) per basket, spanning storefronts, with per-store plan rules driving deposit and duration
  • Live funding metrics — funnel, collections by month, unit economics and cohorts, served read-only over HTTPS instead of assembled by hand
27 commits 3 days
v0.22.0 · Supplier rails & storefront craft

A new supplier, photography that presents itself properly, and per-tenant supplier visibility

27–29 Jul 2026

VSC Interiors joined Sofa & Couch as a supplier, which exposed how much of the catalogue plumbing was assumed rather than built: the storefront supplier filter existed but had never had data behind it, and products.supplier was free text drifting away from the supplier table. Both were fixed properly. Product photography now gets classified and cropped rather than shown as supplied.

  • VSC Interiors onboarded — catalogue manifest, promo pricing on load, supplier-coded SKUs matching the existing convention rather than inventing a new one
  • Supplier data normalised — the free-text column resolved through the foreign key, and supplier visibility made per-tenant and off by default: furniture buyers care who made a couch, appliance buyers do not
  • Image audit — every product photo classified by how it should be presented and supplier frames cropped, with a guard so a pale unsaturated edge is read as a backdrop rather than a border to cut
  • Team traffic isolated — staff messages never enter the customer pipeline, plus a cleanup pass over historical team messages already sitting in the customer inbox
  • Live WABA health at /internal/waba-status, with 24-hour-window failures split by customer, layby and team shape
  • Till Yi integration — every store mirrored into the group's back-office
26 commits 3 days
v0.23.0 · $1 activates a layby

Removing the deposit wall — and fixing everything that assumed it was there

30–31 Jul 2026

820 approved applications had never been activated. The cause was the deposit: 20% of the purchase price, payable in one go, before anything happened. Now any first payment activates the layby and locks the price. Making that true meant changing far more than a number — the proof-of-payment floor rejected $1 as noise, the activation gate still compared against the old deposit, and the auto-reply never said how to pay.

  • First payment activates — whatever its size. The goods stay with the retailer until the balance clears, so activation costs nothing to withhold and everything to withhold
  • Deposit ladder on the apply form — fixed promotional amounts alongside the standard percentages, so the first payment stops being the wall
  • Proof-of-payment floor corrected — it was rejecting the exact amount we were asking customers to pay, silently, on 97% of the backlog
  • Unreferenced proofs recorded — tiered by amount and held provisional, with staff prompted for the reference at verification, instead of being dropped in silence
  • Payment questions answered automatically — "EcoCash details?" and "how much deposit?" get the right store's details within seconds, and a sales enquiry is routed to a person instead
  • One payment-details builder — the admin quick-send, the auto-reply and the template had drifted into three shapes of the same facts; now one, and it knows a promotion is running
  • Staff sessions survive deploys — the session store was in memory, so every release logged the team out mid-reply
25 commits 2 days
Since 30–31 Jul 2026 · not yet cut into a version

196 commits shipped after the last written release. Listed as the raw record rather than dressed up as versions that were never cut — this section disappears into the timeline above as soon as it is written up.

Week of 7 Sep 2026

Tawanda Samson on Finance & Accounts, and a changelog that keeps its own numbers honest

7–10 Sep 2026
  • Answer a question even when a greeting just used up the day's auto-reply
  • Show the assistant's draft next to the message it answers
  • Draft replies for the messages nothing else can answer — and never send them
  • Say in the terms what we actually do about delivery
  • Answer the six questions we can answer, and refuse the ones we can't
  • Answer the balance question, and stop making people read "ok"
33 commits 4 days
Week of 1 Sep 2026

Market analysis v2: SADC, Botswana and Zambia sized, Findex base restored, payment flow and risks stated

1–6 Sep 2026
  • Send customers their agreement and their portal, on WhatsApp
  • A sample cap table for the data room, honest about everything it does not know
  • Market analysis for the data room, with the review's thirteen fixes applied
  • The public deck refreshes itself, so it cannot go stale again
  • Refresh the public deck page, and stop it drifting from the PDF again
  • Refresh deck, metrics pack and structure note from one production snapshot
13 commits 4 days
Week of 24 Aug 2026

Agent commission: 3% standard, 2% Starlink, locked until 20% paid, $20 payout floor

24–29 Aug 2026
  • Close the account-takeover paths the 28 Aug audit found
  • Voids: use the in-app modals, not native dialogs
  • A place to stand for voids
  • Tell EarnLink the order, not just the running total
  • Recognise EarnLink codes, and report what customers pay
  • Lend the WhatsApp number to EarnLink, and stop logging live codes
54 commits 6 days
Week of 17 Aug 2026

Starlink kits join the marketplace: featured pin, visible search, local images

17–23 Aug 2026
  • Atlas wears the parent brand, and says layby is not an African invention
  • Remove the render-check page from the repo
  • Trend arrows sat 8px off the next number
  • Deck rebuilt on 20 Aug figures with the trend live
  • Commit rate goes in the deck, as a trend
  • Metrics pack renders correctly
38 commits 5 days
Week of 10 Aug 2026

LiveTraction integration — investor-facing live traction for Layby Africa

10–15 Aug 2026
  • Slide 4's storefront count comes from production too
  • The pitch deck can no longer go stale
  • Pitch deck figures refreshed to 15 Aug production truth
  • Marketplace visitor counting for LiveTraction — policy amended first
  • Our own EcoCash agent code was being used as the fraud dedup key
  • feat(mobile): fixed-amount deposit ladder on the Layby Plan screen
13 commits 3 days
Week of 3 Aug 2026

Points unlock 30 days after they are earned, and the hold travels with the point

3–7 Aug 2026
  • Privacy policy becomes visible on opening, and stops being three months stale
  • Every worklist chip is a door, and the console stops opening blank
  • Announcement goes via an approved template; retry mode for window failures
  • Announce script skips customers already announced
  • Referral share links, a 7-day late-add window, and two queue fixes
  • Relay: 30s for the assistant, and staff voice notes stop becoming customers
41 commits 5 days
Week of 1 Aug 2026

A deposit and an instalment are not one payment because they share an amount

1 Aug 2026
  • The same id read twice is one payment, not two
  • Clicking Reports signed the operator out of the platform console
  • Stop reminding customers to pay instalments they have already paid
4 commits 1 day
In flight

What's queued next