Release path
artists/{artistId}/releases/{releaseId}
Checkout preconditions
- Buyer must not be an artist role account.
- Artist must have a connected Stripe account.
- Signed-in duplicate ownership is blocked before checkout starts.
Webhook writes
- Global purchase ledger:
purchases/{purchaseId} - User mirror:
users/{uid}/purchases/{releaseId}(non-guest)
Fulfillment
Downloads are served through expiring tokens or authenticated ownership checks. Direct storage URLs are not considered valid fulfillment.