Silicon Overdrive
Client build specification · V1.0

Baskit — Phase 1
Build Scope

Constantia MVP beta. The complete engineering specification: architecture, data model, use cases, screens, and a costed work breakdown — ready for a build team to execute.
Prepared by
Silicon Overdrive
Stack
Flutter · CodeIgniter 4 · PostgreSQL · Azure
Target
150 founding households
Estimated effort
404 person-days
Constantia, Cape Town · 7 km radius · 3 July 2026
Confidential

This specification translates the Baskit MVP business plan and Phase 1 build plan into an executable engineering brief. It states what gets built, how the pieces fit, how the data is shaped, which screens are required, and what the effort is. It is written to be handed directly to a build team or an autonomous coding agent and worked up into a costed plan.

The starting position is strong. A complete visual design already exists for both the customer app and the picker app. The remaining work concentrates in three places: the services beneath the screens, one workstream that has never been designed (the operations console), and the operational wrapper around a manually run beta.

The single defining constraint

Phase 1 runs with no retailer API access. Picking and payment are performed manually in-store. Every technical and operational choice below follows from that constraint.

  • Product data is scraped and manually validated into Baskit’s own catalog
  • Baskit-operated pickers collect from the shelf
  • Two payment layers: customer → Baskit, and Baskit → retailer at the till
  • A third-party courier delivers, separate from the picker
1

Customer app

Flutter. Browse, compare prices across retailers, build one basket, Smart Split, check out, pay, and track. Fully designed.

2

Picker app

Flutter. Accept jobs, pick aisle-by-aisle, handle substitutions, bag, and hand off against a code. Fully designed.

3

Operations console

Web. Cohort approval, catalog, orders, picker assignment, reconciliation, and reporting. Net-new — designed here.

4

Core services & pipeline

CodeIgniter API, the Smart Split engine, and a scheduled Python price pipeline feeding a shared PostgreSQL database.

0
Founding households
0
Launch retailers
0
Catalog SKUs (max)
0 mo
To beta (fast-track)
LayerChoiceWhy
ClientFlutter, single monorepoTwo apps from one codebase and shared packages. The design system, money formatting, models, and API client are written once and reused across the customer and picker apps.
APICodeIgniter 4 (PHP) with Shield authThe team’s language. Handles auth, catalog, cart, orders, picker jobs, and outbound integrations comfortably. Shield provides the customer, picker, and admin roles without hand-rolled auth.
DatabaseAzure Database for PostgreSQL — Flexible ServerOne managed relational store for catalog, price history, orders, and the money ledger. Managed, never self-hosted on a VM.
Price pipelinePython, scheduled jobScraping and cross-retailer matching are their own discipline. The pipeline runs out-of-band and shares only the database with the API — never the request path.
PlatformMicrosoft AzureContainer Apps for the API and the scraper job, Blob Storage for images and receipts, Key Vault for secrets, Application Insights for observability.
Decision recorded: PostgREST is not used in Phase 1. Once a full CodeIgniter API serves the reads, PostgREST’s value largely disappears, and running both would mean two paradigms and two auth models against one database. One API surface, one auth model. PostgREST may be reconsidered later only against a specific read-scaling need.
Consequence to plan for: CodeIgniter has no equivalent of an admin-panel generator, so the operations console is genuine build work rather than a framework freebie. It is scoped as such in Section 12.
MICROSOFT AZUREFlutter appsiOS & AndroidCustomer · PickerFront Door / WAFTLS, routingContainer AppsCodeIgniter 4 APIPostgreSQLFlexible ServerBlob Storageimages, receiptsContainer Apps JobPython scraperscheduled · per-retailerOps consoleCI4 / webKey VaultsecretsContainer RegistryMonitor / App InsightsCache for Redisphase 2EXTERNAL SERVICESPeach Paymentscharge · 3DS · refundsCourier APIdispatch · trackingWhatsAppsupportPrepaid-card issuertxn feedFCM / APNspush
Azure compute Data / storage Scheduled / external— request path   ···  out-of-band

Contract-first

The REST surface is defined in OpenAPI and the Dart client is generated from it. Both Flutter apps build against a mocked backend from day one, so the app team never waits on the engine or the pipeline.

Realtime kept simple

Push notifications and polling cover order tracking and the picker job feed for 150 users. No websockets in Phase 1; Redis is deferred until a concrete need appears.

Scale is ready, not built

For a closed beta the load is minimal. The architecture is scale-ready; effort goes to reconciliation correctness and price freshness, which are the real Phase 1 risks.

accountsid (pk)role: cust|picker|adminemail, phonecreated_ataddressesid (pk)account_id (fk)geo lat/lngin_radius (bool)pickersid (pk)account_id (fk)rating, statusearnings_ytdproductsid (pk)name, brand, sizecategory, tags[]substitution_group_idretailer_pricesid (pk)product_id (fk)retailer_id (fk)price_centscaptured_at, confidenceretailers / storesid (pk)name, fulfilmentstore geodelivery_fee_centsbasketsid (pk)account_id (fk)mode: split|singlestatusordersid (pk)basket_id (fk)state (machine)estimate_centsaddress_id (fk)order_storesid (pk) = picker joborder_id (fk)retailer_id (fk)pack_by, handoff_codeorder_itemsid (pk)order_store_id (fk)product_id (fk)qty, price_centssubstitution_idledger_entriesid (pk)order_id (fk)type, amount_cents+append onlyreconciliationsid (pk)order_id (fk)card_spend_centsreceipt_cents, deltaresolution

The catalog is the spine: products carry a substitution group and tags, and retailer_prices holds a price per store with a capture timestamp and a confidence value, so the engine can down-weight stale data. A basket becomes an order, which splits into one order_store per retailer — each order_store is a picker job.

Money is deliberate. Every amount is stored as integer cents. The money trail is an append-only ledger, and a reconciliation row ties the customer charge to the prepaid-card spend and the receipt. Totals are never mutated in place; corrections are new ledger entries.

Schema-shaping decisions: the picker model (employed vs gig), the reconciliation approach, and whether Group Buy is in scope all change these tables. They must be locked before the schema is written.

Customer

  • Register, verify an address inside the 7 km radius, and be approved into the cohort
  • Search and browse a catalog with cross-retailer price comparison
  • Build one basket and see Smart Split versus a single store, with the exact saving
  • Check out with a delivery window and pay through Peach with 3DS
  • Track multi-store, multi-driver progress and confirm the saving
  • Repeat a previous basket and manage substitution preferences

Picker

  • Go on duty and see available, active, and batched same-store jobs with earnings
  • Accept a job and pick aisle-by-aisle against a checklist
  • Flag a can’t-find and resolve it: customer-preferred, ask the customer, or refund and skip
  • Bag by group (cold, fresh, bakery) and release the order against a handoff code

Operations (admin)

  • Review and approve applicants; validate the radius
  • Manage the catalog, equivalence maps, and price freshness
  • Assign pickers, monitor orders, and resolve the reconciliation queue
  • Process refunds and adjustments; read the daily KPIs

Thabo · the customer

Thabo opens Baskit to a personalized welcome and his running savings. The home screen leads with his location, a Smart Baskit nudge (“your usual basket would cost R47.20 less this week”), and the aisles. He adds coffee, milk, eggs, and bread; on each product he sees the cheapest retailer and the alternatives.

In his Baskit he toggles Smart Split. The app splits eleven items across Checkers Sixty60 and Pick n Pay, shows he saves R13.50 against buying everything at one store, and keeps one delivery. He checks out to an ASAP window, pays R645.89 through Peach, and watches two stores pack in parallel. The saving is confirmed on arrival — the emotional peak of the product.

9:41●●● 🔋
DELIVERING TO
📍 Constantia, CPT ▾
🔍  Search 30 000+ products…
You have saved this monthR 312.40
Shop by aisle
🍎
Fresh
🥛
Dairy
🍞
Bakery
🍗
Meat
SMART BASKIT
Your usual basket would cost R 47.20 less this week.
Split across PnP & Sixty60 — we will handle it.
Review my Baskit →

Browse
🔍
Search
1B🚚
Orders
👤
Profile
9:41●●● 🔋
YOUR BASKIT
R 545.89
11 items · 4 stores
You are saving R 13.50
vs buying everything at Checkers Sixty60
↗ Smart Split
Single store
60 Checkers Sixty606 items · R371.94
🥚
Free Range Eggs
save R15.00 vs Woolies
R69.99
Krönung Coffee
save R22.00 vs Woolies
R87.99
🍌
Bananas 1kg
save R6.00 vs Woolies
R18.99
Check out all →

Browse
🔍
Search
1B🚚
Orders
👤
Profile
9:41●●● 🔋
Payment
Step 2 of 2 · Secured by Peach
1BVISA
•••• •••• •••• 4829
CARDHOLDER
THABO MOKOENA
EXPIRES
08 / 28
VISA
Visa ending 4829
Standard Bank · default
Order summary
60 Checkers Sixty60 (6)R371.94
W Woolworths (1)R89.98
🔒 Pay R 645.89
🔒 Encrypted · 3DS verified
9:41●●● 🔋
Order #BK-2841
Placed 12:04 · Today
P60
● Next arrival in 18 min
P
Pick n Pay
1 item · R65.98
ETA
18 min
On the waySipho · ★4.9
60
Checkers Sixty60
6 items · R371.94
ETA
35 min
Packing your order
You saved R13.50 on this order
R31 saved this month

Browse
🔍
Search
1B🚚
Orders
👤
Profile

Sipho · the picker

9:41●●● 🔋
S
Sipho · Picker
Constantia · 4.92★ · 312 picks
● On duty
TODAY
R432.00
9 picks · 6 hrs
THIS WEEK
R2,840
+R412 vs last
SAME STORE — BATCH TOGETHER  +R12 bonus
P
PnP Constantia Village
0.6 km · 6 items · by 12:42
R50
incl. R8 tip
Accept
P
PnP Constantia Village
0.6 km · 3 items · by 12:40
R40
🛒
Jobs

Active
$
Earnings
👤
Me
9:41●●● 🔋
Pick n Pay Constantia Village
T. Mokoena · BK-2841-P · PACK BY 12:42
2 of 6 picked~7 min remaining
1 Aisle 1 · Fresh produce ✓ done
🍌
Bananas
1kg · ×1
R19.99
🥑
Avocados
Swapped → brown bread
R39.99
2 Aisle 2 · Bakery
🍞
White Bread Loaf
Can’t find?
R18.99
Next: Aisle 2 · Bakery
1 item · White Bread
Continue →
9:41●●● 🔋
🧀
Mature Cheddar
300g · Aisle 4
⚠ Not on shelf
SUGGESTED SUBSTITUTES
CUSTOMER PREF
🧀
Salted Butter
500g · R79.99
🥛
Greek Yoghurt
1kg · R49.99
Substitute & mark picked
Ask the customer
Refund — skip this item
9:41●●● 🔋
Ready for handoff
#BK-2841-P
All picked!
5 items · 1 substitute · packed in 11 min
Pack into 3 bags
Bag 1 · Cold
Milk ×2, Cheddar
INSULATED
Bag 2 · Fresh
Bananas, Avocados
KEEP UPRIGHT
Bag 3 · Bakery
Brown bread (sub)
PLACE ON TOP
HANDOFF CODE
4729
Mark handed off → finish pick

Sipho goes on duty in Constantia. He sees two same-store Pick n Pay jobs batched together with a bonus, and accepts. The active pick walks him aisle-by-aisle: bananas picked, avocados swapped to brown bread per the customer preference, white bread flagged as hard to find.

When the mature cheddar is not on the shelf, the substitution flow offers the customer-preferred alternative, or the option to ask the customer or refund and skip. He bags by group — cold, fresh, bakery — and releases the order to the driver against handoff code 4729. His earnings update in real time.

Nomsa · operations

Nomsa runs the beta from the console. She approves the morning’s applicants, checks that staples met the freshness SLA overnight, assigns the unassigned Sixty60 leg of an order, and clears the reconciliation queue — auto-refunds pass through, and one order that ran R36.40 over the estimate lands in manual review for a decision. This console is the control room the whole manual beta depends on, and it is designed in the next sections.

The customer and picker apps are fully designed and only need to be built and wired to the backend. The operations console has no prior design, so it is specified here as Baskit-styled mockups — these are the net-new screens the build must produce.

Customer & picker (designed — build to spec)

9:41●●● 🔋
1BBaskit
It’s a
big deal.
One basket across Pick n Pay, Sixty60, Spar & Woolies — Baskit always finds you the best price.
COMPARES PRICES ACROSS
Pick n Pay
Sixty60
SPAR
W
Get started
I already have an account
By continuing you accept our Terms & Privacy Policy.
9:41●●● 🔋
Pantry
SAVE R22
JACOBS
Krönung Instant Coffee
200g
BEST PRICE
R 87.99
60Checkers Sixty60
Compare across storesUpdated 12 min ago
60 Sixty60CHEAPESTR 87.99
S SparR 94.99
W WooliesR 109.99
−  1  +    Add to Baskit · R 87.99
Customer appPicker app
Splash, onboarding, sign-up, sign-inJob feed (available / active / today), earnings summary
Home, aisles, search, category, product detailJob detail, accept / decline
The Baskit (Smart Split), per-store cartsActive pick, aisle checklist, can’t-find
Checkout, payment, tracking, ordersSubstitution flow, handoff, earnings

Operations console (net-new — designed here)

ops.baskit.co.za/dashboard
Operations dashboard
Constantia MVP · live · today
37
Orders today
R24.9k
GMV today
R673
Avg order value
28%
Multi-store
OrderStoresStatusPicker
BK-2841PnP · Sixty60On the waySipho
BK-2840WooliesPickingNomvula
BK-2839Spar · PnPReconcileSipho
Out-of-stock rate
6.2%
Substitution acceptance
81%
ops.baskit.co.za/catalog
Catalog & price validation
842 of 1,200 SKUs live · staples freshness SLA: daily
ProductEquivalencePnPSixty60SparWooliesFreshness
Full Cream Milk 2Lmapped ×4R32.99R33.99R34.49R38.992h
White Bread 700gmapped ×4R18.99R19.49R17.99R22.503h
Mature Cheddar 300g1 unmatchedR64.99R59.99R74.9926h
Krönung Coffee 200gmapped ×3R99.99R87.99R94.99R109.99stale · 3d
Stale rows are flagged to the Smart Split engine and shown in-app as “estimate” until revalidated.
ops.baskit.co.za/reconciliation
Reconciliation queue
Estimate ↔ prepaid-card spend ↔ receipt · capped auto-adjust R20
OrderChargedCard spendReceiptDeltaResolution
BK-2841R645.89R643.10R643.10−R2.79Auto-refunded
BK-2836R512.00R548.40R548.40+R36.40Review — over cap
BK-2833R289.50R281.00R281.00−R8.50Auto-refunded
BK-2830R430.00receipt pendingAwaiting receipt
BK-2836 · manual review — card spend exceeded the estimate by R36.40 (2 substitutions at higher shelf price). Choose: Absorb   Charge customer   Escalate
ops.baskit.co.za/orders/BK-2841
Order BK-2841 · assignment
T. Mokoena · Constantia · ASAP window
P Pick n Pay job
1 item · pack by 12:42
Picker: Sipho · accepted
60 Sixty60 job
6 items · pack by 12:55
Picker: unassigned · offer sent
Order state
placedpaidsplitassignedpickinghandoffdeliveredreconciled

Cohort

Application review, approval, and radius validation for the 150 founding households.

Catalog & PIM

SKUs, cross-retailer equivalence, substitution groups, and price plus timestamp management.

Orders

Live orders, picker assignment, and status across the order state machine.

Reconciliation

The messy core: the estimate against the card spend and the receipt, with a capped auto-adjust and a manual review queue.

Refunds & support

Adjustments, and a combined issue, support, and feedback log.

Reporting

The daily KPIs: GMV, AOV, out-of-stock rate, substitution acceptance, multi-store share, and contribution per order.

Smart Split engine

Every savings claim in the UI depends on this. It needs a clean cross-retailer equivalence map, a current price per store with a confidence value, and delivery-fee modeling — a split only saves money if the extra delivery cost does not erase the shelf-price gap.

Objective: minimize total cost including fees, subject to a maximum number of stores. It produces both outputs the UI shows — the optimized split and the best single-store basket, and the delta between them.

Recommendation: build a deterministic v1. It does not need to be “AI” to be correct; it needs to be right and explainable, because the app shows customers the exact rands saved. Keep it as an isolated, unit-tested service class so it stays swappable.

Price / data pipeline

With no APIs, price freshness is an operational pipeline, not a feature. It underpins the engine and the trust the app promises with every “updated 12 min ago.”

  • Scraping and manual validation into the PIM on a defined cadence
  • A freshness SLA per category, surfaced honestly in the app
  • A confidence flag so the engine can down-weight old prices
  • The picker’s real shelf price is the source of truth and feeds reconciliation

Risk to name early: scraping is the activity retailers may resist. Keep the footprint modest and treat the proof pack as the route to sanctioned APIs in Phase 2.

The customer pays Baskit an estimate up front through Peach. The picker pays the real shelf price with a prepaid card. Those two numbers rarely match, so the order moves through an explicit state machine and every movement of money is a ledger entry.

placedpaidsplitassignedpickinghandoffdeliveredreconciledsubstitute / refund-skipcancelled

Reconciliation rule

Estimate, then post-shop reconciliation against the receipt. Differences within a cap auto-adjust (refund the customer or absorb a small overage); anything over the cap enters the manual review queue in the console.

Ledger discipline

Money is integer cents. The ledger is append-only. A total is never edited; a correction is a new entry. This makes every order’s money trail auditable end to end — charge, card spend, receipt, adjustment.

0
Total person-days
0
Engineering days
12
Workstreams
R1,500R4,500 / dayR9,000
Indicative total
Engineering
Timeline
~5 months
Planning-level estimates for sequencing and budgeting, not a fixed quote. Effort is the durable figure; apply your own team’s rate and refine per task as decisions lock. Silicon Overdrive does not provide financial advice.

WS1 · Foundations & DevOps BUILD

26 person-days
TaskEffort (days)
Provision Azure environment (Container Apps, PostgreSQL Flexible Server, Blob Storage, Container Registry, Key Vault, Front Door)6
CI/CD pipelines to Azure for the API, both apps, and the scraper5
Observability: Application Insights, structured logging, alerting3
Base PostgreSQL schema and migration tooling4
CodeIgniter 4 API skeleton: structure, configuration, error handling4
OpenAPI contract v1 and generated Dart client pipeline4

WS2 · Identity & Accounts BUILD

18 person-days
TaskEffort (days)
Shield authentication with customer, picker, and admin roles (JWT)6
Sign-up (two-step), sign-in, Apple and Google sign-in5
Address management and 7 km radius validation (geocoding)4
Beta cohort application and approval endpoints3

WS3 · Catalog, PIM & Price Pipeline BUILD

48 person-days
TaskEffort (days)
PIM data model: products, store availability, tags, substitution groups5
Cross-retailer equivalence mapping tooling6
Price history model with freshness and confidence values4
Python scraper framework: per-retailer adapters and scheduler12
Retailer adapter: Pick n Pay4
Retailer adapter: Checkers Sixty604
Retailer adapter: Spar4
Retailer adapter: Woolworths4
Manual price-validation tooling (surfaced in the console)5

WS4 · Smart Split Engine HARD PROBLEM

25 person-days
TaskEffort (days)
Engine v1: cost optimization over the SKU map, including delivery-fee modeling10
Best single-store basket and savings-delta computation4
Confidence and staleness down-weighting of prices3
Unit-test suite and savings-accuracy validation harness5
Engine API endpoints (optimize basket, compare)3

WS5 · Customer App (Flutter) BUILD

66 person-days
TaskEffort (days)
Shared design-system package: Baskit tokens and components6
Onboarding and authentication screens5
Home: shop-by-aisle, saved-this-month, Smart Baskit nudge, deals6
Search: type-ahead, ‘did you mean’, filters6
Category and product detail with cross-store comparison6
The Baskit view: Smart Split versus single store, grouped carts8
Per-store cart with ‘cheaper elsewhere’ prompts5
Checkout: address, delivery window, synced multi-store summary6
Payment: Peach, 3DS, saved methods5
Tracking: multi-store, multi-driver ETAs, savings confirmation6
Orders: history and repeat basket4
Push-notification integration3

WS6 · Picker App (Flutter) BUILD

31 person-days
TaskEffort (days)
Reuse of the shared design system2
Job feed: available / active / today, same-store batching, earnings6
Job detail: accept / decline, item list by aisle4
Active pick: aisle-by-aisle checklist, progress, can’t-find flagging6
Substitution flow: customer-preferred, ask-customer, refund / skip5
Handoff: bagging groups, handoff code, driver detail5
Earnings view3

WS7 · Order Orchestration & Notifications BUILD

22 person-days
TaskEffort (days)
Split a basket into per-store picker jobs5
Order state machine5
Job-assignment logic (employed core, same-store batching)4
Handoff-code lifecycle3
Notification service: push / SMS / WhatsApp events5

WS8 · Payments, Prepaid & Reconciliation HARD PROBLEM

28 person-days
TaskEffort (days)
Peach integration: charge, 3DS, refunds and adjustments6
Prepaid-card issuer integration: provisioning and transaction feed6
Append-only ledger (money stored as integer cents)5
Reconciliation engine: estimate ↔ card spend ↔ receipt6
Capped auto-adjustment and manual review queue5

WS9 · Delivery Integration BUILD

9 person-days
TaskEffort (days)
Courier integration: dispatch, live tracking, handoff-code release6
Tracking feed to the customer app3

WS10 · Admin / Operations Console DESIGN GAP

60 person-days
TaskEffort (days)
Console design in the Baskit visual language6
Application shell and authentication4
Cohort: application review, approval, radius validation4
Catalog / PIM management interface8
Price validation and freshness interface5
Order management and picker assignment6
Prepaid-card management and reconciliation queue8
Delivery handoff tracking3
Refunds and adjustments4
Issue, support, and feedback log4
Operations dashboard and KPI reporting8

WS11 · Operations (parallel, non-software) OPERATIONS

41 person-days
TaskEffort (days)
Picker recruitment and training6
Catalog build: 600–1,200 validated SKUs15
Prepaid-card procurement and reconciliation SOP4
Beta recruitment: 150 households within the radius8
Support workflow across WhatsApp / email / in-app3
Legal and POPIA groundwork for a live consumer service5

WS12 · QA, Alpha, Hardening & Launch BUILD

30 person-days
TaskEffort (days)
Test automation: API, engine, reconciliation8
Internal alpha with two pickers6
Security review and POPIA data-handling check4
Performance, UAT, and defect-fix buffer8
Beta launch and support standby4

Data and engine first, then the apps against a real backend, then integrations, then people. Durations are indicative; the point is the dependency order.

M0–M1
Foundations & decisions
Five decisions locked · PIM model · auth · catalog build begins · scraper v0
M1–M2
Core engine & console skeleton
Smart Split v1 · price pipeline v1 · console skeleton (catalog + orders)
M2–M3
Customer app
Customer app wired to backend · order orchestration · notifications
M3–M4
Picker app & integrations
Picker app wired · Peach live · courier · reconciliation tooling
M4–M5
Alpha → beta
Internal alpha (2 pickers) · harden · onboard 150 households · launch
The five pre-build decisions — picker model, reconciliation approach, launch retailer set, delivery provider, and price-freshness SLA — sit at M0. Two of them shape the schema, so they gate everything downstream.

Once the beta proves demand and produces the retailer proof pack, the build order is deliberate. Each phase unlocks the next.

OrderPhaseWhat it addsUnlocks
1FoundationHarden the MVP; resolve the employed-vs-gig picker model; decide Group Buy in or out and build its data model if in.A stable base and a settled operating model.
2FulfillmentRetailer API integrations (catalog, availability, order submission) and retailer-picker infrastructure in priority areas.Scale beyond manual picking and scraping.
3IntelligenceLive cross-retailer optimization, AI basket builder, predictive reorder, and budget or quality modes.The household grocery assistant, not just a store.
4Network effectsNational footprint, loyalty linking, and social mechanics such as Group Buy at scale.A defensible moat and category leadership.
Open scope item: Group Buy appears in the latest concept screens (a live deal, member counter, threshold, and expiry) but is absent from both the business plan and the build plan. It touches the basket and reconciliation, so it belongs to a decision at the front of Phase 2, not a late addition.
RiskImpactMitigation
Stale pricesTrustFreshness SLA, in-app confidence flag, picker shelf price as source of truth
Reconciliation errorsMarginCapped auto-adjust plus a manual review queue; a tight prepaid-card SOP
Picker supplyFulfillmentA small trained core for the beta; batch same-store jobs; keep a backup picker
Out-of-stockExperienceSubstitution flow with customer preferences; refund-skip fallback
Retailer pushback on scrapingLegal / accessModest footprint; position the proof pack toward sanctioned Phase 2 APIs
Delivery reliabilityExperienceA single vetted courier for the beta; handoff-code accountability
  • A customer can build a split basket, check out, pay, track, and receive an order end to end
  • A picker can accept, pick aisle-by-aisle, substitute, and hand off against a code
  • Every order reconciles: customer charge, prepaid-card spend, and receipt, with adjustments handled
  • Prices meet the freshness SLA across the launch catalog
  • The console can approve users, assign pickers, and read the daily KPIs
  • Support on WhatsApp is staffed and responsive
Bottom line: the apps are designed and buildable. The work that decides whether Phase 1 succeeds is the Smart Split engine, the price pipeline, and the operations console. Lock the five decisions, and those three become the real project.