Loopwise Docs
Webhooks

Payment Webhooks

Detailed information about payment webhook events including payment.paid and payment.refund.

payment.paid

The payment.paid event is triggered when a payment is successfully completed in the system.

Event Properties

FieldTypeDescription
idstringUnique identifier for the payment transaction
trade_nostringUnique trade number for the transaction
currencystringCurrency code (ISO 4217 format)
amountintegerTotal transaction amount
original_amountintegerOriginal transaction amount before refunds/adjustments
refunded_amountinteger or nullRefunded amount (null if no refund)
paid_atstringTimestamp of payment completion (ISO 8601 format, e.g. "2023-12-04T18:45:44+08:00" or "2023-12-04T10:45:44Z")
created_atstringTimestamp of transaction creation (ISO 8601 format)
refunded_atstring or nullTimestamp of refund if applicable (ISO 8601 format)
payment_statestringCurrent payment state (paid, refunding, refunded, failed)
payment_typestringPayment method (credit, web_atm, atm, cvs, line_pay)
affiliate_codestring or nullAssociated affiliate code
remarkstring or nullAdditional order notes

User Information

FieldTypeDescription
user.idstringUnique user identifier
user.emailstringUser's email address
user.namestringUser's name
user.phone_numberstringUser's phone number
user.third_party_idstringThird-party system user identifier

Payment Method Details

FieldTypeDescription
payment_method_details.last_fourstring or nullLast four digits of credit card (if applicable)
payment_method_details.brandstring or nullCredit card brand (if applicable)

The brand field can have the following values:

  • visa: Visa credit/debit card
  • mastercard: Mastercard credit/debit card
  • jcb: JCB credit card
  • unionpay: UnionPay card
  • amex: American Express card
  • dinersclub: Diners Club card
  • discover: Discover card
  • unknown: Card brand could not be determined

Line Items

Each item in the lineitems array contains:

FieldTypeDescription
namestringItem name
quantityintegerQuantity purchased
amountintegerCurrent amount for this item (may reflect partial or no refunds)
refunded_amountintegerRefunded amount for this item (0 if no refund applied to this item)
item_typestringItem type (CurriculumPlan, Ticket, MembershipPlan, DigitalProduct, OrderBump)
item_idstringUnique item identifier
item_slugstringURL-friendly item identifier
product_typestringProduct type (Course, Event, MembershipPlan, DigitalProduct)
product_idstringUnique product identifier
order_bump_detailsobject or nullAdditional details for OrderBump items (only present when item_type is "OrderBump")
metadataobject or nullCustom metadata key-value pairs for this item (only present when the External Metadata feature is enabled)

When item_type is "OrderBump", the order_bump_details field will be present with the following structure:

FieldTypeDescription
item_typestringType of the order bump item (e.g., "CurriculumPlan")
item_idstringUnique identifier of the order bump item
item_slugstringURL-friendly identifier of the order bump item

If item_type is not "OrderBump", the order_bump_details field will not be present in the lineitem.

The metadata field is a flat object of string key-value pairs. It is only present when your school has the External Metadata feature enabled and the item has metadata defined. Plan-level metadata takes precedence over product-level metadata when keys conflict.

Additional Information

FieldTypeDescription
couponobject or nullApplied coupon details
shipping_addressobjectShipping address information
invoiceobjectInvoice details
custom_dataarray of objectsCustom data fields
refund_historyarray of objects or nullHistory of refunds (if any)

For detailed descriptions of fields within nested objects (coupon, shipping_address, invoice, custom_data, refund_history), please refer to the full documentation.

Invoice Details

FieldTypeDescription
statestringInvoice state (e.g., "issued")
numberstringInvoice number
buyer_ubnstringBuyer's Unified Business Number (null for individual buyers)
buyer_namestringName of the buyer
categorystringInvoice category (b2b or b2c)
carrier_typestringType of carrier for e-invoice (member, certificate, or mobile)
carrier_numstringCarrier number for e-invoice (when applicable)
donationbooleanIndicates if the invoice is for donation (only for b2c)
love_codestringDonation institution code (only present when donation is true)

Notes:

  • The category field can be either "b2b" (business-to-business) or "b2c" (business-to-consumer).
  • The carrier_num field is only present when carrier_type is "certificate" or "mobile".
  • The donation field is only applicable when category is "b2c".
  • The love_code field is only present when donation is true.

Example Payload

Payment Data Structure
{
	"type": "payment.paid",
	"data": {
		"id": "550e8400-e29b-41d4-a716-446655440000",
		"user": {
			"id": "00f7407f-219e-4ada-9390-28934d7398d5",
			"email": "demo@kaik.io",
			"name": "Kaik",
			"phone_number": "+886911222333",
			"third_party_id": "123123"
		},
		"trade_no": "DEM2022053167602AF30",
		"currency": "TWD",
		"amount": 1800,
		"paid_at": "2022-05-31T11:28:31Z",
		"created_at": "2022-05-31T11:26:42Z",
		"refunded_at": null,
		"refunded_amount": null,
		"original_amount": 1800,
		"payment_state": "paid",
		"payment_type": "credit",
		"payment_method_details": {
			"last_four": "1234",
			"brand": "visa"
		},
		"affiliate_code": "newswebPAGE7",
		"remark": "Order note",
		"lineitems": [
			{
				"name": "Course Name 123",
				"quantity": 1,
				"amount": 500,
				"refunded_amount": 0,
				"item_type": "CurriculumPlan",
				"item_id": "51e07cb8-e450-4ed4-8b54-e0144d4da793",
				"item_slug": "test-slug",
				"product_type": "Course",
				"product_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
				"metadata": {
					"crm_id": "sample-crm_id",
					"source": "sample-source"
				}
			},
			{
				"name": "Course Name",
				"quantity": 1,
				"amount": 1000,
				"refunded_amount": 0,
				"item_type": "CurriculumPlan",
				"item_id": "f8a7b6c5-d4e3-2f1g-9h8i-7j6k5l4m3n2o",
				"item_slug": "test-slug",
				"product_type": "Course",
				"product_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef"
			},
			{
				"name": "Course Bonus Package",
				"quantity": 1,
				"amount": 300,
				"refunded_amount": 0,
				"item_type": "OrderBump",
				"item_id": "c5d6e7f8-g9h0-i1j2-k3l4-m5n6o7p8q9r0",
				"item_slug": "course-bonus-package",
				"product_type": "Course",
				"product_id": "s1t2u3v4-w5x6-y7z8-9a0b-c1d2e3f4g5h6",
				"order_bump_details": {
					"item_type": "CurriculumPlan",
					"item_id": "h8i9j0k1-l2m3-n4o5-p6q7-r8s9t0u1v2w3",
					"item_slug": "course-bonus-package"
				}
			}
		],
		"refund_history": [],
		"coupon": {
			"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
			"name": "30% Off",
			"code": "30p-OFF"
		},
		"shipping_address": {
			"city": "Taipei",
			"district": "Songshan District",
			"postal_code": "105065",
			"address": "xxxxx",
			"full_address": "105065 Taipei City, Songshan District, xxx"
		},
		"invoice": {
			"state": "issued",
			"number": "BL90912974",
			"buyer_ubn": null,
			"buyer_name": "Kaik Demo",
			"category": "b2c",
			"carrier_type": "mobile",
			"carrier_num": "/0000001",
			"donation": false,
			"love_code": null
		},
		"custom_data": [
			{
				"field_id": "xxxxxx",
				"label": "Field One Name",
				"type": "multi_select",
				"values": ["A", "B"],
				"position": 0
			},
			{
				"field_id": "xxxxxx",
				"label": "Field Two Name",
				"type": "radio",
				"values": ["1"],
				"position": 1
			},
			{
				"field_id": "xxxxxx",
				"label": "Field Three Name",
				"type": "text",
				"values": ["xxxxx"],
				"position": 2
			}
		]
	}
}

payment.refund

The payment.refund event is triggered when a refund is processed for a payment in the system.

Event Properties

FieldTypeDescription
idstringUnique identifier for the payment transaction
trade_nostringUnique trade number for the transaction
currencystringCurrency code (ISO 4217 format)
amountintegerCurrent transaction amount after refund
original_amountintegerOriginal transaction amount before refund
refunded_amountintegerTotal refunded amount
paid_atstringTimestamp of original payment completion (ISO 8601 format, e.g. "2023-12-04T18:45:44+08:00" or "2023-12-04T10:45:44Z")
created_atstringTimestamp of transaction creation (ISO 8601 format)
refunded_atstringTimestamp of latest refund (ISO 8601 format)
payment_statestringCurrent payment state (refunding, refunded)
payment_typestringOriginal payment method (credit, web_atm, atm, cvs, line_pay)
affiliate_codestring or nullAssociated affiliate code
remarkstring or nullAdditional order notes

User Information

FieldTypeDescription
user.idstringUnique user identifier
user.emailstringUser's email address
user.namestringUser's name
user.phone_numberstringUser's phone number
user.third_party_idstringThird-party system user identifier

Refund History

Each item in the refund_history array contains:

FieldTypeDescription
amountintegerRefunded amount
refunded_atstringTimestamp of this refund
reasonstringReason provided for refund

The refund_history field is an array of objects or null. Each object in the array represents a refund transaction and contains the following properties:

  • amount: An integer representing the refunded amount.
  • refunded_at: A string containing the timestamp of the refund in the format "YYYY-MM-DD HH:MM:SS +HHMM".
  • reason: A string explaining the reason for the refund.

Payment Method Details

FieldTypeDescription
payment_method_details.last_fourstring or nullLast four digits of credit card (if applicable)
payment_method_details.brandstring or nullCredit card brand (if applicable)

The brand field can have the following values:

  • visa: Visa credit/debit card
  • mastercard: Mastercard credit/debit card
  • jcb: JCB credit card
  • unionpay: UnionPay card
  • amex: American Express card
  • dinersclub: Diners Club card
  • discover: Discover card
  • unknown: Card brand could not be determined

Line Items

Each item in the lineitems array contains:

FieldTypeDescription
namestringItem name
quantityintegerQuantity purchased
amountintegerOriginal amount for this item
refunded_amountintegerRefunded amount for this item
item_typestringItem type (CurriculumPlan, Ticket, MembershipPlan, DigitalProduct, OrderBump)
item_idstringUnique item identifier
item_slugstringURL-friendly item identifier
product_typestringProduct type (Course, Event, MembershipPlan, DigitalProduct)
product_idstringUnique product identifier
order_bump_detailsobject or nullAdditional details for OrderBump items (only present when item_type is "OrderBump")
metadataobject or nullCustom metadata key-value pairs for this item (only present when the External Metadata feature is enabled)

When item_type is "OrderBump", the order_bump_details field will be present with the following structure:

FieldTypeDescription
item_typestringType of the order bump item (e.g., "CurriculumPlan")
item_idstringUnique identifier of the order bump item
item_slugstringURL-friendly identifier of the order bump item

If item_type is not "OrderBump", the order_bump_details field will not be present in the lineitem.

The metadata field is a flat object of string key-value pairs. It is only present when your school has the External Metadata feature enabled and the item has metadata defined. Plan-level metadata takes precedence over product-level metadata when keys conflict.

Additional Information

FieldTypeDescription
couponobject or nullApplied coupon details
shipping_addressobjectShipping address information
invoiceobjectInvoice details
custom_dataarray of objectsCustom data fields
refund_historyarray of objects or nullHistory of refunds (if any)

For detailed descriptions of fields within nested objects (coupon, shipping_address, invoice, custom_data, refund_history), please refer to the full documentation.

Invoice Details

FieldTypeDescription
statestringInvoice state (e.g., "issued")
numberstringInvoice number
buyer_ubnstringBuyer's Unified Business Number (null for individual buyers)
buyer_namestringName of the buyer
categorystringInvoice category (b2b or b2c)
carrier_typestringType of carrier for e-invoice (member, certificate, or mobile)
carrier_numstringCarrier number for e-invoice (when applicable)
donationbooleanIndicates if the invoice is for donation (only for b2c)
love_codestringDonation institution code (only present when donation is true)

Notes:

  • The category field can be either "b2b" (business-to-business) or "b2c" (business-to-consumer).
  • The carrier_num field is only present when carrier_type is "certificate" or "mobile".
  • The donation field is only applicable when category is "b2c".
  • The love_code field is only present when donation is true.

Example Payload

Refund Data Structure
{
	"type": "payment.refund",
	"data": {
		"id": "550e8400-e29b-41d4-a716-446655440000",
		"user": {
			"id": "00f7407f-219e-4ada-9390-28934d7398d5",
			"email": "demo@kaik.io",
			"name": "Kaik",
			"phone_number": "+886911222333",
			"third_party_id": "123123"
		},
		"trade_no": "DEM2022053167602AF30",
		"currency": "TWD",
		"amount": 1450,
		"paid_at": "2022-05-31T11:28:31Z",
		"created_at": "2022-05-31T11:26:42Z",
		"refunded_at": "2022-06-01T14:30:00Z",
		"refunded_amount": 350,
		"original_amount": 1800,
		"payment_state": "refunded",
		"payment_type": "credit",
		"payment_method_details": {
			"last_four": "1234",
			"brand": "visa"
		},
		"affiliate_code": "newswebPAGE7",
		"remark": "Order note",
		"lineitems": [
			{
				"name": "Course Name 123",
				"quantity": 1,
				"amount": 400,
				"refunded_amount": 100,
				"item_type": "CurriculumPlan",
				"item_id": "51e07cb8-e450-4ed4-8b54-e0144d4da793",
				"item_slug": "test-slug",
				"product_type": "Course",
				"product_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
				"metadata": {
					"crm_id": "sample-crm_id",
					"source": "sample-source"
				}
			},
			{
				"name": "Course Name",
				"quantity": 1,
				"amount": 800,
				"refunded_amount": 200,
				"item_type": "CurriculumPlan",
				"item_id": "f8a7b6c5-d4e3-2f1g-9h8i-7j6k5l4m3n2o",
				"item_slug": "test-slug",
				"product_type": "Course",
				"product_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef"
			},
			{
				"name": "Course Bonus Package",
				"quantity": 1,
				"amount": 250,
				"refunded_amount": 50,
				"item_type": "OrderBump",
				"item_id": "c5d6e7f8-g9h0-i1j2-k3l4-m5n6o7p8q9r0",
				"item_slug": "course-bonus-package",
				"product_type": "Course",
				"product_id": "s1t2u3v4-w5x6-y7z8-9a0b-c1d2e3f4g5h6",
				"order_bump_details": {
					"item_type": "CurriculumPlan",
					"item_id": "h8i9j0k1-l2m3-n4o5-p6q7-r8s9t0u1v2w3",
					"item_slug": "course-bonus-package"
				}
			}
		],
		"refund_history": [
			{
				"amount": 350,
				"refunded_at": "2022-06-01T14:30:00Z",
				"reason": "Partial refund requested by customer"
			}
		],
		"coupon": {
			"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
			"name": "30% Off",
			"code": "30p-OFF"
		},
		"shipping_address": {
			"city": "Taipei",
			"district": "Songshan District",
			"postal_code": "105065",
			"address": "xxxxx",
			"full_address": "105065 Taipei City, Songshan District, xxx"
		},
		"invoice": {
			"state": "issued",
			"number": "BL90912974",
			"buyer_ubn": null,
			"buyer_name": "Kaik Demo",
			"category": "b2c",
			"carrier_type": "mobile",
			"carrier_num": "/0000001",
			"donation": false,
			"love_code": null
		},
		"custom_data": [
			{
				"field_id": "xxxxxx",
				"label": "Field One Name",
				"type": "multi_select",
				"values": ["A", "B"],
				"position": 0
			},
			{
				"field_id": "xxxxxx",
				"label": "Field Two Name",
				"type": "radio",
				"values": ["1"],
				"position": 1
			},
			{
				"field_id": "xxxxxx",
				"label": "Field Three Name",
				"type": "text",
				"values": ["xxxxx"],
				"position": 2
			}
		]
	}
}

On this page