---
title: invoice.deleted
description: 주문이 취소되면 보내는 v1 이벤트예요.
sidebar:
  label: invoice.deleted
  order: 4
---

주문이 취소되면 보내요. v2에서는 주문을 지우지 않고 취소 상태로 바꾸는데, v1 웹훅은 이 취소를 예전 이름인 `invoice.deleted`로 보내요. v2 웹훅의 [`invoice.canceled`](/api-reference/webhooks/invoice-canceled)와 같은 시점이에요.

이런 경우에 보내요.

- [v1 주문 삭제](/api-reference/v1/invoices/delete)나 [v2 주문 취소](/api-reference/invoices/cancel) API를 호출했어요.
- 대시보드 **주문**에서 주문을 취소했어요.
- [카페24 연동](/cafe24) 주문이 입금 전에 카페24에서 취소됐어요.

결제 완료된 주문은 취소할 수 없으니 `invoice.paid`는 `false`예요.

## 페이로드

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `type` | string | `"invoice.deleted"` |
| `invoice` | object | 취소된 주문의 [주문 객체](/api-reference/v1/invoices/get#주문-객체)예요. |

```json
{
  "type": "invoice.deleted",
  "invoice": {
    "id": "ivc_a1b2c3d4e5f6g7h8i9j0k1l2",
    "issuerId": "acc_x9y8z7w6v5u4t3s2r1q0p9o8",
    "bankAccountIds": [],
    "customer": {
      "name": "홍길동",
      "email": null,
      "phoneNumber": null
    },
    "cashReceipt": null,
    "amount": 50000,
    "paid": false,
    "metadata": { "orderId": "ORDER-2026-0001" },
    "issuedAt": "2026-04-28T03:14:15.000+00:00",
    "expiresAt": "2026-04-29T03:14:15.000+00:00",
    "deletedAt": null
  }
}
```

## 처리 예시

내 시스템의 주문도 취소 상태로 바꿔서 상태를 맞춰요.

```js Node.js
if (event.type === "invoice.deleted") {
  const orderId = event.invoice.metadata?.orderId;
  if (orderId) {
    await db.orders.update(orderId, {
      status: "CANCELLED",
      cancelledAt: new Date(),
      cancelReason: "INVOICE_DELETED",
    });
  }
}
```
