Billing Service — Service Risk Register
Status: populated Owner: Platform Engineering Last updated: 2026-04-18
| ID | Risk | Likelihood | Impact | Mitigation | Owner |
|---|---|---|---|---|---|
| R-BILL-01 | Missing pricing rule causes events to NAK indefinitely | Medium | High | BillingPricingNotFound alert fires immediately; ops creates rule; event replays | Engineering |
| R-BILL-02 | Duplicate billing event (NATS redelivery) causes double invoice charge | Low | High | ON CONFLICT (message_id) DO NOTHING + unique index; integration test | Engineering |
| R-BILL-03 | Overlapping pricing table effective dates | Low | High | Partial unique index prevents active row overlap; CI validation | Engineering |
| R-BILL-04 | Redis pricing cache serves stale after pricing update (60s window) | Medium | Low | 60s acceptable business tolerance; immediate DEL on pricing write | Engineering |
| R-BILL-05 | Pricing rules not configured at launch | High | High | MIGRATION_PLAN phase 1 gate: pricing_not_found alert must be 0 before phase 2 | Finance + Eng |
| R-BILL-06 | Partial first month invoice confuses customers | High | Medium | Finance briefed; invoice includes periodStart date; support FAQ | Finance |
| R-BILL-07 | S3 unavailable during invoice cron | Low | Medium | Invoice stays DRAFT; re-run next month or manual trigger; BillingS3Error alert | SRE |
| R-BILL-08 | Invoice cron runs twice concurrently (clock skew / pod restart) | Low | High | K8s CronJob concurrencyPolicy: Forbid; UNIQUE (account_id, period_start) on invoices | Engineering |
| R-BILL-09 | Negative margin undetected for extended period | Medium | Medium | BillingNegativeMargin alert; Finance reviews monthly | Finance |
| R-BILL-10 | PDF template change breaks existing invoice format | Low | Medium | Template versioning; CI snapshot test of rendered PDF structure | Engineering |
| R-BILL-11 | FX rate not applied when currencies differ | Medium | High | Current assumption: same currency; cross-currency events rejected until FX integration | Engineering |
| R-BILL-12 | Large account usage query timeout | Low | Medium | Usage query uses pre-aggregated usage_summaries; index on (account_id, bucket_hour DESC) | Engineering |