# Tab closed

Webhook event: `tab.closed`

Fired when a tab is manually closed or administratively aborted. This is a lifecycle signal, not proof of payment; use tab.payment_completed for payment success.

Delivered payload:

```ts
{
  id: string // uuid
  event: "tab.closed"
  resource: "tab"
  resourceId: string
  timestamp: string // date-time
  apiVersion: "v1"
  data: {
    customFields?: Array<{
        fieldId: string
        key: string
        label: string
        group: string
        type: string
        value: unknown
        displayValue: string
        version: integer
        status: string
      }>
    metadata?: Record<string, unknown> | null
    tabId: string // uuid
    locationId: integer
    tableId?: string | null
    costCenterId?: integer | null
    totalAmount: integer
    state: "closed" | "aborted"
    reason?: string | null
    closedAt: string // date-time
  }
}
```
