Skip to main content
Month 2 availability. The Stripe mirror ships after Resend and Twilio. Check the status page for the current release state.
Target vendor: Stripe API version 2024-06-20. Webhook signing: HMAC-SHA256 with Stripe-Signature header matching Stripe’s exact scheme (timestamp + signature, v1=…, tolerant of tampering detection).

Mirror URL

https://stripe-<session_id>.mirra.run
Example: https://stripe-a7k2.mirra.run.

SDK compatibility

All official Stripe SDKs work against the mirror with zero code changes when routed via the TLS proxy:
import Stripe from 'stripe';

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

const customer = await stripe.customers.create({
  email: 'alice@test.com',
});
// → routed to stripe-a7k2.mirra.run

Supported surface

Resources

Full CRUD. Customer metadata, email, default payment method, address, tax ID. Search by email.
Full lifecycle — trialing → active → past_due → canceled and the variants (unpaid, incomplete, incomplete_expired). Prorations. Quantity changes. Plan changes. Cancellation at period end vs. immediate.
Create, confirm, capture, cancel. Status transitions (requires_payment_method → requires_confirmation → succeeded / requires_action). 3DS flows simulated via /_mirra/simulate.
Subscription-generated invoices, manual invoices, line items, tax, discount application. Finalize, void, mark uncollectible. Dunning timeline.
Full CRUD on products, prices, price lookup keys. Metered vs. licensed. Tiered pricing.
Create, apply to subscriptions and invoices. Percent-off, amount-off. Duration types (once / forever / repeating). Redemption limits.
Create, retrieve, list. Reason tracking. Partial refunds. Webhook dispatch.
Register endpoints, list events, retry failed deliveries via /_mirra/webhooks/retry.

Webhooks

All standard Stripe webhook event types fire on their correct schedule with correct signatures:
  • customer.created, customer.updated, customer.deleted
  • customer.subscription.created, customer.subscription.updated, customer.subscription.deleted, customer.subscription.trial_will_end
  • invoice.created, invoice.finalized, invoice.paid, invoice.payment_failed, invoice.payment_succeeded, invoice.upcoming, invoice.voided
  • payment_intent.created, payment_intent.succeeded, payment_intent.payment_failed, payment_intent.requires_action
  • charge.succeeded, charge.failed, charge.refunded
  • payment_method.attached, payment_method.detached, payment_method.updated
Signing uses Stripe’s exact scheme:
Stripe-Signature: t=1713802534,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
Verify using the SDK’s standard stripe.webhooks.constructEvent() — no changes from production code.

Built-in fixtures

No customers, no subscriptions, no products. A blank Stripe account.
One customer with a subscription in trialing, one in active, one in past_due, one canceled. Products and prices wired up. Good for testing state transitions.
Three customers with failed payment methods. Dunning state. Next retry scheduled. Good for testing your invoice.payment_failed handler.
Customer with active dunning — multiple failed invoices, subscription in past_due, retry schedule progressing. Good for testing cancellation-after-dunning flows.
Load a fixture:
mirra up --mirrors=stripe --seed=stripe:subscription-lifecycle
Or in a scenario:
## Config
mirrors: stripe
fixture: subscription-lifecycle

Coverage gaps

Gaps are documented and tracked as GitHub issues. Current gaps for Stripe:
  • Stripe Tax — not mirrored. Requests to /v1/tax/* return a 501.
  • Connect — standard accounts supported; Express and Custom not yet.
  • Financial Connections — not mirrored.
  • Radar rules — simulated via /_mirra/simulate events, not rule-engine-driven.
  • Terminal — not mirrored.
See status.mirra.run/stripe for the live list.

Drift state

Last vendor diff: see the status page. Drift SLA is 7-day detect, 14-day fix for critical changes. Current mirror version: see x-mirra-version response header after any request.

Simulating events

Stripe has real-world triggers that don’t exist in a pure code path — a payment failing after 14 days, a webhook retrying, a radar rule firing. The /_mirra/simulate endpoint exposes these explicitly:
curl -X POST https://stripe-a7k2.mirra.run/_mirra/simulate \
  -H "Content-Type: application/json" \
  -d '{ "event": "invoice.payment_failed", "subscription": "sub_Qzp" }'
Triggers the event as if it had fired naturally — the subscription state updates, the webhook dispatches, everything downstream reacts. Used heavily by scenario drivers. See API reference for the full list of simulatable events.

Where to go next

Resend

The email mirror.

Twilio

The SMS mirror.

First scenario

Run a scenario against a mirror end-to-end.