From f217c73ef88129294a4e630cd8733b2cfd2f2096 Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Fri, 16 Oct 2026 12:44:33 +0200 Subject: [PATCH] docs(18.1-08): idempotency keys and the strict checkout price in COVERAGE --- .../phases/18.1-payment-gateway-subscriptions/COVERAGE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.planning/phases/18.1-payment-gateway-subscriptions/COVERAGE.md b/.planning/phases/18.1-payment-gateway-subscriptions/COVERAGE.md index f6bd7962..ba362b4b 100644 --- a/.planning/phases/18.1-payment-gateway-subscriptions/COVERAGE.md +++ b/.planning/phases/18.1-payment-gateway-subscriptions/COVERAGE.md @@ -6,10 +6,10 @@ Scope: the Stripe Billing surface the frozen PHP `SubscriptionGateway` contract | capability | decision | reason | |---|---|---| -| customers.create with subscriber metadata | INTEGRATE | e-mail, name, subscriber_type and subscriber_id metadata | +| customers.create with subscriber metadata | INTEGRATE | e-mail, name, subscriber_type and subscriber_id metadata; an idempotency key per subscriber and parameters in a 10-minute window, so concurrent checkouts create one customer (WR-02, plan 18.1-08) | | customers.retrieve | OPT-OUT | not in the frozen PHP contract: the stored customer id is trusted, as PHP did | | customers.update (sync e-mail or name changes) | OPT-OUT | not in the frozen PHP contract | -| checkout.sessions.create (mode subscription) | INTEGRATE | success URL carries the session_id placeholder; subscription_data.metadata | +| checkout.sessions.create (mode subscription) | INTEGRATE | success URL carries the session_id placeholder; subscription_data.metadata; an idempotency key per subscriber, customer, price, URLs and metadata in a 10-minute window, so parallel requests get one session (WR-03, plan 18.1-08); the price is the plan's own in the currency, never another currency's (CR-02, plan 18.1-08) | | checkout.sessions.retrieve (after the success redirect) | OPT-OUT | not in the frozen PHP contract: activation comes from the signed customer.subscription.created event | | billing_portal.sessions.create | INTEGRATE | | | billing_portal.configurations (create or update) | OPT-OUT | not in the frozen PHP contract: the portal is configured per account in the Stripe dashboard |