How this was built, and what it cannot tell you.
Every figure in this programme resolves to a dataset below, every dataset carries its publisher and retrieval date, and every automated data-quality finding is published — including the ones that are inconvenient.
The pipeline
raw → processed → sitescripts/ingest_cam.py scripts/fetch_filings.py · scripts/extract_financials.py scripts/ingest_products.py · scripts/normalise_products.py scripts/qc.py scripts/forecast.py scripts/build_site_data.py Data sources
retrieved 2026-08-18Communications Authority of Maldives (CAM)
| Source | https://www.cam.gov.mv/stats.htm |
| Observation period | 2012-01–2026-05 |
| Frequency | monthly |
| Retrieved | 2026-08-18 |
| Method | Scraped from CAM's per-year HTML tables. Metrics are keyed on (section, row label) rather than row order, because the row order changes between years. Values are as published; no interpolation, smoothing or revision is applied at ingestion. |
- page header reads '2025 MONTHLY FIGURES' but the file is stats_monthly2026.htm; year taken from the URL
Ooredoo Maldives Plc · Dhivehi Raajjeyge Gulhun Plc, via CMDA InformInvestor
| Source | https://informinvestor.cmda.gov.mv |
| Observation period | 2022-Q4 – 2026-Q2 (quarterly); 2021–2025 (annual) |
| Frequency | quarterly |
| Retrieved | 2026-08-18 |
| Method | Income statements parsed from the filed PDFs, keyed on line-item label. Validated by reproducing both operators' separately published full-year revenue for 2024 and 2025 to the rounded million. |
- Primary filings for the two licensed Maldives telecom operators. The portal's coverage begins in 2023; earlier years are taken from the five-year summaries inside the annual reports, which is recorded on each derived series.
Ooredoo Maldives Plc, Dhivehi Raajjeyge Gulhun Plc (Dhiraagu)
| Source | https://www.ooredoo.mv/ (sitemap-wide plan catalogue + public rate-plan endpoint) |
| Observation period | point-in-time snapshot |
| Frequency | point-in-time |
| Retrieved | 2026-08-18 |
| Method | Ooredoo's catalogue scraped from its published pages and public rate-plan endpoint; Dhiraagu's read from its rendered plan pages. Unit economics derived, with the consumption assumption stated. |
- Ooredoo publishes rate plans on its website but sells most prepaid add-on packs through its app, USSD and self-care, which are not public. Dhiraagu publishes its full prepaid pack ladder. The two catalogues are therefore not symmetric, and any 'portfolio size' comparison between them measures disclosure, not product count.
- A snapshot cannot describe a portfolio's history; no operator publishes withdrawn products or past prices.
- Headline data allowances on very short-validity packs are fair-use ceilings, not volumes a customer can consume.
Maldives Bureau of Statistics, via Nyra People programme
| Source | https://statisticsmaldives.gov.mv/ |
| Observation period | 2022–2032 |
| Frequency | annual anchors, interpolated monthly |
| Retrieved | 2026-08-18 |
| Method | Geometric interpolation between the 2022 and 2032 anchors. |
- Used only as a penetration denominator. Intercensal monthly population is a model; no official monthly series exists.
Ministry of Tourism, via the Nyra tourism pipeline
| Source | https://www.tourism.gov.mv/statistics |
| Observation period | 2009-01 – present |
| Frequency | monthly |
| Retrieved | 2026-08-18 |
| Method | Reused from the Nyra tourism programme's published artifacts. |
- Used to test whether the mobile subscription base moves with the visitor cycle. Arrivals count entries, not SIM purchases.
Source hierarchy: Tier 1 is the regulator, the operators' own filings and official statistics; Tier 2 is multilateral and industry bodies; Tier 3 is reputable press, used only for context and never as the source of a quantitative claim.
Data quality
5 warn · 4 info · 4 passThese checks run over every processed dataset on every build. Suspicious observations are flagged and retained, never silently dropped — a reader should be able to see the same problems the analysis had to work around.
cam_monthly — 4 of 173 months do not reconcile
February 2012 is the material case: the published total (508,971) is lower than its own components (538,174) and lower than both the month before and the month after, which is the signature of a transcription error in the Total row rather than a real 5% one-month collapse. The remaining breaks are small.
Action: flagged, not corrected; February 2012 is excluded from growth-rate calculations and marked on every chart that shows it
4 observations
- 2012-01: gap +3,511
- 2012-02: gap -29,203
- 2013-02: gap +2,000
- 2021-12: gap -9
cam_monthly — 9 of 173 months differ, all by 200 lines or fewer
Small residuals of ±1 to 200 lines against a base of 11,000–26,000. Consistent with rounding or single-cell typos in a hand-maintained table.
Action: left as published; regional shares are computed on the components, not the total
9 observations
- 2017-06: gap +1
- 2017-07: gap +200
- 2017-12: gap +1
- 2020-05: gap +8
- 2021-11: gap +1
- 2022-08: gap +90
- 2025-12: gap -1
- 2026-03: gap -1
- 2026-04: gap +1
operator_quarterly — the two operators' reported EBITDA are not built the same way
Adding depreciation and amortisation back to the reported operating result gives MVR 1,648m for Dhiraagu in 2025 against MVR 1,638m reported — a 0.6% difference. The same arithmetic gives MVR 1,167m for Ooredoo against MVR 1,263m reported — 8.3%. Ooredoo's reported EBITDA therefore excludes roughly MVR 96m of costs that its own income statement charges above the operating line, or is struck on a different consolidation. Comparing the two headline margins (57% and 58%) without saying so would be a like-for-unlike comparison.
Action: the site reports a consistently derived EBITDA for both operators alongside each operator's own reported figure, and never mixes the two in one comparison
2 observations
- Dhiraagu 2025: derived 1,648 vs reported 1,638 (+0.6%)
- Ooredoo 2025: derived 1,167 vs reported 1,263 (−7.6%)
products — the two catalogues are not comparable on count
Dhiraagu publishes its complete prepaid pack ladder on its website; Ooredoo publishes rate plans but sells most prepaid add-ons through its app, USSD (*929#) and self-care, which are not public. A count of published products measures disclosure practice, not portfolio breadth.
Action: product-count comparisons are not made; price comparisons are restricted to segments where both operators publish
2 observations
- Dhiraagu: 124 published products
- Ooredoo Maldives: 80 published products
products — 45 products advertise more data than the validity allows anyone to use
Dhiraagu's FLEXIHOUR 20 advertises 100GB + 25GB with one hour of validity. On the headline it costs MVR 0.20 per GB, which would make it the cheapest data sold in the Maldives by a factor of fifty. It is an unlimited hour, priced as access.
Action: a consumption-capped price per GB is computed alongside the headline one, and the cap is stated as an assumption
cam_monthly — 2 months move more than 5%
Large single-month moves in a subscription series are usually administrative (a base clean-up, a reclassification) rather than behavioural. April 2022's mobile-broadband reading is 22% below both neighbours and returns to trend the following month.
Action: retained; each is listed so a reader can judge it, and none is smoothed
2 observations
- 2012-02: -5.4%
- 2012-03: +6.1%
cam_monthly — 34 months move more than 5%
Large single-month moves in a subscription series are usually administrative (a base clean-up, a reclassification) rather than behavioural. April 2022's mobile-broadband reading is 22% below both neighbours and returns to trend the following month.
Action: retained; each is listed so a reader can judge it, and none is smoothed
34 observations
- 2012-02: -8.0%
- 2012-06: +5.6%
- 2012-08: +6.2%
- 2012-11: +7.4%
- 2012-12: -15.1%
- 2013-01: +13.7%
- 2013-05: +9.4%
- 2013-06: +6.6%
- 2013-07: +7.6%
- 2013-12: -21.0%
- 2014-01: +33.3%
- 2014-03: +11.2%
- 2014-04: +5.8%
- 2014-09: -5.7%
- 2014-10: +12.1%
- 2014-12: +14.5%
- 2015-03: +9.1%
- 2015-04: +5.7%
- 2015-07: +6.0%
- 2015-12: +6.4%
- 2016-03: +7.6%
- 2022-04: -22.0%
- 2022-05: +32.3%
- 2022-09: +10.4%
- 2022-10: +8.3%
- 2023-01: +10.8%
- 2023-02: -6.2%
- 2023-03: +16.8%
- 2023-04: +9.5%
- 2023-05: -13.0%
- 2023-06: -6.6%
- 2024-03: +14.8%
- 2024-05: +14.1%
- 2025-01: -15.5%
cam_monthly — two regime changes are visible and are handled explicitly
Mobile subscriptions peaked at 907,763 in September 2017 and then fell for four years. The 2018 decline is gradual — prepaid falls month after month while postpaid rises — so it reads as substitution, not a one-off base clean-up. The 2020 fall is abrupt and coincides with the border closure and the departure of migrant workers and tourists. Neither is a data error.
Action: the forecasting work fits from 2022 onward and reports what happens when the pre-COVID period is included instead
3 observations
- peak 2017-09: 907,763
- trough 2021-12: 706,034
- 2026-05: 839,615
products — 81 of 204 products lack a stated allowance or validity
Voice, SMS and roaming packs often state minutes rather than gigabytes, and recurring rentals have no expiry. Those products have no price-per-GB and are excluded from data-price charts rather than given a zero.
Action: excluded from the affected metric, retained everywhere else
cam_monthly — 173 consecutive months, 2012-01 to 2026-05
CAM publishes one page per year; a missing month means the page cell was blank.
Action: none required
cam_monthly — identity holds exactly in all 101 months where components are published
This is a definitional finding, not just a check. CAM's 'Broadband (Mobile)' series includes LTE fixed-wireless broadband — a household product sold on a router, not a mobile subscription. Anyone reading the headline as mobile-only data users overstates them by the LTE component (13,284 of 342,800 in December 2025).
Action: the analysis reports mobile broadband excluding LTE fixed wherever the distinction matters, and says which is being used
operator_quarterly — 30 of 30 operator-quarters reconcile to within MVR 1,000
The revenue split is the analytically valuable part of these filings and it reconciles, which is the main evidence that the extraction read the right columns.
Action: any break is listed and re-read from the filing
operator_quarterly — quarterly extraction reproduces both operators' published full-year revenue
The quarterly income statements are parsed out of PDFs; the annual reports state the year total independently. Agreement to the rounded million is the strongest available evidence that the parse is right.
Action: no adjustment
4 observations
- ooredoo 2025: quarters sum to MVR 2,216m; annual report states 2,216m
- ooredoo 2024: quarters sum to MVR 2,203m; annual report states 2,203m
- dhiraagu 2025: quarters sum to MVR 2,838m; annual report states 2,838m
- dhiraagu 2024: quarters sum to MVR 2,787m; annual report states 2,787m
Forecasting method
fit from 2022-01 · 6 origins · h=12The monthly subscription series contains two regime changes: a four-year decline from the September 2017 peak, driven by prepaid, and an abrupt fall in 2020 when the border closed and migrant workers and visitors left. Fitting a trend model across either produces a confident and wrong answer. The published models are estimated from January 2022 forward; the full-sample backtest is computed too and stored alongside, so the choice of window is visible rather than assumed. This follows the house rule on structural breaks: they are handled explicitly, never silently fitted over.
| What it does | Repeat the value from twelve months ago. |
| Why it is here | Every forecast on this site is scored against it. A model that cannot beat it does not ship. |
| What it assumes | That the series has a stable annual pattern and no trend. |
| Where it fails | Ignores trend entirely, which in a growing base means it drifts steadily low. |
| What it does | Extend the average slope of the estimation window. |
| Why it is here | It won. On every series here, over six rolling origins, it produced the lowest MASE. |
| What it assumes | That the recent trend continues and there is no meaningful seasonality left. |
| Where it fails | Cannot turn. It will be wrong at exactly the moment a turning point matters most, which is why the interval and the scenarios are shown with it. |
| What it does | Exponentially weighted level and trend. |
| Why it is here | The natural refinement of drift, weighting recent observations more heavily. |
| What it assumes | A locally linear trend with no seasonality. |
| Where it fails | On these series it added parameters without adding accuracy. |
| What it does | Level, trend and an additive seasonal component. |
| Why it is here | The standard choice for a monthly series with a season. |
| What it assumes | A stable additive annual pattern. |
| Where it fails | Subscription counts are administrative rather than seasonal; the seasonal term fits noise. It was competitive on total mobile and clearly worse on broadband. |
| What it does | Seasonal ARIMA with one seasonal difference. |
| Why it is here | Included because it is what a reader would expect to see tried. |
| What it assumes | Stationarity after differencing, and enough history to identify the parameters. |
| Where it fails | On a four-year estimation window a seasonal difference leaves very little to fit. On postpaid it diverged outright — its backtest MASE runs into the thousands. That result is published rather than hidden, because a diverging model is a finding about the data, not an embarrassment. |
Models are scored on MAE, RMSE, MAPE and MASE across a rolling origin with a twelve-month horizon. MASE is scaled by the in-sample seasonal-naive error, so below 1.0 means the model beats repeating last year's month. Prediction intervals are empirical — the 80th percentile of the model's own backtest errors at each horizon step, widened with the square root of time beyond the backtested horizon — rather than the model's parametric interval, because a model selected by backtest should report the uncertainty it actually produced. Bull and bear scenarios are not separate models: they are the base path shifted by a stated ±2 percentage points of annual growth, so the reader can see exactly which assumption creates the spread.
Definitions and derived metrics
| Metric | Definition | Basis |
|---|---|---|
| Market mobile ARPU | Both operators' mobile service revenue ÷ average CAM mobile subscriptions for the same year, expressed monthly. | Derived |
| Penetration | Mobile subscriptions ÷ interpolated resident population × 100. Exceeds 100% because of multi-SIM holding, migrant workers and visitor SIMs. | Derived |
| EBITDA (derived) | Results from operating activities + depreciation and amortisation, from the filed income statement. Computed identically for both operators. | Derived |
| EBITDA (reported) | As stated by each operator in its annual report. Not the same construction — see the data-quality finding above. | Operator |
| Price per day | Product price ÷ stated validity in days. | Derived |
| Price per GB, headline | Product price ÷ advertised data allowance. | Derived |
| Price per GB, consumption-capped | Product price ÷ min(advertised allowance, 3 GB × validity days). The cap is an analyst assumption, stated here and on every chart that uses it. | Derived, assumption |
| Mobile broadband, excl. LTE fixed | CAM's mobile broadband series less LTE fixed-wireless broadband, which is a household router product rather than a mobile subscription. | Derived |
- No market shares. The operators' customer counts and the regulator's subscription counts are different concepts, and no operator publishes its own definition.
- No churn. Not disclosed by either operator, not required by the regulator or the exchange.
- No product volumes. Which means no measured elasticity, no revenue mix by product, and no cannibalisation measurement — only frameworks with stated assumptions.
- No usage data. CAM counts subscriptions, not traffic. There is no published Maldivian series for data volume per subscriber.
- No product history. Operators publish what is on sale today. A snapshot cannot describe last year's portfolio, so the product data on this site is explicitly a point-in-time observation.
- Almost no geography. The only geographic split the regulator publishes is fixed telephone lines, Malé region against everywhere else.
Where a section needed one of these and could not have it, the site builds the framework, labels it, and names the dataset that would make it real. That is the difference between a gap and a fabrication, and it is the only defensible way to do this work from outside.