Skip to content

Instantly share code, notes, and snippets.

@sergiojoker11
Created June 18, 2025 17:46
Show Gist options
  • Save sergiojoker11/7e2da7fa97a67cba799f1e75a2e530c4 to your computer and use it in GitHub Desktop.
Save sergiojoker11/7e2da7fa97a67cba799f1e75a2e530c4 to your computer and use it in GitHub Desktop.
Stripe Schemas. Event and EventType
/* eslint-disable camelcase */
import type Stripe from 'stripe';
import { z } from 'zod';
type ValidateEventTypes<T extends ReadonlyArray<string>> = Stripe.Event['type'] extends T[number]
? T
: T & {
ERROR: `Missing Stripe event types`;
MISSING: Exclude<Stripe.Event['type'], T[number]>;
HINT: 'Add the missing types to the array above';
};
function createExhaustiveEventList<T extends ReadonlyArray<Stripe.Event['type']>>(
events: ValidateEventTypes<T>
): T {
return events as T;
}
export const stripeEventTypes = createExhaustiveEventList([
'account.application.authorized',
'account.application.deauthorized',
'account.external_account.created',
'account.external_account.deleted',
'account.external_account.updated',
'account.updated',
'application_fee.created',
'application_fee.refund.updated',
'application_fee.refunded',
'balance.available',
'billing.alert.triggered',
'billing.credit_balance_transaction.created',
'billing.credit_grant.created',
'billing.credit_grant.updated',
'billing.meter.created',
'billing.meter.deactivated',
'billing.meter.reactivated',
'billing.meter.updated',
'billing_portal.configuration.created',
'billing_portal.configuration.updated',
'billing_portal.session.created',
'capability.updated',
'cash_balance.funds_available',
'charge.captured',
'charge.dispute.closed',
'charge.dispute.created',
'charge.dispute.funds_reinstated',
'charge.dispute.funds_withdrawn',
'charge.dispute.updated',
'charge.expired',
'charge.failed',
'charge.pending',
'charge.refund.updated',
'charge.refunded',
'charge.succeeded',
'charge.updated',
'checkout.session.async_payment_failed',
'checkout.session.async_payment_succeeded',
'checkout.session.completed',
'checkout.session.expired',
'climate.order.canceled',
'climate.order.created',
'climate.order.delayed',
'climate.order.delivered',
'climate.order.product_substituted',
'climate.product.created',
'climate.product.pricing_updated',
'coupon.created',
'coupon.deleted',
'coupon.updated',
'credit_note.created',
'credit_note.updated',
'credit_note.voided',
'customer.created',
'customer.deleted',
'customer.discount.created',
'customer.discount.deleted',
'customer.discount.updated',
'customer.source.created',
'customer.source.deleted',
'customer.source.expiring',
'customer.source.updated',
'customer.subscription.created',
'customer.subscription.deleted',
'customer.subscription.paused',
'customer.subscription.pending_update_applied',
'customer.subscription.pending_update_expired',
'customer.subscription.resumed',
'customer.subscription.trial_will_end',
'customer.subscription.updated',
'customer.tax_id.created',
'customer.tax_id.deleted',
'customer.tax_id.updated',
'customer.updated',
'customer_cash_balance_transaction.created',
'entitlements.active_entitlement_summary.updated',
'file.created',
'financial_connections.account.created',
'financial_connections.account.deactivated',
'financial_connections.account.disconnected',
'financial_connections.account.reactivated',
'financial_connections.account.refreshed_balance',
'financial_connections.account.refreshed_ownership',
'financial_connections.account.refreshed_transactions',
'identity.verification_session.canceled',
'identity.verification_session.created',
'identity.verification_session.processing',
'identity.verification_session.redacted',
'identity.verification_session.requires_input',
'identity.verification_session.verified',
'invoice.created',
'invoice.deleted',
'invoice.finalization_failed',
'invoice.finalized',
'invoice.marked_uncollectible',
'invoice.overdue',
'invoice.overpaid',
'invoice.paid',
'invoice.payment_action_required',
'invoice.payment_failed',
'invoice.payment_succeeded',
'invoice.sent',
'invoice.upcoming',
'invoice.updated',
'invoice.voided',
'invoice.will_be_due',
'invoice_payment.paid',
'invoiceitem.created',
'invoiceitem.deleted',
'issuing_authorization.created',
'issuing_authorization.request',
'issuing_authorization.updated',
'issuing_card.created',
'issuing_card.updated',
'issuing_cardholder.created',
'issuing_cardholder.updated',
'issuing_dispute.closed',
'issuing_dispute.created',
'issuing_dispute.funds_reinstated',
'issuing_dispute.funds_rescinded',
'issuing_dispute.submitted',
'issuing_dispute.updated',
'issuing_personalization_design.activated',
'issuing_personalization_design.deactivated',
'issuing_personalization_design.rejected',
'issuing_personalization_design.updated',
'issuing_token.created',
'issuing_token.updated',
'issuing_transaction.created',
'issuing_transaction.purchase_details_receipt_updated',
'issuing_transaction.updated',
'mandate.updated',
'payment_intent.amount_capturable_updated',
'payment_intent.canceled',
'payment_intent.created',
'payment_intent.partially_funded',
'payment_intent.payment_failed',
'payment_intent.processing',
'payment_intent.requires_action',
'payment_intent.succeeded',
'payment_link.created',
'payment_link.updated',
'payment_method.attached',
'payment_method.automatically_updated',
'payment_method.detached',
'payment_method.updated',
'payout.canceled',
'payout.created',
'payout.failed',
'payout.paid',
'payout.reconciliation_completed',
'payout.updated',
'person.created',
'person.deleted',
'person.updated',
'plan.created',
'plan.deleted',
'plan.updated',
'price.created',
'price.deleted',
'price.updated',
'product.created',
'product.deleted',
'product.updated',
'promotion_code.created',
'promotion_code.updated',
'quote.accepted',
'quote.canceled',
'quote.created',
'quote.finalized',
'radar.early_fraud_warning.created',
'radar.early_fraud_warning.updated',
'refund.created',
'refund.failed',
'refund.updated',
'reporting.report_run.failed',
'reporting.report_run.succeeded',
'reporting.report_type.updated',
'review.closed',
'review.opened',
'setup_intent.canceled',
'setup_intent.created',
'setup_intent.requires_action',
'setup_intent.setup_failed',
'setup_intent.succeeded',
'sigma.scheduled_query_run.created',
'source.canceled',
'source.chargeable',
'source.failed',
'source.mandate_notification',
'source.refund_attributes_required',
'source.transaction.created',
'source.transaction.updated',
'subscription_schedule.aborted',
'subscription_schedule.canceled',
'subscription_schedule.completed',
'subscription_schedule.created',
'subscription_schedule.expiring',
'subscription_schedule.released',
'subscription_schedule.updated',
'tax.settings.updated',
'tax_rate.created',
'tax_rate.updated',
'terminal.reader.action_failed',
'terminal.reader.action_succeeded',
'test_helpers.test_clock.advancing',
'test_helpers.test_clock.created',
'test_helpers.test_clock.deleted',
'test_helpers.test_clock.internal_failure',
'test_helpers.test_clock.ready',
'topup.canceled',
'topup.created',
'topup.failed',
'topup.reversed',
'topup.succeeded',
'transfer.created',
'transfer.reversed',
'transfer.updated',
'treasury.credit_reversal.created',
'treasury.credit_reversal.posted',
'treasury.debit_reversal.completed',
'treasury.debit_reversal.created',
'treasury.debit_reversal.initial_credit_granted',
'treasury.financial_account.closed',
'treasury.financial_account.created',
'treasury.financial_account.features_status_updated',
'treasury.inbound_transfer.canceled',
'treasury.inbound_transfer.created',
'treasury.inbound_transfer.failed',
'treasury.inbound_transfer.succeeded',
'treasury.outbound_payment.canceled',
'treasury.outbound_payment.created',
'treasury.outbound_payment.expected_arrival_date_updated',
'treasury.outbound_payment.failed',
'treasury.outbound_payment.posted',
'treasury.outbound_payment.returned',
'treasury.outbound_payment.tracking_details_updated',
'treasury.outbound_transfer.canceled',
'treasury.outbound_transfer.created',
'treasury.outbound_transfer.expected_arrival_date_updated',
'treasury.outbound_transfer.failed',
'treasury.outbound_transfer.posted',
'treasury.outbound_transfer.returned',
'treasury.outbound_transfer.tracking_details_updated',
'treasury.received_credit.created',
'treasury.received_credit.failed',
'treasury.received_credit.succeeded',
'treasury.received_debit.created'
] as const satisfies ReadonlyArray<Stripe.Event['type']>);
export const stripeEventTypeSchema = z.enum(stripeEventTypes);
export const stripeEventBaseSchema = z
.object({
id: z.string(),
object: z.literal('event'),
created: z.number(),
type: stripeEventTypeSchema,
livemode: z.boolean(),
pending_webhooks: z.number(),
request: z
.object({
id: z.string().nullable(),
idempotency_key: z.string().nullable()
})
.nullable(),
data: z.object({
object: z.unknown(),
previous_attributes: z.record(z.unknown()).optional()
}),
api_version: z.string().nullable()
})
.transform((data) => {
return data as Stripe.Event;
});
export type StripeEventType = z.infer<typeof stripeEventTypeSchema>;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment