One init() call. Provide your secret key, choose api or elements mode, optionally set a timezone, and every module is ready to use.
You choose the flow. In api mode, payment and checkout calls return a hosted Stripe URL you redirect the customer to. In elements mode, they return a clientSecret your own frontend uses to confirm the payment with Stripe Elements. In both mode, you decide per call.
Elements are fully optional. The browser-side helpers live in a separate @ricardoneudorfer/stripekit/elements entry point. If you don't need Stripe Elements, you never import it.
Timezones handled correctly. Every timestamp StripeKit returns is first normalized to UTC (Stripe's native format), then, if you configured a timezone, converted once more into that timezone for display. Both values are always returned so you never have to do the math yourself.
You own your data. StripeKit never requires a database. Pass an optional storage adapter to persist customers, subscriptions, invoices, payments and payment methods in your own schema; without one, StripeKit still works, it just won't persist anything for you.
Covers the whole billing surface. Customers, payment methods, one-off payments, checkout (payment or subscription, with custom fields and coupons), subscriptions, invoices, coupons and promotion codes, and webhooks with automatic state sync.