Skip to content

Mutengo — Parts & Labour Price Index (Idea #4, reshaped)

Original idea: Local Price Finder — photograph a grocery item, see the cheapest price across OK, Pick n Pay, Food World, and tuckshops.
Verdict: Do not build as a standalone. Absorbed into Mota as a feature. Score 5.85, rank 3.
This document: A condensed blueprint for the reshaped version, plus the reasoning that killed the original.

Revised 2026-11-10 after discovering ZiMINDEX, ZWPRICE, DotCompare, and ZimSeek. Competition score fell from 4 to 2.


1. Why the original idea loses

Factor Assessment
At least six live competitors ZiMINDEX, DotCompare, zimpricecheck.com, shopzim.co.zw, ZimSeek, zimqoute.co.zw. The first pass found two. See §1.1.
Data decays in days Grocery prices in Zimbabwe move with exchange rate and restocking. A price from two weeks ago is actively misleading. Maintaining freshness requires continuous field effort — an operations company, not an app.
Cold start is brutal A price comparison product is worthless until it has broad coverage. Building that coverage requires either paying field agents or getting thousands of users to crowdsource before the product is useful. That's the classic chicken-and-egg that kills comparison apps.
Monetisation is weak Shops will pay to be listed first, but their willingness is low and the sales cycle is slow. Per the market analysis, commission and lead fees work — but a grocery price index doesn't generate a high-intent transactional moment.
Photo recognition is the wrong problem The proposed feature ("take a photo of a grocery item") is a computer vision problem that solves a problem the user doesn't have. Typing "cooking oil 2L" is faster and more reliable than photographing a shelf.

The insight that survives: prices are opaque in Zimbabwe, and that opacity is monetisable. The mistake was choosing groceries.


1.1 The six competitors, and why ZiMINDEX is decisive

Player What they actually do Threat level
ZiMINDEX Cost-of-living intelligence layer. Product price database with per-unit normalisation and multi-shop ranges, family baskets (25 items, US$155.23), electricity calculator by appliance, rent calculator, household planner, provincial inflation, poverty lines, statutory-fee index (traffic fines as priced products), crowdsourced contribution, ZIMSTAT sourcing. Decisive
DotCompare "Zimbabwe's live price intelligence" — fuel, USD/ZiG, groceries, data bundles, utilities, updated daily High
zimpricecheck.com Supermarket, fuel, service prices; continuously updated, commodity-level High
shopzim.co.zw Crowdsourced Harare grocery prices with community confirm/deny Medium
ZimSeek Market prices and seller listings, web and WhatsApp, crowdsourced reporting Medium
zimqoute.co.zw Grocery basket calculator and shop quoting Medium

ZiMINDEX specifically

Four of the five features I designed as differentiators in the Mota price index are already live there, executed with more data depth than a v1 could reach:

My designed differentiator ZiMINDEX status
Every price shows its date Shipped — per-item staleness (4 days ago)
Price ranges across suppliers Shipped — US$0.60 – US$0.65 · 2 shops
Crowdsourced price contribution Shipped — /contribute
Per-unit normalisation (per kg, per litre) Shipped — US$13.20/kg
Sponsored placement labelling Not observed — the one gap

It also has things I never planned for v1: ZIMSTAT-sourced inflation by province, poverty lines, and bucket-level cost modelling.

The Cloudflare failure is a demand signal. The site returns Worker exceeded resource limits on /baskets/*, /calculators/*, and parts of /plan. That is a free-tier worker limit being exceeded, which means real traffic. An incumbent failing under load is a scaling problem, not an opening. Do not build on "they're down right now."

The one gap worth noting

ZiMINDEX indexes traffic fines as priced products — statutory fees, with their S.I. reference and level. That is the same data model ZINARA licensing, insurance premiums, and roadworthy fees would need. It is a short step for them, and it is the most credible adjacent-entrant path into Car Care's deadline-and-cost territory.

But it is not a step into the service record, which is what Mota actually holds. Their engine costs baskets; it does not track a vehicle over years. That distinction is the entire reason Car Care still ranks first.


2. Why parts and labour are the right market for the same mechanic

Dimension Groceries Car parts & labour
Price variance 10–30% between supermarkets 100–400% between garages for the same job, per common reports [ESTIMATE — must validate]
Purchase frequency Weekly 2–4× per year
Transaction value US$5–50 US$80–800
Buyer knowledge Reasonable — people know what bread costs Near zero — nobody knows what CVT NS-3 fluid should cost
Anxiety Low High — a wrong decision costs hundreds
Data source Field agents or crowdsourcing Garages submit their own prices — they want to be found
Cold start Requires broad coverage to be useful Useful at 8 garages, because the question is "what's a fair price?" not "who is cheapest"
Competition Six established players None — and it is the last empty category in this market
Monetisation Listing fees from supermarkets (hard) Lead fees + subscriptions from garages (proven model)

The decisive difference: grocery prices must be collected. Garage prices are volunteered. A garage that lists "CVT NS-3 fluid service: US$180" is advertising, not contributing to a public utility. That inverts the economics from a data-collection cost centre into a customer acquisition feature.

The second decisive difference, newly evidenced: the RFQ mechanic is already proven in Zimbabwe. ZWPRICE operates a supplier-paid, buyer-free quotation marketplace across building, fuel, wholesale grocery, and farming — 26 supplier brands including PPC Cement, TotalEnergies, and Seed Co. It does not cover automotive service. But it demonstrates that Zimbabwean suppliers will join a platform that routes them qualified buyers, and that buyers will use one. That is the assumption my model depended on, and it now has evidence behind it.


2.1 What Mota must borrow from ZWPRICE

ZWPRICE's published trust model is better than what I specified. These should be adopted into Mota.

ZWPRICE practice Why it is better Mota action
Three supplier tiers: Listed (added from public info, hasn't joined) / Claimed (has an account) / Reviewed by ZWPRICE (team verified documents) Binary verified/pending loses the distinction between "we added them" and "they signed up" — which matters a lot to a consumer deciding whether to trust a listing Adopt three tiers. Change verification_status to listed / claimed / reviewed / suspended
"Suppliers see what you need and where, never your contact details" Exactly the privacy boundary I designed, independently arrived at Validated — no change
Contact released only to the supplier you choose Matches contact_released_at gate Validated — no change
"Delivery not yet quoted" is shown honestly and never counted as free; an option with a missing price is never ranked above a fully priced one Prevents the most common comparison-marketplace deception: silently treating an absent cost as zero Adopt. Directly applicable to parts-vs-labour, where one garage may quote parts only and another may quote the full job
"We are not the seller… no escrow or payment protection" stated plainly Manages expectations before disappointment, not after Adopt as the disclaimer template for the price index and garage bookings
Free for buyers, suppliers pay Same commercial shape as Mota Validated

The ranking implication: ZWPRICE is evidence that Car Care's business model works in Zimbabwe. It is also a reminder that ZWPRICE could add "a mechanic in Harare this week" to its example prompts at any time. It would not get the service record, but it would get the lead. That is why Car Care's competition score fell from 9 to 8.


3. The reshaped product

3.1 What it is

A price index inside Mota, built from partner garage submissions, that answers one question:

"I've been told I need X. Is this quote fair?"

3.2 Coverage — deliberately narrow

Included Excluded
Common service labour (oil change, brake pads, CVT fluid, clutch, suspension) Parts retail pricing (too many SKUs)
High-value consumables (CVT fluid, engine oil grades, brake fluid) Body panels, electronics, accessories
Tyres by size band Anything requiring a VIN-specific lookup
Diagnostic fees

Narrow on purpose. Ten categories done well beats a thousand done badly. The categories chosen are the ones that (a) recur, (b) have high price variance, and © map directly to a Mota reminder.

3.3 The critical design constraint

Every price displays its date. No exceptions. A price without an as_of is a lie about the present.

Price age Display
≤30 days Normal, "updated 12 Nov"
31–90 days Normal with date shown
>90 days Stale badge, sorts last, visually de-emphasised

This single rule is what separates a useful index from a misinformation engine. Zimbabwean prices can move 20% in a month; an undated price is worse than no price.


4. Requirements (delta from Mota's spec)

The full Mota spec is in 04-requirements-specification.md. These are the additions specific to the price index.

ID Requirement Priority Acceptance criterion
FR-PRI-01 Garage submits price by category in <60s M Timed: 5/5 garages complete unaided
FR-PRI-02 User searches a service and sees partner prices with dates M Every result shows as_of; no undated price can render
FR-PRI-03 Prices >90 days flagged stale and sorted last M Automated test asserts sort order
FR-PRI-04 Range (min/median/max) shown for categories with ≥3 current submissions S Range hidden below 3 — never computed from noise
FR-PRI-05 Sponsored placement visibly labelled M Label is rendered, not just in metadata
FR-PRI-06 User can submit a quote they received (unverified) S Visually distinct from partner prices — upgraded from C after ZiMINDEX proved crowdsourcing works
FR-PRI-07 Price index entry links to the garage's listing S One tap from price to garage detail
FR-PRI-08 Garage can see its own price vs the median S Shown privately, never publicly ranked
FR-PRI-09 Price completeness is explicit. A quote covering parts only must be labelled, and must never rank above a fully-priced quote M Adopted from ZWPRICE trust model. Test: a parts-only quote at US$50 never sorts above a full quote at US$120
FR-PRI-10 Garage listing tier is visible: listed / claimed / reviewed S Adopted from ZWPRICE. Tier renders on the garage detail screen
FR-PRI-11 "We are not the seller" disclaimer shown before any booking confirmation M Adopted from ZWPRICE. Rendered, not buried in T&Cs

FR-PRI-08 is the retention mechanism for garages. A garage that can see it's 30% above the median has a reason to log in, and a reason to keep its price current.

FR-PRI-09 deserves emphasis. The most common deception in comparison marketplaces is treating a missing cost as zero — a garage quotes parts only, another quotes parts plus labour, and the parts-only quote looks 40% cheaper. ZWPRICE solved this explicitly and we should copy the solution rather than rediscover the bug.


5. Data model

Reuses PART_CATEGORY and PRICE_ENTRY from 06-data-design.md, with two additions from the ZWPRICE review.

CREATE TABLE part_category (
  id           uuid PRIMARY KEY,
  key          text UNIQUE NOT NULL,      -- 'cvt_fluid_service', 'brake_pads_front'
  label        text NOT NULL,
  unit         text NOT NULL,             -- 'per_service', 'per_litre', 'per_tyre'
  service_key  text,                       -- links to the interval that triggers it
  is_active    boolean DEFAULT true
);

CREATE TABLE price_entry (
  id              uuid PRIMARY KEY,
  garage_id       uuid REFERENCES garage(id),
  category_id     uuid REFERENCES part_category(id),
  amount_usd      numeric(10,2) NOT NULL,
  coverage        text NOT NULL,          -- NEW: 'parts_only' | 'labour_only' | 'full_job'
  as_of           date NOT NULL,          -- required; no undated prices
  is_sponsored    boolean DEFAULT false,
  created_at      timestamptz DEFAULT now(),
  UNIQUE (garage_id, category_id, as_of)
);

coverage is the field that prevents the deceptive-comparison bug (FR-PRI-09). Without it, a parts-only quote and a full-job quote are indistinguishable in sort order, and the cheaper-looking one is wrong. Sort rule: full_job first, then coverage-labelled partials, each showing what is excluded.

The service_key link is what makes this a moat rather than a directory. When a reminder fires for cvt_fluid, the app can show prices for exactly that service from garages that do it. The price index and the reminder engine reinforce each other.


6. Business model

Stream Mechanics Expected
Lead conversion Price index is the top of the funnel; the booking request is the bottom Primary — the index exists to create qualified leads
Sponsored placement US$100–300/month per parts shop, max 2 per category US$200–600/mo at maturity
Subscription upsell Price submission and median comparison are Partner-tier features Drives US$40/mo conversions

The index is not a standalone revenue line. It's a demand-generation and retention feature that makes the lead business work better. Judging it on direct revenue would miss the point; it should be judged on price-index views per active user (target ≥1.5/month) and conversion from price view to booking request.

The sponsored-placement stream is now the only real gap in the incumbent's coverage. ZiMINDEX does not appear to sell placement. That is not a reason to build a whole product, but it is a reason the garage-side sponsorship model is the right monetisation for Mota's index rather than trying to compete on data breadth.


7. If it were built standalone (the rejected path)

Recorded so the decision is auditable, and so we don't revisit it without new evidence.

Requirement Assessment
Separate app No — a separate app has no distribution and no reason to be installed
Field data collection Required — would need agents or heavy crowdsourcing
Cold start 6–12 months of data collection before the product is useful
Competitive response Worse than originally assessed. Six incumbents, not two. ZiMINDEX has a 25-item basket, provincial inflation, poverty lines, and ZIMSTAT sourcing. Matching that is a year of work before the first user arrives.
Capital Meaningfully more than Mota's near-zero
Verdict Rejected. The same mechanic works better attached to a product that already has users and a monetisation path.

8. Revival criteria

Reopen the standalone grocery idea only if all of the following hold:

  1. At least four of the six competitors have stopped operating or stopped updating — not two. ZiMINDEX alone is enough to make the category unattractive.
  2. A data-collection method exists that is near-zero marginal cost (e.g. receipt OCR from users, or a retailer API partnership).
  3. Mota has reached 2,000 active users and can act as a distribution channel for a second product.

Until then, the price index lives inside Mota and the grocery version stays closed.

A note on why the bar moved. In the first pass, two competitors could plausibly both be scrappy side projects. Six competitors, one of which indexes statutory fees with legal references and has explicit data provenance, is not a scrappy field — it is an established category. The prior question "has anyone noticed this problem?" has been answered emphatically. The answer for the grocery version is: everyone noticed, and several people solved it.