# Satlink Hotspot Financial Report

Reporting period: September 3, 2025 through April 7, 2026, normalized to GMT+3 / East Africa Time.

## Executive Summary

Satlink recorded **KES 163,540** in timestamped, deduplicated gross sales during the reporting period across **4,889 paid transactions**, with an average transaction value of **KES 33**. Estimated operating expenses were **KES 40,400**, producing estimated net profit of **KES 123,140** and an estimated net margin of **75.3%**. The strongest month was **2026-03** at **KES 31,580**, while the lowest active month was **2025-09** at **KES 2,160**.

The figures are directionally strong but not perfect accounting records. **46.9%** of reported revenue is high-confidence because it has transaction IDs. The remaining revenue is legacy timestamped activity without transaction IDs. There are also **492 undated paid-looking legacy transactions** worth up to **KES 26,220** if every one occurred inside this period; they are preserved in the clean dataset but excluded from period totals because assigning them to months would overstate precision.

Operationally, the dataset shows a major evolution from manual/legacy recording into transaction-ID-backed callbacks. Voucher swaps were frequent during the maintenance period and were excluded from revenue. Complimentary or unclassified unavailable vouchers remain visible as data-quality risk, not sales.

## Cleaning Methodology

- All tabs were exported from the Google Sheet into `analysis/raw/` and processed from that fixed snapshot.
- Columns were normalized to voucher, availability, phone, amount, status, timestamp, transaction id, and notes.
- Timestamps were normalized to GMT+3. Timestamped rows without transaction IDs were treated as UTC and shifted forward by 3 hours. Rows with transaction IDs were treated as already GMT+3.
- Revenue was deduplicated at transaction level. Transaction ID was the primary key; legacy rows were grouped by phone, amount, status, minute-level timestamp, and sheet.
- Rows marked `swap` were excluded from revenue.
- Undated paid-looking rows were retained and quantified, but excluded from September 3, 2025 to April 7, 2026 period totals.
- Expenses were estimated using KES 4,000 flat per month for seven ISP months, September 2025 through March 2026, and KES 400 per week for electricity prorated for partial weeks.

## Data Audit Summary

| Metric | Count |
|---|---:|
| Raw voucher rows | 6,299 |
| Rows retained in cleaned row dataset | 6,299 |
| Revenue candidate rows before dedupe | 5,775 |
| Duplicate or multi-voucher rows merged | 143 |
| Swap rows excluded from revenue | 192 |
| Available inventory rows excluded | 145 |
| Complimentary/unclassified unavailable rows | 0 |
| Paid transactions retained for period analysis | 4,889 |

## Revenue Analysis

- Gross sales volume: **KES 163,540**
- Estimated ISP expense: **KES 28,000**
- Estimated electricity expense: **KES 12,400**
- Estimated total expenses: **KES 40,400**
- Estimated net profit: **KES 123,140**
- Estimated net margin: **75.3%**
- Paid transactions: **4,889**
- Average transaction value: **KES 33**
- Revenue vouchers issued: **4,980**
- High-confidence revenue: **KES 76,640**
- Legacy medium-confidence revenue: **KES 86,900**

## Monthly Performance

| month   |   revenue |   transactions |   vouchers |   high_confidence_transactions |   isp_expense |   electricity_expense |   total_expenses |   estimated_net |   avg_transaction_value |   mom_revenue_growth_pct |   mom_transaction_growth_pct |
|:--------|----------:|---------------:|-----------:|-------------------------------:|--------------:|----------------------:|-----------------:|----------------:|------------------------:|-------------------------:|-----------------------------:|
| 2025-09 |      2160 |             72 |         72 |                              0 |          4000 |               1600    |          5600    |         -3440   |                   30    |                      0   |                          0   |
| 2025-10 |     25600 |            707 |        715 |                              0 |          4000 |               1771.43 |          5771.43 |         19828.6 |                   36.21 |                   1085.2 |                        881.9 |
| 2025-11 |     25740 |            782 |        793 |                              0 |          4000 |               1714.29 |          5714.29 |         20025.7 |                   32.92 |                      0.5 |                         10.6 |
| 2025-12 |     19570 |            603 |        642 |                              0 |          4000 |               1771.43 |          5771.43 |         13798.6 |                   32.45 |                    -24   |                        -22.9 |
| 2026-01 |     30540 |            923 |        938 |                            579 |          4000 |               1771.43 |          5771.43 |         24768.6 |                   33.09 |                     56.1 |                         53.1 |
| 2026-02 |     24840 |            752 |        762 |                            752 |          4000 |               1600    |          5600    |         19240   |                   33.03 |                    -18.7 |                        -18.5 |
| 2026-03 |     31580 |            933 |        940 |                            930 |          4000 |               1771.43 |          5771.43 |         25808.6 |                   33.85 |                     27.1 |                         24.1 |
| 2026-04 |      3510 |            117 |        118 |                            117 |             0 |                400    |           400    |          3110   |                   30    |                    -88.9 |                        -87.5 |

## Weekly Performance

Top weeks:

| week_start   |   revenue |   transactions |   vouchers |   electricity_expense |   estimated_net_after_electricity |
|:-------------|----------:|---------------:|-----------:|----------------------:|----------------------------------:|
| 2026-01-12   |      9450 |            239 |        244 |                   400 |                              9050 |
| 2026-03-16   |      7560 |            214 |        217 |                   400 |                              7160 |
| 2026-01-19   |      7200 |            240 |        243 |                   400 |                              6800 |
| 2026-02-02   |      7170 |            220 |        224 |                   400 |                              6770 |
| 2026-03-23   |      6990 |            214 |        215 |                   400 |                              6590 |

Lowest active weeks:

| week_start   |   revenue |   transactions |   vouchers |   electricity_expense |   estimated_net_after_electricity |
|:-------------|----------:|---------------:|-----------:|----------------------:|----------------------------------:|
| 2026-04-06   |       750 |             25 |         25 |                114.29 |                            635.71 |
| 2025-09-22   |       960 |             32 |         32 |                400    |                            560    |
| 2025-12-29   |      2730 |             91 |         92 |                400    |                           2330    |
| 2025-12-22   |      2880 |             96 |        104 |                400    |                           2480    |
| 2025-12-15   |      3170 |            100 |        106 |                400    |                           2770    |

Full weekly table is available at `analysis/processed/weekly_performance.csv`.

## Operational Observations

- Manual and legacy operation is visible through missing timestamps, missing transaction IDs, and unavailable voucher rows without payment metadata.
- Swap rows are concentrated in later operational maintenance windows and should remain excluded from revenue.
- The most important reporting improvement is enforcing immutable transaction IDs, callback timestamps in EAT/ISO-8601, and a separate event type field for sale, free issue, manual fulfilment, and swap.

## Recommendations

1. Make M-Pesa receipt/transaction ID a required unique key for all paid voucher allocations.
2. Store all timestamps as ISO-8601 with timezone, preferably UTC plus a display conversion to EAT.
3. Split operational events into explicit types: paid sale, manual paid fulfilment, complimentary voucher, swap, inventory import, and void/refund.
4. Add a reconciliation sheet or D1 export comparing M-Pesa receipts, voucher rows, and SMS delivery.
5. Keep complimentary vouchers in a separate workflow with issuer, reason, and approval fields.
