Skip to content

fix(billing): retry transient Aether read failures (fixes intermittent Free-tier)#11

Merged
coopbri merged 1 commit into
masterfrom
fix/resilient-billing-reads
Jul 5, 2026
Merged

fix(billing): retry transient Aether read failures (fixes intermittent Free-tier)#11
coopbri merged 1 commit into
masterfrom
fix/resilient-billing-reads

Conversation

@coopbri

@coopbri coopbri commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Read calls used a single 5s timeout and returned null/[] on any failure, so a momentarily slow Aether response surfaced as 'no subscription' and apps rendered the Free tier for paying customers (seen on a Fractal workspace). Adds resilientFetch (10s/attempt, 2 retries, backoff on timeout/network/5xx); 2xx-4xx return immediately (404/403 unchanged). Writes are not retried. tsc 0, 279 tests pass, build ok.

…state

Aether read calls (getSubscription, getEntitlements, getPrices,
listSubscriptions) used a single 5s timeout and returned null/[] on any
failure. A momentarily slow Aether/Stripe response therefore surfaced as "no
subscription" -> apps rendered the Free tier for a paying customer (observed on
a Fractal workspace).

Add resilientFetch: a per-attempt 10s timeout with retries (2) and backoff on
transient failures (timeout / network / 5xx). 2xx-4xx still return immediately
so 404/403 are handled as before. Writes (checkout, portal, cancel, renew) are
intentionally NOT retried to avoid duplicate side effects.

Fixes the intermittent Free-tier false negative across all Omni apps that use
the shared billing provider.
@coopbri coopbri merged commit 94513ca into master Jul 5, 2026
3 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 5, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant