The $0.012/athlete/month figure comes up in conversation enough that it's worth showing the math. Here's every line of the Cloudflare bill and how it scales.
The Cloudflare stack
pacelore runs entirely on Cloudflare:
- Workers — the Astro frontend and Hono API, both deployed as Workers
- D1 — SQLite-at-the-edge for all relational data (activities, athletes, segments, clubs)
- R2 — object storage for FIT files and processed activity streams
- KV — session tokens and short-lived cache
- Queues — background job processing (Strava backfill, FIT ingest)
- Workers Email — transactional email (password reset, notifications)
Workers
Workers pricing: $5/month for the Workers Paid plan, which includes 10 million requests/month. Beyond that, $0.30 per million requests.
Assume an active athlete makes 50 pageviews per day (dashboard, activity detail, PMC, segments). That's ~1,500 requests/month per athlete. At 10,000 athletes: 15 million requests/month.
Base plan: $5.00
Overage: 5M req × $0.30/M = $1.50
Total: $6.50 / month The Workers free tier (100,000 requests/day) means deployments under roughly 3,000 requests/day are literally $0. A small self-hosted instance for a running club of 50 people costs nothing.
D1
D1 pricing: $0.75 per million reads, $1.00 per million writes. Free tier: 5 million reads/day, 100,000 writes/day.
Per athlete per month:
- ~200 read queries/day (dashboard loads, feed queries, activity fetches): 6,000/month
- ~10 write queries/day (new activities, TSS updates, notification inserts): 300/month
At 10,000 athletes: 60M reads/month, 3M writes/month.
Reads: 60M × $0.75/M = $45.00
Writes: 3M × $1.00/M = $3.00
Total: $48.00 / month D1 is the largest line item. The free tier absorbs the first 150M reads/month (5M/day × 30 days), so the bill only starts here around 25,000 athletes.
R2
R2 pricing: $0.015 per GB/month stored, $4.50 per million Class A operations (writes), $0.36 per million Class B operations (reads). Free tier: 10 GB storage, 1M Class A ops/month, 10M Class B ops/month.
Each athlete has roughly 100 MB of FIT files (2 years of training, average 500KB/file × 200 activities). At 10,000 athletes: 1 TB.
Storage: 1,000 GB × $0.015 = $15.00
Class A: 10M writes × $4.50/M = $45.00 (one-time ingest cost, amortized)
Class B: 10M reads × $0.36/M = $3.60
Total (steady state): ~$18.60 / month The Class A write cost is mostly a one-time ingest cost — once a FIT file is stored, it doesn't get rewritten. In steady state, only new activity uploads contribute to Class A operations.
KV and Queues
KV: $0.50 per million reads, $1.00 per million writes. Primarily session tokens — one read per authenticated request. At 15M requests/month with ~80% authenticated: 12M KV reads = $6.00/month.
Queues: $0.40 per million operations. The Strava backfill generates roughly 2 queue messages per activity import. At 10,000 athletes × 200 activities average: 4M messages during initial backfill, then ~100K/month ongoing (new activities). Ongoing: $0.04/month.
Workers Email
Workers Email routes through Email Routing to an SMTP provider for outbound. Using Resend at $0.80 per 1,000 emails beyond the free 3,000/month. Assuming 0.5 transactional emails per athlete per month at 10,000 athletes: 5,000 emails/month → 2,000 billable → $1.60/month.
Total at 10,000 athletes
| Service | $/month |
|---|---|
| Workers | $6.50 |
| D1 | $48.00 |
| R2 (steady state) | $18.60 |
| KV | $6.00 |
| Queues | $0.04 |
| $1.60 | |
| Total | $80.74 |
$80.74 / 10,000 athletes = $0.008/athlete/month. The $0.012 figure in the headline is the more conservative estimate that includes the initial R2 ingest cost amortized over 12 months. Either way, the order of magnitude is the same.
TrainingPeaks charges $19.99/month. The infrastructure cost to serve one athlete is less than a cent. The delta is entirely margin — which is fine for a commercial product, but not a reason to exist when the alternative is free.