Baltic CVM Lab Competitive pricing and retention decision intelligence · Latvia

Method and provenance

What is real, what is synthetic, and what has been withdrawn

Two data sources, kept strictly apart

SourceWhat it isUsed for
Public price lists
real
Tariffs captured from LMT, Tele2 and Bite websites. Raw HTML archived before parsing, so every figure traces to a page and a timestamp.Market pressure, personas pricing
Synthetic subscriber base
generated
12,000 subscribers with known causal structure, calibrated to published Baltic churn rates. No operator data of any kind.Retention economics, vendor plane

The synthetic base exists because individual treatment effects cannot be observed in real data — you would need a live randomised campaign running for a quarter. Here the true effect is known by construction, so the argument can be shown now and the experiment that would confirm it designed properly.

Collection conduct

robots.txtrespected
Request rate3-second delay per host, 40-page cap per run
User agentIdentifies itself and carries a contact address
ArchiveRaw HTML stored before parsing — re-parsing never re-fetches

Three rules that decide whether a comparison means anything

RuleWhy
Compare standard rates, not headlinesA promotion is a temporary position. In this market the headlines do not even rank in the same order as the standard rates — Tele2's unlimited plan promotes below its own 25 GB plan.
Test availability before comparingA “from €X” figure is not a firm rate, and an age-gated tariff is not available to someone outside the age band. Both are excluded. Without this the cheapest plan in the market is usually one restricted to schoolchildren.
Report unserved as a findingAn operator with no qualifying family plan is competitively exposed. Substituting a cheaper unrelated tariff would hide exactly that.

Modelling commitments

Risk model training setControl-group rows only — a model fitted on the whole base learns a churn rate last quarter's campaign already altered
Ground truthUsed to value campaigns, never to rank them; ranking uses model estimates throughout
Commercial assumptionsHorizon, margin, contact cost and offer depth are configuration, not constants — they are business decisions
Base calibrationEnforced in CI; a generator drifting outside published churn bands fails the build

Withdrawn claims

What is not built

GapConsequence
Multi-line pricing not extractedFamily and Connected Home personas show unserved for every operator
Evidence storeDecisions are produced but not persisted append-only, so the decision log — the asset that cannot be regenerated — does not yet exist
Lithuania and EstoniaConfigured but URLs unverified; only Latvia is live
Scheduled refreshPages are snapshots, regenerated by hand

Reproducing it

Everything is deterministic apart from the model fits, which are seeded. Collection, extraction, pricing and reporting run without any LLM and without an API key — allowance parsing is rule-based across Latvian, Lithuanian and Estonian, with the method recorded per field. 35 regression tests cover the defects this project actually shipped and then found; each cites the case that produced it.