Silicon Overdrive
Backend PRD v2 | Phase 1

Baskit PRD — Backend (Baskit Ops)

Complete API catalog and the operations console, screen by screen
References: Build Scope · Picker API Contract · Picker schema · Business plan §10
Confidential · V1.0 · 3 July 2026
Scope §03 StackScope §04 ArchitectureScope §06 APIScope §13 PaymentsPicker API Contractbaskit_picker_schema.sql

This document defines the Baskit backend: Baskit Ops, built on CodeIgniter 4 with Shield (authentication, user access, and user management), running as an Azure Container App against PostgreSQL. It is where everything talks to: both Flutter apps, the scraper, the payment gateway, and the operations team all meet here. Shield carries authentication, user access, and user management — a proven base, so the build effort goes into Baskit-specific logic rather than plumbing.

It has two halves. Section 03 is the complete API catalog (53 endpoints across two surfaces) — the contract both apps and the scraper are built against. Section 05 is the complete screen checklist — every screen, drill-down, and confirming modal. Sections 06–10 show the primary screens as mockups.

Scope §06 API specificationPicker API Contract (payload-level detail)

Every endpoint in the project. The application surface serves the customer and picker apps under JWT; the ingestion surface is scraper-only under a service key. Payload-level contracts live in the build scope Section 06 and, for the picker group, the Picker API Contract packet.

Account & identity · 7 endpoints · Customer JWT

MethodEndpointWhat the client uses it for
POST/api/v1/auth/registerCreate an account
POST/api/v1/auth/loginEmail and password login; returns JWT + refresh
POST/api/v1/auth/socialApple or Google sign-in
POST/api/v1/auth/refreshRotate the access token
GET/api/v1/meProfile and saved preferences
POST/api/v1/me/addressesManage delivery addresses (list, add, edit, remove)
POST/api/v1/me/addresses:validateConfirm an address is inside the 7 km radius

Catalog & search · 5 endpoints · Customer JWT

MethodEndpointWhat the client uses it for
GET/api/v1/catalog/aislesCategory list for the home grid
GET/api/v1/catalog/productsPaginated compact product cards (best price only)
GET/api/v1/catalog/products/{id}Full detail with per-retailer comparison
GET/api/v1/search/suggestType-ahead suggestions
GET/api/v1/dealsBest and sponsored deals for the home screen

Basket & Smart Split · 6 endpoints · Customer JWT

MethodEndpointWhat the client uses it for
GET/api/v1/basketCurrent basket, compact lines
POST/api/v1/basket/itemsAdd an item
PATCH/api/v1/basket/items/{id}Change quantity
DELETE/api/v1/basket/items/{id}Remove an item
POST/api/v1/basket/optimizeRun Smart Split; returns the split and the saving
GET/api/v1/basket/compareSplit versus single-store summary

Checkout, wallet & payments · 8 endpoints · Customer JWT · webhook signed

MethodEndpointWhat the client uses it for
GET/api/v1/checkout/delivery-windowsAvailable delivery windows
POST/api/v1/checkout/quoteFinal priced quote: fees, delivery, total
POST/api/v1/ordersPlace the order; returns order + payment intent
GET/api/v1/walletWallet balance
POST/api/v1/wallet/topupTop up the wallet through the gateway
GET/api/v1/wallet/transactionsWallet ledger view
POST/api/v1/payments/peach/intentCreate a Peach payment intent (3DS)
POST/api/v1/payments/peach/webhookGateway callback (server to server)

Orders & tracking · 4 endpoints · Customer JWT

MethodEndpointWhat the client uses it for
GET/api/v1/ordersOrder history, compact
GET/api/v1/orders/{id}Order detail with per-store legs
GET/api/v1/orders/{id}/trackingLight tracking payload for polling
POST/api/v1/orders/{id}:repeatRebuild a basket from a past order

Picker · 11 endpoints · Picker-role JWT

MethodEndpointWhat the client uses it for
PATCH/api/v1/picker/statusGo on or off duty and push current location
GET/api/v1/picker/jobsJob feed: available, active, today (compact)
POST/api/v1/picker/jobs/{id}:acceptClaim a job (claim-lock)
POST/api/v1/picker/jobs/{id}:declinePass a job
GET/api/v1/picker/jobs/{id}Job detail, items grouped by aisle
POST/api/v1/picker/jobs/{id}/items/{itemId}:pickMark an item picked
POST/api/v1/picker/jobs/{id}/items/{itemId}:substituteRecord a substitution
POST/api/v1/picker/jobs/{id}/items/{itemId}:refundRefund and skip an item
POST/api/v1/picker/jobs/{id}:spendRecord actual card spend and the receipt
POST/api/v1/picker/jobs/{id}:handoffRelease the order against the handoff code
GET/api/v1/picker/earningsEarnings summary

Platform & ads · 4 endpoints · Customer or picker JWT

MethodEndpointWhat the client uses it for
POST/api/v1/devicesRegister a push token (customer or picker)
GET/api/v1/configFee configuration and feature flags
GET/api/v1/placementsActive ad per requested slot
POST/api/v1/placements/{id}/eventsLog an impression or click

Ingestion (scraper only) · 8 endpoints · Service key, IP-restricted

MethodEndpointWhat the client uses it for
POST/ingest/v1/runsOpen an ingestion run for a retailer; returns run_id
POST/ingest/v1/products:batchUpsert a batch of normalized product records
POST/ingest/v1/prices:batchUpsert a batch of price observations
POST/ingest/v1/availability:batchUpdate in-stock status per store
POST/ingest/v1/runs/{run_id}:closeClose the run and log the full accounting
GET/ingest/v1/runsList runs with timings and volume stats (the audit log)
GET/ingest/v1/runs/{run_id}/rejectedRecords not uploaded, with the reason for each
GET/ingest/v1/products/unmatchedProducts awaiting manual equivalence mapping

The complete screen set for Baskit Ops. Every ListView clicks through to a detail; the mockups for each follow in Sections 06–11. Screens are Shield-permission gated per group.

RouteTypePurposeClick-through
/adminDashboardToday at a glance: orders, GMV, pick performance, alerts
/admin/ordersListViewAll orders with filters by status, store, and date/admin/orders/{id}
/admin/orders/{id}DetailPer-store legs, item pick states, spend versus target, handoff — the full answer to whether the picker finished
/admin/pickersListViewPicker management: duty state, picks, rating, earnings/admin/pickers/{id}
/admin/pickers/{id}DetailOne picker: jobs, shifts, earnings, prepaid card, approval
/admin/productsListViewCatalog management with search, retailer coverage, best price/admin/products/{id}
/admin/products/{id}Detail / FormEdit product, per-retailer price and availability, substitution group, tags
/admin/ingest/runsListViewScrape run log: every run with timings and volumes/admin/ingest/runs/{id}
/admin/ingest/runs/{id}DetailFull run accounting: fetched, applied, unchanged, skipped, rejected with reasons
/admin/adsListViewAd placements by slot with schedule, delivery, and status/admin/ads/{id}
/admin/ads/{id}Detail / FormPlacement editor: slot, creative, schedule, delivery, in-frame preview
/admin/reportsDashboardOrders by store and suburb, picker leaderboard, daily KPI seriesdrill-down filters
/admin/usersListView / FormConsole users, Shield groups and permissions, invitations/admin/users/{id}
/admin/settingsFormFees, delivery windows, service radius, feature flags
About the mockups: the screens below are build mockups in Silicon Overdrive CI, not captures of a running system — the console does not exist yet. They are the reference to build to; data shown is realistic sample data.

The exhaustive build checklist for the console: every list, detail, tab, form, report, and — explicitly — every confirming or ending modal behind each drill-down. A screen is not required to have a mockup to be required; when the build starts, this is the coverage list to tick off. Modules marked here that have mockups in Sections 06–11 reference them by M-number.

AUT · Console access · 4 screens

IDScreenTypeWhat it must show / do
AUT-01Sign inFormShield session login for console users
AUT-02Forgot passwordFormRequest reset link by email
AUT-03Reset passwordFormSet a new password from the link
AUT-04My profileFormOwn name, email, password change, sessions

DSH · Dashboard · 2 screens

IDScreenTypeWhat it must show / do
DSH-01DashboardDashboardToday’s KPIs, live order queue, pickers on duty; every figure clicks through to its filtered list
DSH-02Alerts drawerPanelUnreconciled runs, stuck orders, pack-by breaches, failed webhooks

CUS · Customers & beta approval · 8 screens

IDScreenTypeWhat it must show / do
CUS-01Customers listListAll accounts with status, orders, last active; filter by beta status
CUS-02Beta application queueListFounding-household applications awaiting review
CUS-03Approve / decline applicationModalConfirm decision; approval sends the invite
CUS-04Customer detailDetailProfile, addresses (radius check), preferences, devices
CUS-05Customer orders tabTabOrder history for this customer with click-through to order detail
CUS-06Customer wallet tabTabBalance and ledger; credits and adjustments
CUS-07Wallet adjustmentModalCredit or debit with reason; audit-logged
CUS-08Suspend / reactivate customerModalConfirm with reason

ORD · Orders · 12 screens

IDScreenTypeWhat it must show / do
ORD-01Orders listListEvery order; filters by status, store, date, customer
ORD-02Order detailDetailHeader, totals, Smart Split saving, per-store legs — the ‘did the picker finish’ view
ORD-03Store-leg detailDetailOne leg: picker, pack-by, item states, spend vs target, receipt, handoff
ORD-04Order item drillDetailOne line: pick event history, substitution decision, price delta
ORD-05Live tracking viewMapLegs and driver ETAs as the customer sees them
ORD-06Order timelineTabFull event audit: placed, claimed, picked, spent, handed off, delivered
ORD-07Assign / reassign pickerModalPick a picker for a leg; confirms claim transfer
ORD-08Cancel order / legModalConfirm with reason; triggers refund path
ORD-09Refund & adjustmentFormLine-level or amount refund with reason codes
ORD-10Confirm refundModalFinal confirmation showing customer impact
ORD-11Add internal noteModalOps note on the order, audit-logged
ORD-12Delivery handoff recordDetailThird-party delivery reference, driver, proof

PIK · Pickers (packagers) · 13 screens

IDScreenTypeWhat it must show / do
PIK-01Pickers listListDuty state, picks, on-time, rating, earnings
PIK-02Picker applicationsListNew pickers awaiting approval
PIK-03Approve pickerModalConfirm approval; creates picker role + card eligibility
PIK-04Picker detail — overviewDetailIdentity, status, lifetime stats, current job
PIK-05Jobs tabTabAll jobs with outcome, spend vs target, payout
PIK-06Job drillDetailOne job: item-by-item event timeline, substitutions, spend, handoff
PIK-07Shifts tabTabOn/off duty periods, hours, location trail summary
PIK-08Earnings tabTabBase, tips, batch bonuses per job; weekly totals
PIK-09Payout statementDetailPeriod statement for payroll or gig payout
PIK-10Prepaid card tabTabAssigned card, balance, till transactions vs recorded spends
PIK-11Assign / replace cardModalBind a card to the picker; confirm replacement
PIK-12Edit pickerFormContact details, store coverage, vehicle/on-foot
PIK-13Suspend / deactivate pickerModalConfirm with reason; blocks the feed

PRO · Products (catalog / PIM) · 16 screens

IDScreenTypeWhat it must show / do
PRO-01Products listListSearch, category, retailer coverage, best price, freshness, status
PRO-02Product detailDetailEverything the app reads: identity, images, tags, per-retailer prices
PRO-03Create productFormNew product with required comparison fields (size/weight)
PRO-04Edit productFormName, brand, size, category, image, tags
PRO-05Archive / restore productModalConfirm; archived items leave the app catalog
PRO-06Per-retailer prices viewTabCurrent price and availability per retailer and store
PRO-07Price history drillDetailObserved price series per retailer (30/90 days)
PRO-08Availability drillDetailIn-stock status per store with last-observed time
PRO-09Substitution group editorDetailMembers, ordering, customer-preference defaults
PRO-10Add / remove group memberModalConfirm membership change
PRO-11Equivalence mapping screenDetailSide-by-side candidate matching across retailers
PRO-12Confirm match / reject matchModalLock an equivalence or send back to unmatched
PRO-13Unmatched queueListProducts from scrape runs awaiting mapping (feeds PRO-11)
PRO-14Categories & aisles managerList + FormThe home-grid taxonomy the app shows
PRO-15Tags managerList + FormVegan, gluten-free, budget, essential and similar
PRO-16Image uploadModalUpload or replace product imagery

RUN · Scrape runs (ingestion log) · 7 screens

IDScreenTypeWhat it must show / do
RUN-01Runs listListEvery run: retailer, timings, fetched, applied, rejected, status
RUN-02Run detailDetailReconciled accounting: fetched = created + updated + unchanged + skipped + rejected
RUN-03Rejected records drillListEach rejected record with its reason
RUN-04Skipped records drillListEach skipped record with its reason
RUN-05Applied changes drillListCreated and updated records in this run (what was updated)
RUN-06Abort running runModalConfirm stop of an in-flight run
RUN-07Schedule viewDetailPer-retailer schedule of Azure Container Apps Jobs; last and next run

REP · Reports · 10 screens

IDScreenTypeWhat it must show / do
REP-01Reports homeDashboardEntry cards to every report with headline figures
REP-02Daily KPI seriesReportBusiness plan §10.2 metrics day by day
REP-03Orders by storeReportVolume and value mix across the four retailers
REP-04Orders by suburbReport + MapWhere it is ordered most inside the 7 km radius
REP-05Picker performanceReportLeaderboard: picks, on-time, substitution and refund rates, earnings
REP-06SKU performanceReportTop movers, slow movers, out-of-stock leaders
REP-07Savings reportReportHow much Smart Split is saving: per order, aggregate, and vs single-store baseline
REP-08Substitution & OOS reportReportOut-of-stock rate and substitution acceptance by store and SKU
REP-09Refunds & adjustments reportReportRefund value and rate with reason breakdown
REP-10ExportModalCSV export of any report with the active filters

PAY · Payments & reconciliation · 9 screens

IDScreenTypeWhat it must show / do
PAY-01Reconciliation queueListLegs awaiting spend-vs-charge reconciliation
PAY-02Reconciliation detailDetailReceipt image beside items, card transaction, customer charge
PAY-03Mark reconciledModalConfirm the leg balances
PAY-04Flag discrepancyModalRoute a mismatch with reason to follow-up
PAY-05Prepaid cards listListAll cards: assignment, balance, status
PAY-06Card detail & ledgerDetailLoads, till transactions, recorded spends per card
PAY-07Load fundsModalConfirm card top-up
PAY-08Customer wallet ledgerListCredits, debits, refunds across customers
PAY-09Gateway webhook logListPeach callbacks with status and payload drill

MED · Media & sponsorship (Addendum A, Tier 1) · 6 screens

IDScreenTypeWhat it must show / do
MED-01Placements listListAll placements by slot (hero, deals, search, last-minute) and status
MED-02Placement editorFormSlot, creative, product links, schedule, sponsor label
MED-03Creative previewDetailHow the placement renders in the app slot
MED-04Schedule calendarDetailBookings across slots and dates
MED-05Placement performanceReportImpressions and clicks per placement
MED-06Pause / end placementModalConfirm stop; slot returns to organic content

USR · Users & access (Shield) · 7 screens

IDScreenTypeWhat it must show / do
USR-01Console users listListAll console accounts with group and last activity
USR-02Invite userModalEmail invite into a Shield group
USR-03User detail / editFormGroup membership, status, forced sign-out
USR-04Groups & permission matrixDetailWhich group can see and do what, per module
USR-05Deactivate userModalConfirm removal of access
USR-06Audit logListEvery console mutation: who, what, when
USR-07Audit entry drillDetailBefore and after values for one change

SET · Settings · 5 screens

IDScreenTypeWhat it must show / do
SET-01Fees & service settingsFormService fee, delivery fee rules, minimums
SET-02Delivery windows editorFormWindows offered at checkout
SET-03Service radius editorMap + FormThe 7 km boundary used by address validation
SET-04Feature flagsFormToggles the app reads from /config
SET-05Retailers & stores managerList + FormParticipating stores, hours, active status

SUP · Support & issues · 3 screens

IDScreenTypeWhat it must show / do
SUP-01Issue logListOperational issues by order, picker, or run
SUP-02Issue detailDetailTimeline, linked records, resolution state
SUP-03Customer feedback listListIn-app and WhatsApp-channel feedback capture
Coverage sources: this checklist folds in the console features the business plan Section 6.4 requires (customer and beta approval management, payment card assignment and reconciliation, refund and adjustment management, delivery handoff tracking, issue and feedback logs) and the Addendum A Tier 1 media placements, alongside everything already in this PRD.
ops.baskit.co.za/admin

Dashboard

18
Orders today
R 11,240
GMV today
R 624
Avg order
28%
Multi-store
94%
Picks on time
3.1%
Refund rate
Latest ordersStoresTotalStatus
#BK-2841 · T. MokoenaPnP + Sixty60R 645.89Picking
#BK-2840 · L. van WykWoolworthsR 512.40Ready
#BK-2839 · N. PetersenSixty60 + SparR 891.15Delivered
Pickers on dutyActive jobPicks today
Sipho M. On duty#BK-2841-P9
Ayesha K. On duty7
Daniel R. Off duty5
M1 — Dashboard. Today’s KPIs with the two live queues (orders in flight, pickers on duty). Every number clicks through to its filtered ListView.
ops.baskit.co.za/admin/users

Users & access

Search users…Invite user
UserShield groupLast activeStatus
Jacob · jacob@silicon...owner — full access5 min agoActive
Ops lead · ops@baskit...ops — orders, pickers, products, runs22 min agoActive
Support · help@baskit...support — orders read, refunds propose1 h agoActive
Finance · fin@baskit...finance — reconciliation, payouts, reportsYesterdayActive
New picker managerpicker-manager — pickers, cards, earningsInvitation sentPending

Groups and permissions are Shield groups; every console action checks a permission, and every change is audit-logged.

M2 — Users & access. Console accounts managed through Shield groups (owner, ops, support, finance, picker-manager) with invitation flow and audit logging.

These screens manage the people using the picker app: approval, duty, jobs, earnings, and the prepaid card. The picker detail is the console mirror of the picker app — every event the app sends (accept, pick, substitute, spend, handoff) lands here.

ops.baskit.co.za/admin/pickers

Pickers

Search…Status: AllAdd picker
PickerDutyPicks todayOn-timeRatingEarnings today
Sipho M. · ConstantiaOn duty996%4.92R 432.00Open
Ayesha K. · ConstantiaOn duty793%4.88R 356.00Open
Daniel R. · ConstantiaOff duty591%4.75R 240.00Open
New applicant · —Awaiting approvalReview
M3 — Pickers ListView. Duty state, throughput, on-time rate, rating, and earnings; approval of new pickers happens here. Open clicks through to the picker detail.
ops.baskit.co.za/admin/pickers/312
Pickers › Sipho M.

Sipho M.  On duty

312
Lifetime picks
4.92
Rating
96%
On-time
R 2,840
This week
JobsShiftsEarningsPrepaid card
JobStoreItemsOutcomeSpend vs targetPayout
#BK-2841-PPnP Constantia Village6Picking · 2/6R 50.00
#BK-2836-PPnP Constantia Village5Handed off 11:42R 204.11 / R 209.95R 48.00
#BK-2833-CSixty60 Constantia9Handed off 10:15R 371.94 / R 371.94R 62.00
#BK-2829-WWoolworths Constantia41 refund · doneR 89.98 / R 118.97R 40.00
Prepaid card
Visa •••• 4829 · assigned · balance R 1,240.55 · last till spend R 204.11 (receipt on file)
M4 — Picker detail. One picker’s jobs with outcomes and spend-versus-target per job, plus shifts, earnings, and the assigned prepaid card — the management view behind the picker app.
ops.baskit.co.za/admin/orders

Orders

Search order or customer…Status: AllStore: AllToday
OrderCustomerStoresItemsTotalPlacedStatus
#BK-2841T. MokoenaPnP + Sixty607R 645.8912:04PickingOpen
#BK-2840L. van WykWoolworths5R 512.4011:47Ready for handoffOpen
#BK-2839N. PetersenSixty60 + Spar11R 891.1511:12Delivered 12:20Open
#BK-2838B. DlaminiPnP6R 402.7510:58Delivered 11:55Open
#BK-2837S. NaidooSixty608R 566.2010:31Refund pendingOpen
M5 — Orders ListView. Every order that came in, filterable by status, store, and date; the status pill tracks the leg that is furthest behind. Open clicks through to the order detail.
ops.baskit.co.za/admin/orders/2841
Orders › #BK-2841

Order #BK-2841 · T. Mokoena  Picking

R 645.89
Charged total
2
Store legs
R 13.50
Smart Split saving
12:42
Earliest pack-by
Leg 1 · Pick n Pay Constantia Village · picker Sipho M.  Picking 2/6
ItemQtyStatePrice
Bananas 1kg1PickedR 19.99
Avocados 4 pack1Substituted → brown breadR 39.99
White Bread Loaf 700g1PendingR 18.99
Full Cream Milk 2L2PendingR 65.98
Mature Cheddar 300g1PendingR 64.99
Spend: — recorded / target R 209.95 · handoff code 4729 not yet verified
Leg 2 · Checkers Sixty60 · picker Ayesha K.  Handed off 12:31
6/6 picked · 0 substitutions · spend R 371.94 / target R 371.94 · receipt on file · handoff code verified · driver Nkosi
M6 — Order detail (click-through). Per-store legs with per-item pick states, substitutions, spend versus target, receipt, and handoff verification — this screen answers ‘did the picker finish it all’ at a glance.
ops.baskit.co.za/admin/reports

Reports

Range: Last 7 daysExport CSV
Orders by store
Checkers Sixty6042%
Pick n Pay31%
Woolworths17%
Spar10%
Orders by suburb (where it is ordered most)
Constantia61%
Bergvliet16%
Tokai13%
Plumstead edge10%
Picker leaderboard · this week
PickerPicksOn-timeSubs rateRefund rateEarnings
Sipho M.4196%8%1.2%R 2,840
Ayesha K.3693%11%2.0%R 2,410
Daniel R.2891%9%3.1%R 1,905
M7 — Reports. What the pickers were doing, what orders came in, and where it is ordered most: store mix, suburb heat, and the picker leaderboard, over the daily KPI series from the business plan.

The daily KPI series follows the business plan Section 10.2: orders placed, completed, cancelled; GMV; average order value; fees; picking and delivery time; out-of-stock rate; substitution acceptance; refund value; repeat orders; multi-store percentage; gross contribution per order.

The run log is the audit trail of the ingestion surface: every run, what was fetched, what was updated, what was not uploaded and why. The unmatched queue flows into product management, where equivalence mapping is what makes cross-retailer comparison — and therefore Smart Split — work.

ops.baskit.co.za/admin/ingest/runs

Scrape runs

Retailer: AllLast 48 h
RunRetailerStartedDurationFetchedAppliedUnchangedRejectedStatus
#R-3122Pick n Pay06:0014 m 20 s1,1809162514Closed clean
#R-3121Sixty6005:3011 m 05 s1,0438871497Closed clean
#R-3120Woolworths05:009 m 41 s742705334Closed · warnings
#R-3119Spar04:308 m 02 s611598130Closed clean
#R-3118Pick n PayYesterday 18:00312000Aborted · blocked
M8 — Scrape runs ListView. The audit log of every ingestion run: what was fetched, what was applied, what did not change, what was rejected, and how the run ended. Each row clicks through to the run detail.
ops.baskit.co.za/admin/ingest/runs/3122
Scrape runs › #R-3122

Run #R-3122 · Pick n Pay  Closed clean

06:00 → 06:14
Start → end
1,180
Fetched
14 + 902
Created + updated
251
Unchanged
9 + 4
Skipped + rejected
Reconciles: 1,180 fetched = 14 created + 902 updated + 251 unchanged + 9 skipped + 4 rejected. Anything that does not reconcile closes the run with warnings and alerts ops.
Rejected records (not uploaded) and why
RecordReason
SKU 8801 · ‘Melk Vol Room 2L’No match in equivalence map — queued for manual mapping
SKU 4417 · price R 0.00Failed validation: zero price
SKU 9905 · missing sizeFailed validation: size/weight required for comparison
SKU 7223 · duplicate in batchDuplicate key within the same batch
M9 — Run detail (click-through). The full accounting for one run: timings, the reconciled disposition of every fetched record, and the rejected list with a reason per record — what was updated and what was not, with why.
ops.baskit.co.za/admin/products

Products

Search 1,240 products…Category: AllCoverage: AllAdd product
ProductCategoryRetailersBest priceUpdatedStatus
Full Cream Milk · Clover · 2LDairy & eggs4 of 4R 32.99 · PnP12 min agoLiveOpen
White Bread Loaf · Sasko · 700gBakery4 of 4R 17.99 · Spar12 min agoLiveOpen
Krönung Instant Coffee · Jacobs · 200gPantry3 of 4R 87.99 · Sixty6025 min agoLiveOpen
Melk Vol Room · 2L1 of 406:14Unmatched — map itMap
M10 — Products ListView. The catalog the app connects to: search, retailer coverage, best price, freshness, and the unmatched queue coming out of scrape runs for manual equivalence mapping.
ops.baskit.co.za/admin/products/5512
Products › Full Cream Milk 2L

Full Cream Milk · Clover · 2L  Live

Per-retailer price & availability
RetailerPriceIn stockLast observed
Pick n PayR 32.99 bestYes12 min ago
Checkers Sixty60R 33.99Yes25 min ago
SparR 34.50Yes41 min ago
WoolworthsR 38.99Low33 min ago
Edit
Name, brand, size/weight, category, image, tags (household essential, budget) · Substitution group: Milk · full cream · 2L (4 members) · Equivalence: PnP 6001… = Sixty60 6009… = Spar 6001… = Woolies 2000…
Price history (30 d)
R 32.99 today
R 34.99 peak
R 31.99 low
M11 — Product detail (click-through / form). Everything the app’s catalog endpoints read: per-retailer price and availability, the substitution group and cross-retailer equivalence mapping, tags, and price history.
Addendum A — Media & Sponsorship (WS-13)Media placement framework, 1 July

The console side of the in-app media framework: manually managed Tier 1 placements across the four slots — home hero, Today’s Best Deals positions, sponsored search positions, and Last-Minute Items. The app reads these through GET /api/v1/placements and reports delivery through POST /api/v1/placements/{id}/events. Checklist coverage is the MED module (MED-01 to MED-06).

ops.baskit.co.za/admin/ads

Ads · placements

Slot: AllStatus: AllNew placement
PlacementSlotSponsorScheduleImpressionsClicksStatus
Krönung 200g launchHome · hero banner (WEBM)Jacobs1–14 Jul12,480342LiveOpen
Sasko winter promoToday’s Best Deals · position 1Sasko8–21 Jul4,11296LiveOpen
Clover milk featureSearch ‘milk’ · top positionClover15–31 JulScheduledOpen
Nulaid eggs pushBasket · Last-Minute ItemsNulaid24 Jun–7 Jul9,870201EndedOpen

Slots follow the media placement framework: home hero, Today’s Best Deals positions 1–2, sponsored search positions, and Last-Minute Items at the basket. All placements carry the Sponsored label in the app.

M12 — Ads placements ListView. Every placement by slot with schedule, delivery numbers, and status; Tier 1 is managed manually here. Open clicks through to the placement editor.
ops.baskit.co.za/admin/ads/creative-3301
Ads › Krönung 200g launch

Placement editor  Live

Placement
Slot: Home · hero banner (WEBM or animated GIF)
Sponsor: Jacobs · label: Sponsored (always shown)
Linked product: Krönung Instant Coffee 200g
Schedule: 1 Jul → 14 Jul · daily 06:00–22:00
Creative: kronung-hero.webm (2.1 MB) · fallback JPG
Delivery
Impressions vs booked12,480 / 20,000
Click-through rate2.7%
SavePauseEnd placement
Slot preview
SPONSORED
Krönung Instant Coffee — save R 22
Hero banner · WEBM autoplay, muted, 6 s loop
Shop the deal
Preview renders the creative in the app’s home hero frame before it goes live.
M13 — Placement editor (click-through). Slot, creative, sponsor label, linked product, schedule, live delivery, and an in-frame preview of the app slot — with Pause and End as the ending actions.
IDRequirementPriority
BE-01Serve every endpoint in the API catalog (Section 03) under the stated authentication for each surface.Must
BE-02Authentication and user management through Shield: customer and picker identities, console users in Shield groups (owner, ops, support, finance, picker-manager), permission checks on every console action.Must
BE-03Smart Split optimization, quotes, order placement, wallet, and Peach payment flow as specified in the build scope.Must
BE-04Picker dispatch with claim-lock, per-item pick state machine, substitutions, spend capture, handoff verification, and earnings.Must
BE-05Ingestion surface with per-run accounting that reconciles fetched = created + updated + unchanged + skipped + rejected, and a rejected-record reason log.Must
BE-06Console: Dashboard with today’s KPIs and live order and picker queues.Must
BE-07Console: Orders ListView with filters and an order detail showing per-leg, per-item pick states, spend versus target, and handoff status.Must
BE-08Console: Picker management — approval, duty state, jobs, shifts, earnings, prepaid card assignment.Must
BE-09Console: Product management — catalog CRUD, per-retailer price and availability, substitution groups, equivalence mapping, unmatched queue.Must
BE-10Console: Scrape run log ListView and run detail with full accounting and rejected reasons.Must
BE-11Console: Reports — orders by store and suburb, picker performance leaderboard, daily KPI series, CSV export.Should
BE-12Console: Settings for fees, delivery windows, service radius, and feature flags.Should
BE-13Audit log on every console mutation (who, what, when, before and after).Must
BE-14Push notification fan-out to customer and picker devices.Should
BE-15Console: Ads management — placement CRUD per slot, creative upload with preview, scheduling, sponsored labeling, pause and end actions, delivery reporting.Should