> ## Documentation Index
> Fetch the complete documentation index at: https://webhooks.docs.growcrm.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Refunds

> Payload reference for refund.created, refund.updated, refund.sundry and refund.deleted webhooks.

# Refunds

> New to webhooks? Start with **[Getting started](/getting-started)** (envelope, delivery, retries)
> and **[Verification](/verification)** (confirming a request came from Grow CRM). Those conventions
> apply to every event below and are not repeated here.

Refunds expose four keys: `refund.created`, `refund.updated`, `refund.deleted`, `refund.sundry`.
There is no `refund.activity` — refunds have no comments, attachments or logs in core.

A refund always belongs to exactly one payment, and a payment can have at most one refund.

## Refunds and payments fire together

A refund can be created or removed from **two** places — the Refunds section, or the refund button on
the Payments list. Both do the same thing, and both now fire the same events.

Refunding a payment produces **two** webhooks, describing two different facts:

| Event                                  | What it tells you                                                  |
| -------------------------------------- | ------------------------------------------------------------------ |
| `refund.created`                       | A refund record now exists, for this amount, against this payment. |
| `payment.updated` (`change: refunded`) | The payment's own status changed to `refunded`.                    |

Removing a refund likewise produces `refund.deleted` **and** `payment.updated`
(`change: refund_removed`, payment status back to `paid`). Subscribe to whichever fits your
integration — you do not need both.

## The refund object

Every key except `.deleted` carries this shape, either flat (`.created`) or nested under `refund`
(`.updated`/`.sundry`):

```json theme={null}
{
  "id": 31,
  "uniqueid": "k38fj2ma",
  "amount": "250.00",
  "date": "2026-07-31",
  "notes": "Duplicate charge",
  "payment_id": 118,
  "invoice": { "id": 402, "formatted_id": "INV-0402" },
  "client": { "id": 12, "name": "Acme Inc" },
  "dates": { "date": "2026-07-31", "created": "2026-07-31T09:00:00" },
  "tags": []
}
```

| Field        | Type             | Notes                                                                                                                                                           |
| ------------ | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`         | integer          | `refund_id`.                                                                                                                                                    |
| `uniqueid`   | string           | `refund_uniqueid`.                                                                                                                                              |
| `amount`     | string           | Decimal as string. Always the full payment amount — refunds are not partial.                                                                                    |
| `date`       | string           | Date only — duplicated in `dates.date`.                                                                                                                         |
| `notes`      | string\|null     |                                                                                                                                                                 |
| `payment_id` | integer          | The refunded payment.                                                                                                                                           |
| `invoice`    | object           | `{ id, formatted_id }` — copied from the payment.                                                                                                               |
| `client`     | object           | `{ id, name }` — copied from the payment.                                                                                                                       |
| `dates`      | object           | Both raw database values (`Refund` does not recast its timestamps), so `created` is `Y-m-d H:i:s`, not the ISO-with-microseconds format used by most resources. |
| `tags`       | array of strings |                                                                                                                                                                 |

## `refund.created`

Fires when a refund is created, from either the Refunds section or the Payments list. `data` is the
full refund object above.

```json theme={null}
{
  "event": "refund.created",
  "id": 31,
  "created": "2026-07-31T09:00:00+00:00",
  "data": {
    "id": 31,
    "uniqueid": "k38fj2ma",
    "amount": "250.00",
    "date": "2026-07-31",
    "notes": "Duplicate charge",
    "payment_id": 118,
    "invoice": { "id": 402, "formatted_id": "INV-0402" },
    "client": { "id": 12, "name": "Acme Inc" },
    "dates": { "date": "2026-07-31", "created": "2026-07-31 09:00:00" },
    "tags": []
  }
}
```

## `refund.updated`

Fires on a significant change. `data.change` tells you which; `data.refund` is the full object.

| `change` | Fires when                                                                                                         |
| -------- | ------------------------------------------------------------------------------------------------------------------ |
| `edited` | The refund edit form is saved. Only the date and notes are editable — the amount is fixed to the payment's amount. |

```json theme={null}
{
  "event": "refund.updated",
  "id": 31,
  "created": "2026-07-31T09:10:00+00:00",
  "data": {
    "change": "edited",
    "refund": { "id": 31, "date": "2026-08-01", "notes": "Corrected date", "...": "..." }
  }
}
```

## `refund.sundry`

Fires on a minor, cosmetic field edit. `data.field` names it; `data.refund` is the full object.

| `field` | Fires when                     |
| ------- | ------------------------------ |
| `tags`  | The refund's tags are changed. |

```json theme={null}
{
  "event": "refund.sundry",
  "id": 31,
  "created": "2026-07-31T09:12:00+00:00",
  "data": {
    "field": "tags",
    "refund": { "id": 31, "tags": ["disputed"], "...": "..." }
  }
}
```

## `refund.deleted`

Fires after the refund is deleted, from either the Refunds section or the Payments list. `data` is
just the id — the record no longer exists to describe.

Deleting from the Refunds section is a checkbox selection, so removing several refunds at once
delivers one event **per refund**, not one event containing a list.

```json theme={null}
{
  "event": "refund.deleted",
  "id": 31,
  "created": "2026-07-31T09:20:00+00:00",
  "data": { "id": 31 }
}
```
