# `PhoenixKit.Modules.Billing.WebhookProcessor`
[🔗](https://github.com/BeamLabEU/phoenix_kit/blob/v1.7.71/lib/modules/billing/utils/webhook_processor.ex#L1)

Processes normalized webhook events from payment providers.

This module handles the business logic for webhook events after they've
been verified and normalized by the provider modules. It ensures:

- **Idempotency**: Events are tracked by event_id to prevent double-processing
- **Error handling**: Failed events are logged with retry counts
- **Business logic**: Invoices are marked paid, receipts generated, etc.

## Event Types

- `checkout.completed` - Checkout session completed (payment succeeded)
- `checkout.expired` - Checkout session expired
- `payment.succeeded` - Direct payment succeeded (for saved cards)
- `payment.failed` - Payment failed
- `refund.created` - Refund was processed
- `setup.completed` - Setup session completed (card saved)

## Usage

    # Called by BillingWebhookController
    WebhookProcessor.process(normalized_event)

# `process`
[🔗](https://github.com/BeamLabEU/phoenix_kit/blob/v1.7.71/lib/modules/billing/utils/webhook_processor.ex#L46)

```elixir
@spec process(map()) :: {:ok, any()} | {:error, atom()}
```

Processes a normalized webhook event.

Checks for idempotency, processes the event, and logs the result.

## Returns

- `{:ok, result}` - Event processed successfully
- `{:error, :duplicate_event}` - Event already processed
- `{:error, reason}` - Processing failed

---

*Consult [api-reference.md](api-reference.md) for complete listing*
