invoice.expired
입금 기한이 지나 주문이 만료되면 보내는 이벤트예요.
결제 대기 주문의 입금 기한(expiresAt)이 지나면 페이싱크가 1분 안에 주문을 EXPIRED로 바꾸고 이 이벤트를 보내요. 입금 기한 없이 만든 주문은 만료되지 않아요.
만료된 주문은 자동 매칭에서 빠져요. 만료 뒤에 들어온 입금은 매칭되지 않은 입금으로 남고, failureReason이 ONLY_EXPIRED예요. 대시보드에서 직접 매칭하거나 결제 완료 처리하면 invoice.paid가 와요.
카페24 연동으로 만든 주문은 쇼핑몰 설정에 따라 카페24 주문도 취소해요.
페이로드
data는 만료된 주문 페이로드예요. status는 EXPIRED이고 expiredAt이 있어요.
{
"id": "evt_c2d3e4f5g6h7i8j9k0l1m2n3",
"type": "invoice.expired",
"timestamp": "2026-04-29T03:14:40Z",
"data": {
"id": "ivc_a1b2c3d4e5f6g7h8i9j0k1l2",
"number": 1043,
"status": "EXPIRED",
"customer": {
"name": "홍길동",
"email": null,
"phoneNumber": null
},
"amount": 50000,
"paidAmount": null,
"amountDiff": null,
"bankAccountIds": [],
"cashReceipt": null,
"metadata": { "orderId": "ORDER-2026-0001" },
"source": "API",
"createdAt": "2026-04-28T03:14:15Z",
"updatedAt": "2026-04-29T03:14:40Z",
"expiresAt": "2026-04-29T03:14:15Z",
"paidAt": null,
"paidTrigger": null,
"matchedTransactionId": null,
"canceledAt": null,
"cancelReason": null,
"expiredAt": "2026-04-29T03:14:40Z",
"reopenedAt": null
}
}
처리 예시
if (event.type === "invoice.expired") {
const orderId = event.data.metadata.orderId;
if (orderId) {
await db.orders.update(orderId, { status: "EXPIRED" });
await notifyCustomer(orderId, "입금 기한이 지나 주문이 취소됐어요.");
}
}