# accrue v0.3.0 - Table of Contents Billing state, modeled clearly. ## Pages - [Accrue](readme.md) - Guides - [Auth Adapters](auth_adapters.md) - [Branding](branding.md) - [Configuration](configuration.md) - [Accrue Connect — Marketplace Platforms Guide](connect.md) - [Custom PDF Adapter](custom_pdf_adapter.md) - [Custom Processors](custom_processors.md) - [Email](email.md) - [Finance handoff: Stripe-native reporting](finance-handoff.md) - [First Hour](first_hour.md) - [PDF Rendering](pdf.md) - [Customer Portal Configuration Checklist](portal_configuration_checklist.md) - [Quickstart](quickstart.md) - [Release notes (plain-language)](release-notes.md) - [Sigra Integration](sigra_integration.md) - [Telemetry & Observability](telemetry.md) - [Testing Accrue Billing Flows](testing.md) - [Troubleshooting](troubleshooting.md) - [Upgrade Guide](upgrade.md) - [Webhook Gotchas](webhook_gotchas.md) - [Webhooks](webhooks.md) ## Modules - [Accrue](Accrue.md): Accrue — billing state, modeled clearly. - [Accrue.Actor](Accrue.Actor.md): Process-dictionary-backed actor context for the Events ledger (D-15). - [Accrue.Application](Accrue.Application.md): OTP Application entry point for Accrue (FND-05, D-05). - [Accrue.Auth](Accrue.Auth.md): Behaviour + facade for host-app auth integration (AUTH-01, AUTH-02). - [Accrue.Auth.Default](Accrue.Auth.Default.md): Dev-permissive, prod-refuse-to-boot default `Accrue.Auth` adapter (D-40). - [Accrue.Auth.Mock](Accrue.Auth.Mock.md): Process-local `Accrue.Auth` adapter for host test suites. - [Accrue.Billable](Accrue.Billable.md): One-line macro that makes any host schema billable. - [Accrue.Billing](Accrue.Billing.md): Primary context module for Accrue billing operations. - [Accrue.Billing.Charge](Accrue.Billing.Charge.md): Ecto schema for the `accrue_charges` table. - [Accrue.Billing.ChargeActions](Accrue.Billing.ChargeActions.md): Phase 3 Plan 06 charge / payment intent / setup intent write surface (BILL-20, BILL-21, BILL-22). - [Accrue.Billing.Coupon](Accrue.Billing.Coupon.md): Ecto schema for the `accrue_coupons` table. - [Accrue.Billing.CouponActions](Accrue.Billing.CouponActions.md): Coupon and promotion-code write surface. - [Accrue.Billing.Customer](Accrue.Billing.Customer.md): Ecto schema for the `accrue_customers` table. - [Accrue.Billing.Dunning](Accrue.Billing.Dunning.md): Pure policy module for BILL-15 dunning (D4-02 hybrid). - [Accrue.Billing.IntentResult](Accrue.Billing.IntentResult.md): Wraps Stripe intent-capable responses into the `intent_result` tagged union (D3-06..D3-08). - [Accrue.Billing.Invoice](Accrue.Billing.Invoice.md): Ecto schema for the `accrue_invoices` table. - [Accrue.Billing.InvoiceActions](Accrue.Billing.InvoiceActions.md): Phase 3 Plan 05 invoice write surface (BILL-17/18/19). - [Accrue.Billing.InvoiceCoupon](Accrue.Billing.InvoiceCoupon.md): Ecto schema for the `accrue_invoice_coupons` redemption link table (D3-16). - [Accrue.Billing.InvoiceItem](Accrue.Billing.InvoiceItem.md): Ecto schema for the `accrue_invoice_items` table (D3-15). - [Accrue.Billing.InvoiceProjection](Accrue.Billing.InvoiceProjection.md): Deterministic decomposition of a processor (Stripe- or Fake-shaped) invoice into a flat attrs map ready for `Accrue.Billing.Invoice.changeset/2` plus a list of per-line attrs ready for `Accrue.Billing.InvoiceItem.changeset/2`. - [Accrue.Billing.Metadata](Accrue.Billing.Metadata.md): Stripe-compatible metadata validation and merge helpers. - [Accrue.Billing.MeterEvent](Accrue.Billing.MeterEvent.md): Ecto schema for `accrue_meter_events` — the metered billing audit ledger and transactional outbox. - [Accrue.Billing.MeterEventActions](Accrue.Billing.MeterEventActions.md): Phase 4 Plan 02 — metered billing write surface (BILL-13, D4-03). - [Accrue.Billing.MeterEvents](Accrue.Billing.MeterEvents.md): Phase 4 Plan 02 helper for asynchronous meter-event state transitions driven by Stripe webhooks (BILL-13, Pitfall 5). - [Accrue.Billing.PaymentMethod](Accrue.Billing.PaymentMethod.md): Ecto schema for the `accrue_payment_methods` table. - [Accrue.Billing.PaymentMethodActions](Accrue.Billing.PaymentMethodActions.md): Phase 3 Plan 06 payment method write surface (BILL-23, BILL-25). - [Accrue.Billing.PromotionCode](Accrue.Billing.PromotionCode.md): Ecto schema for the `accrue_promotion_codes` table. - [Accrue.Billing.PromotionCodeProjection](Accrue.Billing.PromotionCodeProjection.md): Decomposes a processor promotion-code map (atom- or string-keyed) into a flat attrs map ready for `Accrue.Billing.PromotionCode.changeset/2`. - [Accrue.Billing.Query](Accrue.Billing.Query.md): Composable `Ecto.Query` fragments mirroring the `Accrue.Billing.Subscription` predicates (D3-04). - [Accrue.Billing.Refund](Accrue.Billing.Refund.md): Ecto schema for the `accrue_refunds` table (D3-45). - [Accrue.Billing.RefundActions](Accrue.Billing.RefundActions.md): Phase 3 Plan 06 refund write surface (BILL-26, D3-45..47). - [Accrue.Billing.Subscription](Accrue.Billing.Subscription.md): Ecto schema for the `accrue_subscriptions` table. - [Accrue.Billing.SubscriptionActions](Accrue.Billing.SubscriptionActions.md): Phase 3 Plan 04 subscription write surface (BILL-03/04/06/07/08/09/10). - [Accrue.Billing.SubscriptionItem](Accrue.Billing.SubscriptionItem.md): Ecto schema for the `accrue_subscription_items` table. - [Accrue.Billing.SubscriptionItems](Accrue.Billing.SubscriptionItems.md): Multi-item subscription surface (BILL-12). - [Accrue.Billing.SubscriptionProjection](Accrue.Billing.SubscriptionProjection.md): Decomposes a processor (Stripe- or Fake-shaped) subscription map into a flat attrs map ready for `Accrue.Billing.Subscription.changeset/2` (D3-02). - [Accrue.Billing.SubscriptionSchedule](Accrue.Billing.SubscriptionSchedule.md): Ecto schema for `accrue_subscription_schedules` (BILL-16). - [Accrue.Billing.SubscriptionScheduleActions](Accrue.Billing.SubscriptionScheduleActions.md): BILL-16 write surface for Stripe SubscriptionSchedules. - [Accrue.Billing.SubscriptionScheduleProjection](Accrue.Billing.SubscriptionScheduleProjection.md): Decomposes a Stripe/Fake SubscriptionSchedule payload into the flat attrs map consumed by `Accrue.Billing.SubscriptionSchedule.changeset/2` and `force_status_changeset/2`. - [Accrue.Billing.Trial](Accrue.Billing.Trial.md): Trial end normalization (D3-38). - [Accrue.Billing.UpcomingInvoice](Accrue.Billing.UpcomingInvoice.md): Non-persistent struct representing a proration preview (BILL-10, D3-19). - [Accrue.Billing.UpcomingInvoice.Line](Accrue.Billing.UpcomingInvoice.Line.md): A single line on an upcoming-invoice preview. - [Accrue.BillingPortal](Accrue.BillingPortal.md): Customer Billing Portal context (CHKT-04/05/06). - [Accrue.BillingPortal.Session](Accrue.BillingPortal.Session.md): Stripe Customer Billing Portal session wrapper. - [Accrue.Checkout](Accrue.Checkout.md): Stripe Checkout integration facade. - [Accrue.Checkout.LineItem](Accrue.Checkout.LineItem.md): Helpers for constructing Stripe Checkout `line_items` array entries (CHKT-03). - [Accrue.Checkout.Session](Accrue.Checkout.Session.md): Stripe Checkout Session wrapper. - [Accrue.Cldr](Accrue.Cldr.md): Provides the core functions to retrieve and manage the CLDR data that supports formatting and localisation. - [Accrue.Cldr.AcceptLanguage](Accrue.Cldr.AcceptLanguage.md): Parses HTTP `Accept-Language` header values as defined in [rfc2616](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4). - [Accrue.Cldr.Currency](Accrue.Cldr.Currency.md) - [Accrue.Cldr.Locale](Accrue.Cldr.Locale.md): Backend module that provides functions to define new locales and display human-readable locale names for presentation purposes. - [Accrue.Cldr.Money](Accrue.Cldr.Money.md): A backend module for Money. - [Accrue.Cldr.Number](Accrue.Cldr.Number.md): Formats numbers and currencies based upon CLDR's decimal formats specification. - [Accrue.Cldr.Number.Cardinal](Accrue.Cldr.Number.Cardinal.md): Implements cardinal plural rules for numbers. - [Accrue.Cldr.Number.Format](Accrue.Cldr.Number.Format.md): Functions to manage the collection of number patterns defined in Cldr. - [Accrue.Cldr.Number.Formatter.Decimal](Accrue.Cldr.Number.Formatter.Decimal.md) - [Accrue.Cldr.Number.Ordinal](Accrue.Cldr.Number.Ordinal.md): Implements ordinal plural rules for numbers. - [Accrue.Cldr.Number.PluralRule.Range](Accrue.Cldr.Number.PluralRule.Range.md): Implements plural rules for ranges - [Accrue.Cldr.Number.Symbol](Accrue.Cldr.Number.Symbol.md) - [Accrue.Cldr.Number.System](Accrue.Cldr.Number.System.md) - [Accrue.Cldr.Number.Transliterate](Accrue.Cldr.Number.Transliterate.md): Transliteration for digits and separators. - [Accrue.Cldr.Rbnf.NumberSystem](Accrue.Cldr.Rbnf.NumberSystem.md): Functions to implement the number system rule-based-number-format rules of CLDR. - [Accrue.Cldr.Rbnf.Ordinal](Accrue.Cldr.Rbnf.Ordinal.md): Functions to implement the ordinal rule-based-number-format rules of CLDR. - [Accrue.Cldr.Rbnf.Spellout](Accrue.Cldr.Rbnf.Spellout.md): Functions to implement the spellout rule-based-number-format rules of CLDR. - [Accrue.Clock](Accrue.Clock.md): Canonical time source for Accrue (D3-86). - [Accrue.Config](Accrue.Config.md): Runtime configuration schema for Accrue, backed by `NimbleOptions`. - [Accrue.Connect](Accrue.Connect.md): Stripe Connect domain facade. - [Accrue.Connect.Account](Accrue.Connect.Account.md): Ecto schema for `accrue_connect_accounts` — the local projection of a Stripe Connected Account (D5-02, CONN-01/03). - [Accrue.Connect.AccountLink](Accrue.Connect.AccountLink.md): Onboarding/update bearer credential for a connected account. - [Accrue.Connect.LoginLink](Accrue.Connect.LoginLink.md): Express dashboard return credential for a connected account. - [Accrue.Connect.PlatformFee](Accrue.Connect.PlatformFee.md): Pure `Accrue.Money` math for platform fee computation. - [Accrue.Connect.Projection](Accrue.Connect.Projection.md): Decomposes a processor-shaped (Stripe- or Fake-produced) Connected Account payload into a flat attrs map ready for `Accrue.Connect.Account.changeset/2` (D5-02). - [Accrue.Credo.NoRawStatusAccess](Accrue.Credo.NoRawStatusAccess.md): ## Basics - [Accrue.Ecto.Money](Accrue.Ecto.Money.md): Two storage shapes for `%Accrue.Money{}` in Ecto schemas — both shipped in Phase 1 per D-02 and RESEARCH Open Question 5. - [Accrue.Emails.CardExpiringSoon](Accrue.Emails.CardExpiringSoon.md): Card-expiring-soon reminder email. - [Accrue.Emails.CouponApplied](Accrue.Emails.CouponApplied.md): Coupon applied notification (MAIL-13). - [Accrue.Emails.Fixtures](Accrue.Emails.Fixtures.md): Canned assigns for every `Accrue.Emails.*` type (D6-08). - [Accrue.Emails.HtmlBridge](Accrue.Emails.HtmlBridge.md): Renders a `Phoenix.Component` function component to a safe HTML string for embedding inside `` in an `mjml_eex` template. - [Accrue.Emails.InvoiceFinalized](Accrue.Emails.InvoiceFinalized.md): Invoice finalized notification (MAIL-07). - [Accrue.Emails.InvoicePaid](Accrue.Emails.InvoicePaid.md): Invoice paid confirmation (MAIL-08). - [Accrue.Emails.InvoicePaymentFailed](Accrue.Emails.InvoicePaymentFailed.md): Invoice payment-failed notification (MAIL-09). - [Accrue.Emails.PaymentFailed](Accrue.Emails.PaymentFailed.md): Payment-failed notification (MAIL-04). - [Accrue.Emails.PaymentSucceeded](Accrue.Emails.PaymentSucceeded.md): Reference email template for the `payment_succeeded` receipt email. - [Accrue.Emails.Receipt](Accrue.Emails.Receipt.md): Canonical receipt email (MAIL-03). - [Accrue.Emails.RefundIssued](Accrue.Emails.RefundIssued.md): Refund issued notification (MAIL-12). - [Accrue.Emails.SubscriptionCanceled](Accrue.Emails.SubscriptionCanceled.md): Subscription cancellation confirmation (MAIL-10). - [Accrue.Emails.SubscriptionPaused](Accrue.Emails.SubscriptionPaused.md): Subscription-paused notification (MAIL-11a). - [Accrue.Emails.SubscriptionResumed](Accrue.Emails.SubscriptionResumed.md): Subscription-resumed notification (MAIL-11b). - [Accrue.Emails.TrialEnded](Accrue.Emails.TrialEnded.md): Trial-ended notification email (MAIL-06). - [Accrue.Emails.TrialEnding](Accrue.Emails.TrialEnding.md): Trial-ending reminder email (MAIL-05). - [Accrue.Events](Accrue.Events.md): Append-only event ledger API (D-13, D-14, D-15, D-16). - [Accrue.Events.Event](Accrue.Events.Event.md): Ecto schema for a row in the append-only `accrue_events` table. - [Accrue.Events.Schemas](Accrue.Events.Schemas.md): Registry mapping Phase 3 event atoms to their canonical schema modules (D3-66, D3-68). - [Accrue.Events.Schemas.CardExpiringSoon](Accrue.Events.Schemas.CardExpiringSoon.md): Payload schema for `:"card.expiring_soon"` events (D3-66). - [Accrue.Events.Schemas.InvoicePaid](Accrue.Events.Schemas.InvoicePaid.md): Payload schema for `:"invoice.paid"` events (D3-66). - [Accrue.Events.Schemas.RefundCreated](Accrue.Events.Schemas.RefundCreated.md): Payload schema for `:"refund.created"` events (D3-66). - [Accrue.Events.Schemas.SubscriptionCanceled](Accrue.Events.Schemas.SubscriptionCanceled.md): Payload schema for `:"subscription.canceled"` events (D3-66). - [Accrue.Events.Schemas.SubscriptionCreated](Accrue.Events.Schemas.SubscriptionCreated.md): Payload schema for `:"subscription.created"` events (D3-66). - [Accrue.Events.Schemas.SubscriptionPlanSwapped](Accrue.Events.Schemas.SubscriptionPlanSwapped.md): Payload schema for `:"subscription.plan_swapped"` events (D3-66). - [Accrue.Events.Schemas.SubscriptionUpdated](Accrue.Events.Schemas.SubscriptionUpdated.md): Payload schema for `:"subscription.updated"` events (D3-66). - [Accrue.Events.Upcaster](Accrue.Events.Upcaster.md): Upcaster behaviour for event `schema_version` evolution (D3-69). - [Accrue.Events.UpcasterRegistry](Accrue.Events.UpcasterRegistry.md): Chain composition for event schema-version upcasting (EVT-05 / D4 Discretion). - [Accrue.Events.Upcasters.V1ToV2](Accrue.Events.Upcasters.V1ToV2.md): Example upcaster from `schema_version: 1` to `schema_version: 2` (EVT-05). - [Accrue.Install.Fingerprints](Accrue.Install.Fingerprints.md): No-clobber primitives for Accrue-generated host files. - [Accrue.Install.Options](Accrue.Install.Options.md): Strict option parsing for `mix accrue.install`. - [Accrue.Install.Patches](Accrue.Install.Patches.md): Safe host-file patch builders and manual snippets for Accrue installs. - [Accrue.Install.Project](Accrue.Install.Project.md): Phoenix host project discovery for `mix accrue.install`. - [Accrue.Install.Templates](Accrue.Install.Templates.md): Renders host-owned installer templates. - [Accrue.Invoices](Accrue.Invoices.md): Invoice facade (D6-04). Owns lazy PDF rendering + storage delegation. - [Accrue.Invoices.Components](Accrue.Invoices.Components.md): Phoenix.Component function components shared by email (via `Accrue.Emails.HtmlBridge` + ``) and PDF (via `Accrue.Invoices.Layouts.print_shell/1`). - [Accrue.Invoices.Layouts](Accrue.Invoices.Layouts.md): HEEx layout wrappers for PDF (and optionally, shared email shells). - [Accrue.Invoices.Render](Accrue.Invoices.Render.md): Invoice render orchestration — builds a single `RenderContext` and exposes format-helper functions shared by the email + PDF pipelines. - [Accrue.Invoices.RenderContext](Accrue.Invoices.RenderContext.md): Format-neutral hydrated invoice payload (D6-04). - [Accrue.Invoices.Styles](Accrue.Invoices.Styles.md): Static branding-aware inline-CSS lookup used by `Accrue.Invoices.Components` to stamp `style="..."` attributes on every structural element. - [Accrue.Jobs.DetectExpiringCards](Accrue.Jobs.DetectExpiringCards.md): Scheduled Oban worker for expiring-card detection (D3-71..78, BILL-24). - [Accrue.Jobs.DunningSweeper](Accrue.Jobs.DunningSweeper.md): Oban cron worker for BILL-15 / D4-02 dunning grace-period overlay. - [Accrue.Jobs.MeterEventsReconciler](Accrue.Jobs.MeterEventsReconciler.md): Metered billing outbox reconciler. - [Accrue.Jobs.ReconcileChargeFees](Accrue.Jobs.ReconcileChargeFees.md): Daily backstop Oban worker for charge fees that weren't populated at create time (D3-46). - [Accrue.Jobs.ReconcileRefundFees](Accrue.Jobs.ReconcileRefundFees.md): Daily backstop Oban worker for refund fees that weren't populated at create time (D3-46). - [Accrue.Mailer](Accrue.Mailer.md): Behaviour + facade for the Accrue transactional email pipeline (MAIL-01, D-21). - [Accrue.Mailer.Default](Accrue.Mailer.Default.md): Default `Accrue.Mailer` adapter — enqueues an Oban job on the `:accrue_mailers` queue that a worker later turns into a delivered email. - [Accrue.Mailer.Swoosh](Accrue.Mailer.Swoosh.md): Swoosh-backed delivery module for Accrue's transactional emails. - [Accrue.Mailer.Test](Accrue.Mailer.Test.md): Test adapter for `Accrue.Mailer` (D6-05). Replaces `Accrue.Mailer.Default` at the behaviour layer — intercepts `Accrue.Mailer.deliver/2` BEFORE Oban enqueue. Sends the intent tuple to the calling test pid and returns immediately. - [Accrue.Money](Accrue.Money.md): Accrue's canonical money value type — a thin, opinionated wrapper over the `:ex_money` currency table. - [Accrue.Oban.Middleware](Accrue.Oban.Middleware.md): Helper for setting `Accrue.Actor` operation_id from an Oban job (D3-63). - [Accrue.PDF](Accrue.PDF.md): Behaviour + facade for PDF rendering (PDF-01, D-32). - [Accrue.PDF.ChromicPDF](Accrue.PDF.ChromicPDF.md): ChromicPDF adapter for `Accrue.PDF` (D-32, D-33). - [Accrue.PDF.Null](Accrue.PDF.Null.md): Null `Accrue.PDF` adapter for Chrome-hostile deploys (D6-06). - [Accrue.PDF.Test](Accrue.PDF.Test.md): Chrome-free `Accrue.PDF` adapter for test environments (D-34). - [Accrue.Plug.PutConnectedAccount](Accrue.Plug.PutConnectedAccount.md): Stashes a per-request Connect `stripe_account` id into the process dictionary for the lifetime of the request. - [Accrue.Plug.PutOperationId](Accrue.Plug.PutOperationId.md): Sets `Accrue.Actor` operation_id from `conn.assigns[:request_id]`. - [Accrue.Processor](Accrue.Processor.md): Behaviour every processor adapter implements, plus a runtime-dispatching facade so every caller looks like `Accrue.Processor.create_customer(...)` regardless of which adapter is wired. - [Accrue.Processor.Fake](Accrue.Processor.Fake.md): Deterministic in-memory `Accrue.Processor` adapter for tests and demos. - [Accrue.Processor.Fake.State](Accrue.Processor.Fake.State.md): Internal state struct for `Accrue.Processor.Fake`. - [Accrue.Processor.Idempotency](Accrue.Processor.Idempotency.md): Deterministic idempotency key and subject UUID derivation for Phase 3 processor operations (D3-60, D3-61, D3-64). - [Accrue.Processor.Stripe](Accrue.Processor.Stripe.md): Real-world processor adapter delegating to `:lattice_stripe`. - [Accrue.Processor.Stripe.ErrorMapper](Accrue.Processor.Stripe.ErrorMapper.md): Translates raw `LatticeStripe` error shapes into `Accrue.Error` subtypes (D-07, PROC-07, OBS-06). - [Accrue.Repo](Accrue.Repo.md): Thin facade over the host-configured `Ecto.Repo`. - [Accrue.Router](Accrue.Router.md): Router helpers for mounting Accrue webhook endpoints. - [Accrue.Storage](Accrue.Storage.md): Behaviour + facade for pluggable PDF / asset storage. - [Accrue.Storage.Null](Accrue.Storage.Null.md): No-op `Accrue.Storage` adapter — the v1.0 default (D6-04). - [Accrue.Stripe](Accrue.Stripe.md): Stripe-specific helpers for host applications (D2-15). - [Accrue.Telemetry](Accrue.Telemetry.md): Telemetry conventions and helpers for Accrue (D-17, D-18, OBS-01). - [Accrue.Telemetry.Metrics](Accrue.Telemetry.Metrics.md): Default `Telemetry.Metrics` recipe for SRE teams. - [Accrue.Telemetry.OTel](Accrue.Telemetry.OTel.md): Optional OpenTelemetry bridge for Accrue telemetry spans. - [Accrue.Telemetry.Ops](Accrue.Telemetry.Ops.md): Ops-grade telemetry emit helper. - [Accrue.Test](Accrue.Test.md): Public test helper facade for host applications. - [Accrue.Test.Clock](Accrue.Test.Clock.md): Deterministic clock helpers for host tests. - [Accrue.Test.EventAssertions](Accrue.Test.EventAssertions.md): ExUnit-style assertions for Accrue's append-only event ledger. - [Accrue.Test.Factory](Accrue.Test.Factory.md): Phase 3 test factories (D3-79..85). - [Accrue.Test.Generators](Accrue.Test.Generators.md): StreamData generators for Phase 3 property tests (D3-81). - [Accrue.Test.MailerAssertions](Accrue.Test.MailerAssertions.md): ExUnit-style assertions for `Accrue.Mailer.Test` intent captures (D6-05). Symmetric with `Accrue.Test.PdfAssertions`. - [Accrue.Test.PdfAssertions](Accrue.Test.PdfAssertions.md): ExUnit-style assertions for `Accrue.PDF.Test` render captures (D-34). Symmetric with `Accrue.Test.MailerAssertions`. - [Accrue.Test.Webhooks](Accrue.Test.Webhooks.md): Synthetic webhook helpers for host tests. - [Accrue.Webhook.CachingBodyReader](Accrue.Webhook.CachingBodyReader.md): Custom body reader for `Plug.Parsers` that tees the raw body into `conn.assigns[:raw_body]` for webhook signature verification. - [Accrue.Webhook.ConnectHandler](Accrue.Webhook.ConnectHandler.md): Webhook handler for events arriving on the `:connect` endpoint. - [Accrue.Webhook.DefaultHandler](Accrue.Webhook.DefaultHandler.md): Non-disableable default handler for built-in state reconciliation. - [Accrue.Webhook.DispatchWorker](Accrue.Webhook.DispatchWorker.md): Oban worker for async webhook handler dispatch (D2-27). - [Accrue.Webhook.Event](Accrue.Webhook.Event.md): Lean event struct passed to webhook handlers (D2-29). - [Accrue.Webhook.Handler](Accrue.Webhook.Handler.md): Behaviour for webhook event handlers (D2-27). - [Accrue.Webhook.Ingest](Accrue.Webhook.Ingest.md): Transactional webhook event persistence and Oban job dispatch (D2-24). - [Accrue.Webhook.Plug](Accrue.Webhook.Plug.md): Core webhook ingestion plug. - [Accrue.Webhook.Pruner](Accrue.Webhook.Pruner.md): Oban cron worker for webhook event retention (D2-34). - [Accrue.Webhook.Signature](Accrue.Webhook.Signature.md): Webhook signature verification. Delegates entirely to `LatticeStripe.Webhook.construct_event!/4` (D2-22). - [Accrue.Webhook.WebhookEvent](Accrue.Webhook.WebhookEvent.md): Ecto schema for the `accrue_webhook_events` table. - [Accrue.Webhooks.DLQ](Accrue.Webhooks.DLQ.md): Dead-letter queue replay and retention for webhook events (WH-08 / D4-04). - [Accrue.Workers.Mailer](Accrue.Workers.Mailer.md): Oban worker that delivers a transactional email asynchronously. - Exceptions - [Accrue.APIError](Accrue.APIError.md): Raised when a processor call fails for a reason that is neither a card error nor a rate limit (e.g., HTTP 500, unexpected payload). Pattern-match on `%Accrue.APIError{}` in retry logic. - [Accrue.ActionRequiredError](Accrue.ActionRequiredError.md): Raised when a Stripe PaymentIntent or SetupIntent transitions to `requires_action` (SCA / 3DS). The `:payment_intent` field carries the full PaymentIntent payload so callers can extract `client_secret` and drive the Stripe.js confirmation flow on the frontend. - [Accrue.Auth.StepUpUnconfigured](Accrue.Auth.StepUpUnconfigured.md): Raised when a destructive admin action requires step-up verification but the configured auth adapter does not implement the optional callbacks. - [Accrue.CardError](Accrue.CardError.md): Raised when the processor rejects a card (declined, expired, insufficient funds, etc.). Mirrors Stripe's card-error shape 1:1. - [Accrue.ConfigError](Accrue.ConfigError.md): Raised when `Accrue.Config` validation fails, or when a key is looked up that is neither set at runtime nor has a schema default. - [Accrue.DecodeError](Accrue.DecodeError.md): Raised when a processor response body cannot be decoded (malformed JSON, unexpected shape). The `payload` field holds the raw binary for debugging — treat as sensitive; do not log verbatim. - [Accrue.Error.InvalidState](Accrue.Error.InvalidState.md): Raised when a state-machine transition is attempted from an illegal source state (e.g., `pay_invoice/2` on a `:void` invoice, `resume/2` on an `:active` subscription). - [Accrue.Error.MultiItemSubscription](Accrue.Error.MultiItemSubscription.md): Raised when a legacy convenience call (e.g., `update_quantity/3`) is made against a subscription that has more than one `SubscriptionItem`. Multi-item subscriptions require `Accrue.Billing.update_items/3`; the convenience helpers enforce a single-item invariant. - [Accrue.Error.NoDefaultPaymentMethod](Accrue.Error.NoDefaultPaymentMethod.md): Raised when a charge or subscription call requires a default payment method and the customer has none set. Callers should surface a user-facing "add a payment method" prompt. - [Accrue.Error.NotAttached](Accrue.Error.NotAttached.md): Raised when a payment method is referenced for a customer it is not attached to (e.g., `set_default_payment_method/3` with a `pm_id` that belongs to a different customer). - [Accrue.Error.PdfDisabled](Accrue.Error.PdfDisabled.md): Raised / returned when the configured PDF adapter is `Accrue.PDF.Null`. Expected and terminal — callers MUST pattern-match and fall through to a non-PDF path (e.g., link to `hosted_invoice_url` instead of attaching a rendered binary). Oban workers MUST NOT treat this as a transient retry; it is a stable adapter configuration, not a failure. - [Accrue.EventLedgerImmutableError](Accrue.EventLedgerImmutableError.md): Raised when a caller attempts to UPDATE or DELETE a row in `accrue_events`. The append-only guarantee is enforced in two places - [Accrue.IdempotencyError](Accrue.IdempotencyError.md): Raised when the processor rejects an idempotency key replay (e.g., same key used for a different request body). Pattern-match on `%Accrue.IdempotencyError{}` to surface a user-facing "this request was already processed" message. - [Accrue.Money.MismatchedCurrencyError](Accrue.Money.MismatchedCurrencyError.md): Raised when `Accrue.Money` arithmetic is attempted across two different currencies. Per D-04, cross-currency math never silently coerces or returns a tagged tuple — it raises at the call site so the bug surfaces immediately. - [Accrue.PDF.RenderFailed](Accrue.PDF.RenderFailed.md): Raised from `Accrue.Workers.Mailer.perform/1` when `Accrue.Billing.render_invoice_pdf/2` returns a non-terminal `{:error, reason}` (i.e., not `%Accrue.Error.PdfDisabled{}` and not `:chromic_pdf_not_started`). Raising this exception lets Oban backoff handle transient render failures — the mailer job is retried per its `max_attempts` setting. - [Accrue.RateLimitError](Accrue.RateLimitError.md): Raised when the processor returns a rate-limit response (HTTP 429). The `retry_after` field carries the server's suggested backoff in seconds. - [Accrue.SetupDiagnostic](Accrue.SetupDiagnostic.md): Shared setup-diagnostic carrier for first-hour host misconfiguration. - [Accrue.SignatureError](Accrue.SignatureError.md): Raised when a webhook signature fails verification. This is NEVER returned as a tuple — a bad signature is either a misconfiguration or an attacker, and neither is recoverable at the call site. The webhook plug translates this raise into an HTTP 400. ## Mix Tasks - [mix accrue.gen.handler](Mix.Tasks.Accrue.Gen.Handler.md): Generates a host-owned Accrue webhook handler scaffold. Generated files are stamped with `# accrue:generated` by `Accrue.Install.Fingerprints`. - [mix accrue.install](Mix.Tasks.Accrue.Install.md): Generates host-owned Accrue wiring. - [mix accrue.mail.preview](Mix.Tasks.Accrue.Mail.Preview.md): Renders every `Accrue.Emails.*` type with canned fixtures (D6-08). - [mix accrue.webhooks.prune](Mix.Tasks.Accrue.Webhooks.Prune.md): Manually trigger the same retention sweep that `Accrue.Webhook.Pruner` runs on its Oban cron schedule. Useful for ops engineers who want to reclaim DB space without waiting for the next scheduled run. - [mix accrue.webhooks.replay](Mix.Tasks.Accrue.Webhooks.Replay.md): Requeue dead-lettered webhook events from the command line.