Certvas
Signal · Tender-Award Concentration v1

Who actually wins the contract.

For every country × category × month of African public procurement, how the awarded work was split across winning suppliers: the Herfindahl–Hirschman index by award value and by award count, the top supplier’s share, the effective number of competing suppliers, and the repeat-winner rate. A cell where one supplier takes most of the value month after month is the classic single-source pattern; a cell with many small winners is a genuinely contested market.

Grain: country × category × month · point-in-time (observed_at) · licence-clean OCDS (SA eTenders S007, Zambia ZPPA S043) · also via cv.signals.tender_award_concentration() and /v1/signals/certvas-tender-award-concentration-v1 · 4 provenance guarantees

Schema

Panel dictionary.

FieldTypeDescription
country / category / monthstringThe cell. category is the OCDS procurement category (goods, services, works) or unclassified; month is YYYY-MM.
award_count / tender_countintegerAwards in the cell, and the distinct tenders behind them (one tender split across several winners counts once).
supplier_countintegerDistinct winning suppliers.
new_supplier_countintegerWinners with no earlier win in the same country & category — new entrants.
supplier_hhinumberHerfindahl–Hirschman index of award counts, 0–10000 (same convention as the Procurement-Demand Signal).
supplier_hhi_valuenumberHHI of award value — the headline concentration read. Null when the cell discloses no value or mixes currencies.
effective_supplier_countnumber10000 / supplier_hhi — the numbers-equivalent: how many equally-sized suppliers this cell behaves like.
top_supplierstringThe largest winner by value (by award count where no value is disclosed), named exactly as published.
top_supplier_value_share_pctnumberIts share of the cell’s award value. Null when value is unusable (see caveats).
top_supplier_award_share_pctnumberIts share of the cell’s award count — always available.
repeat_winner_rate_pctnumberShare of awards won by suppliers that already won in a strictly earlier month of the same country & category — the incumbency read, past-only.
total_award_value / currencynumber / stringNominal as-published award value, published only for single-currency cells. MIXED cells report the flag and a null value.
value_disclosed_pctnumberShare of the cell’s awards carrying a positive value — read the value metrics against this.
award_date_coverage_pctnumberShare of awards bucketed by a real award date rather than the tender’s release month (see below).
thin_cellbooleantrue below 5 awards — mechanically concentrated, filter before reading a competition level.
observed_atdateLatest award observation in the cell — the point-in-time anchor.

Honest coverage: the SA eTenders OCDS feed publishes no award date, so month falls back to the tender’s release month — award_date_coverage_pct reports that split per cell, and the signal switches to true award dates automatically as publishers carry them. Awards are backfilled long after release, so a cell becomes knowable at observed_at, not at month-end: backtest on observed_at <= as_of. Suppliers are grouped by their published name with no normalisation or entity resolution, so name variants of one legal entity count separately — every HHI here is a lower bound on real concentration. Values are nominal, unaudited and never summed across currencies. Concentration is an evidence-gathering screen, not a finding of wrongdoing: a concentrated cell can equally reflect a specialised market, a framework agreement or one large contract.