When setting up a recurring payment under PSD2, create a SetupIntent or PaymentIntent with setup_future_usage='off_session' and include mandate_data describing the payment schedule (interval, amount) so the issuer can evaluate the mandate scope
The mandate_data.customer_acceptance object should reflect how the customer accepted the mandate: online (with IP address and user agent) or offline
After the SetupIntent or first PaymentIntent succeeds, Stripe generates a Mandate object linked to the PaymentMethod; retrieve and store the mandate ID
When creating subsequent off-session PaymentIntents, optionally pass the mandate parameter with the stored mandate ID to reference the existing mandate; some issuers and Stripe configurations require this
Display the mandate terms to the cardholder at checkout in a manner compliant with your local PSD2 or SCA implementation; this typically means showing the amount, frequency, and merchant name
Subscribe to mandate.updated webhooks to detect when a mandate becomes inactive or is revoked by the cardholder, and cancel the subscription accordingly
Known gotchas
Mandate requirements under PSD2 vary by country and issuer; some issuers enforce strict mandate reference requirements while others accept off-session charges without an explicit mandate ID
mandate_data must accurately reflect the agreed-upon payment schedule; discrepancies between the mandate terms and actual charge amounts or frequency can result in issuer declines
Stripe mandate objects are distinct from payment method setup — a PaymentMethod can exist without an associated mandate, but SCA-compliant recurring billing requires both
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp