Sale events deliver a SaleFatPayload as data.object. The same object shape is sent for every sale event - only the field values (status, net_amount, closed_at, commissions[]) change as the sale moves through its lifecycle.
Every webhook is wrapped in the standard envelope:
{
"event_id" : "evt_2a8a4634-4223-4d19-be31-0c4ee37b71e6" ,
"event_type" : "sale.created" ,
"api_version" : "2026-06-01" ,
"created_at" : "2026-06-20T12:12:44.650821Z" ,
"workspace_id" : "ws_7c448c98-390c-4994-abe8-21d0f7b899a8" ,
"livemode" : false ,
"data" : { "object" : { "object" : "sale" , "..." : "see Sale fields" } }
}
Base fields
These fields appear on the entity in every sale payload.
Field Type Nullable Notes objectstring No Always "sale". idstring No Sale UUID, sl_-prefixed. created_atdatetime Yes ISO 8601 entity creation timestamp. updated_atdatetime No ISO 8601 last-update timestamp.
Sale fields
Field Type Nullable Notes statusstring No paid, sent, cancelled, etc.sales_typestring No one_time, installment, invoice, or subscription.sale_modestring No payment_link or manual.approval_statusstring Yes approved or rejected once a reviewer has acted on the sale.approval_sourcestring Yes Who made the approval decision (e.g. reviewer). approved_byobject Yes The user who approved or rejected the sale: {object, id, first_name, last_name, email}. id is usr_-prefixed. approved_atdatetime Yes ISO 8601 timestamp of the approval or rejection decision. rejection_reasonstring Yes Reason given when the sale is rejected. null on sale.approved. currencystring No ISO currency code (e.g. USD). gross_amountstring (decimal) No Total sale amount, decimal string (e.g. "10000.00"). net_amountstring (decimal) Yes Net after fees. null until sale.paid. platform_feeobject No See platform_fee . bnplobject No See bnpl . productobject Yes {object, id, name, description, unit_price, currency, provider, is_active}. Emitted only as a nested object; there is no scalar product_id wire key.customerobject Yes {object, id, name, email, phone, provider, crm_source, created_at}. Emitted only as a nested object; there is no scalar customer_id wire key.setterobject Yes team_member (Variant B - carries department/is_active, no user_id). No scalar setter_id is emitted. See team_member .closerobject Yes team_member (Variant B). No scalar closer_id is emitted. See team_member .payment_linkobject Yes Payment-link details. Nullable - emitted as null when the sale has no payment link. providerstring Yes stripe, whop, fanbasis, manual, etc.payment_typestring Yes one_time, installment, down_payment, or full_payment.commissionsarray No Commission transaction objects, filtered to transaction_type == "commission_payment" entries. Empty [] on sale.created. refundsarray No Derived from commission_transactions where transaction_type == "refund_commission_adjustment". installments_summaryobject Yes {count, paid, pending, failed, down_payment_paid, ...}.installmentobject Yes Present on sale.paid for installment / down-payment payments. Serialized from the internal installment_record. closed_atdatetime Yes Set when the sale is paid/closed. null on sale.created.
These are the confirmed wire field names. The emitter renames its internal long-form names when serializing the payload: internal commission_transactions is split into commissions (only transaction_type == "commission_payment" entries) and the derived refunds[] (transaction_type == "refund_commission_adjustment" entries); internal payment_link_data is emitted as payment_link (nullable); and internal installment_record is emitted as installment. installments_summary and sale_mode are passed through. The field names in the table above match the actual emitted JSON.
sale.created
Fired when a sale is first created. At this point net_amount is null, closed_at is null, and commissions is an empty array - commission transactions are not generated until the sale is paid.
Full sale.created payload {
"event_id" : "evt_2a8a4634-4223-4d19-be31-0c4ee37b71e6" ,
"event_type" : "sale.created" ,
"api_version" : "2026-06-01" ,
"created_at" : "2026-06-20T12:12:44.650821Z" ,
"workspace_id" : "ws_7c448c98-390c-4994-abe8-21d0f7b899a8" ,
"livemode" : false ,
"data" : {
"object" : {
"object" : "sale" ,
"id" : "sl_6e7d79d1-3ea3-4965-95f8-8ce7f61bdb84" ,
"status" : "paid" ,
"sales_type" : "one_time" ,
"sale_mode" : "manual" ,
"currency" : "USD" ,
"gross_amount" : "10000.00" ,
"net_amount" : null ,
"platform_fee" : {
"total_amount" : 0 ,
"business_amount" : 0 ,
"team_amount" : 0 ,
"total_percent" : 1.0
},
"bnpl" : {
"provider" : "Random" ,
"percentage" : 11.0 ,
"fee_amount" : 1100.0 ,
"gross_revenue" : 10000.0 ,
"net_revenue" : 8900.0
},
"product" : {
"object" : "product" ,
"id" : "prd_48c63552-b1f7-426e-b588-a417aea90265" ,
"name" : "Testing Stripe prd 12 jan 4" ,
"description" : "... -> https://stg.itspaydai.com/success" ,
"unit_price" : "10000.00" ,
"currency" : "USD" ,
"provider" : "stripe" ,
"is_active" : true
},
"customer" : {
"object" : "customer" ,
"id" : "cus_6000483c-5cc2-485d-90dd-e56bde1a5242" ,
"name" : "Example" ,
"email" : "sdf@f.com" ,
"phone" : "" ,
"provider" : "stripe" ,
"crm_source" : "Paydai" ,
"created_at" : "2026-05-07T11:53:12.504Z"
},
"setter" : {
"object" : "team_member" ,
"id" : "tm_48ceb2c0-962e-4785-9b33-28fb674b4959" ,
"first_name" : "Setter" ,
"last_name" : "Raghu" ,
"email" : "sales_setter_p@gmail.com" ,
"roles" : [ "setter" ],
"department" : "sales" ,
"is_active" : true
},
"closer" : {
"object" : "team_member" ,
"id" : "tm_e1454f4d-5042-4a92-bce6-e55f4fb1c10a" ,
"first_name" : "Jay" ,
"last_name" : "Test" ,
"email" : "j.k.kradadiya+saastestcloser@gmail.com" ,
"roles" : [ "closer" ],
"department" : "sales" ,
"is_active" : true
},
"payment_link" : null ,
"provider" : "stripe" ,
"payment_type" : "one_time" ,
"commissions" : [],
"refunds" : [],
"installments_summary" : null ,
"installment" : null ,
"created_at" : "2026-06-20T12:12:42.745Z" ,
"closed_at" : null ,
"updated_at" : "2026-06-20T12:12:42.745Z"
},
"payment_type" : "one_time"
}
}
On sale.created, setter and closer carry the confirmed Variant B team_member shape - {object, id, first_name, last_name, email, roles, department, is_active} with no user_id. This differs from the commission contexts, which carry {user_id, roles}. When the full nested object is absent, the emitter sends a lean ref {object, id} instead. See team_member .
sale.paid
Fired when payment is confirmed. net_amount is now populated (e.g. "4482.00"), closed_at is set, and commissions is filled with one commission transaction per beneficiary.
Each element of commissions[] looks like this:
{
"object" : "commission_transaction" ,
"id" : "ct_4b6c455b-0000-0000-0000-000000000000" ,
"type" : "commission_payment" ,
"status" : "merchant_outstanding" ,
"amount" : "445.00" ,
"fee" : "0" ,
"net" : "445.0" ,
"currency" : "usd" ,
"refund_adjustment" : "0.00" ,
"sale_id" : "sl_6e7d79d1-3ea3-4965-95f8-8ce7f61bdb84" ,
"commission_rate" : 5.0 ,
"team_member" : {
"object" : "team_member" ,
"id" : "tm_48ceb2c0-962e-4785-9b33-28fb674b4959" ,
"user_id" : "usr_00000000-0000-0000-0000-000000000000" ,
"first_name" : "Setter" ,
"last_name" : "Raghu" ,
"email" : "sales_setter_p@gmail.com" ,
"roles" : [ "setter" ]
},
"installment" : null ,
"payout" : {
"date" : null ,
"transfer_id" : null ,
"paused" : false ,
"paused_until" : null
},
"idempotency_key" : "transfer_{sale_uuid}_{member_uuid}" ,
"created" : "2026-06-20T12:12:45.713Z" ,
"updated" : "2026-06-20T12:12:45.713Z"
}
See the full commission object reference on the commission payloads page.
sale.approved
Fired when a reviewer approves a sale. Uses the same SaleFatPayload shape; approval_status is approved, approved_by and approved_at identify the reviewer and the decision time, and rejection_reason is null. commissions[] holds the commission transactions generated for the sale.
Full sale.approved payload {
"event_id" : "evt_c699ec5a-51be-4358-9978-1d48b41768ec" ,
"event_type" : "sale.approved" ,
"api_version" : "2026-06-01" ,
"created_at" : "2026-09-25T06:48:49.073621Z" ,
"workspace_id" : "ws_9aee4b58-b607-4167-9b38-4b69e0334d1b" ,
"livemode" : false ,
"data" : {
"object" : {
"object" : "sale" ,
"id" : "sl_07eec785-3bca-492d-b3ce-66bae9e77a64" ,
"status" : "paid" ,
"sales_type" : "one_time" ,
"sale_mode" : "manual" ,
"currency" : "usd" ,
"approval_status" : "approved" ,
"approval_source" : "reviewer" ,
"approved_by" : {
"object" : "user" ,
"id" : "usr_73b9bcbc-6da6-4d39-b983-bc374ee3132d" ,
"first_name" : "User" ,
"last_name" : "" ,
"email" : "reviewer@example.com"
},
"approved_at" : "2026-09-25T06:48:47.973Z" ,
"rejection_reason" : null ,
"gross_amount" : 10000 ,
"net_amount" : 8500 ,
"platform_fee" : {
"total_amount" : 0 ,
"business_amount" : 0 ,
"team_amount" : 0 ,
"total_percent" : 1
},
"bnpl" : {
"provider" : null ,
"percentage" : null ,
"fee_amount" : null ,
"gross_revenue" : null ,
"net_revenue" : null
},
"product" : {
"object" : "product" ,
"id" : "prd_13f507f3-79e3-458a-8935-3d2544c32108" ,
"name" : "Test" ,
"description" : "Test" ,
"unit_price" : "10000.00" ,
"currency" : "usd" ,
"provider" : "whop" ,
"is_active" : true
},
"customer" : {
"object" : "customer" ,
"id" : "cus_bf2e7cf4-e222-4fc7-904d-811771958123" ,
"name" : "Testing User" ,
"email" : "customer@example.com" ,
"phone" : "" ,
"provider" : "stripe" ,
"crm_source" : "iclosed" ,
"created_at" : "2026-09-15T06:25:07.056Z"
},
"setter" : {
"object" : "team_member" ,
"id" : "tm_7021d9ca-9aea-45e7-ac85-ab1214575935" ,
"first_name" : "Divay" ,
"last_name" : "Profile" ,
"email" : "setter@example.com" ,
"roles" : [ "setter" ],
"department" : "sales" ,
"is_active" : true
},
"closer" : {
"object" : "team_member" ,
"id" : "tm_0f1bd55f-d630-4190-bcbd-7b7a2e53164b" ,
"first_name" : "Divay" ,
"last_name" : "Closer" ,
"email" : "closer@example.com" ,
"roles" : [ "closer" ],
"department" : "sales" ,
"is_active" : true
},
"payment_link" : null ,
"provider" : "whop" ,
"payment_type" : "one_time" ,
"commissions" : [
{
"object" : "commission_transaction" ,
"id" : "ct_b49e58c9-2937-4cb1-b591-759280415868" ,
"type" : "commission_payment" ,
"status" : "merchant_outstanding" ,
"amount" : "500.00" ,
"fee" : "0" ,
"net" : "500.0" ,
"currency" : "usd" ,
"refund_adjustment" : "0.00" ,
"sale_id" : "sl_07eec785-3bca-492d-b3ce-66bae9e77a64" ,
"commission_rate" : 5 ,
"team_member" : {
"object" : "team_member" ,
"id" : "tm_7021d9ca-9aea-45e7-ac85-ab1214575935" ,
"user_id" : "usr_63f60827-5d36-44a5-8154-67968caf07b5" ,
"first_name" : "Divay" ,
"last_name" : "Profile" ,
"email" : "setter@example.com" ,
"roles" : []
},
"installment" : null ,
"payout" : {
"date" : null ,
"transfer_id" : null ,
"paused" : false ,
"paused_until" : null
},
"idempotency_key" : "transfer_07eec785-3bca-492d-b3ce-66bae9e77a64_7021d9ca-9aea-45e7-ac85-ab1214575935" ,
"created" : "2026-09-25T06:48:47.982Z" ,
"updated" : "2026-09-25T06:48:47.982Z"
},
{
"object" : "commission_transaction" ,
"id" : "ct_359031fe-41cb-419a-b282-ee9b846e6c15" ,
"type" : "commission_payment" ,
"status" : "merchant_outstanding" ,
"amount" : "1000.00" ,
"fee" : "0" ,
"net" : "1000.0" ,
"currency" : "usd" ,
"refund_adjustment" : "0.00" ,
"sale_id" : "sl_07eec785-3bca-492d-b3ce-66bae9e77a64" ,
"commission_rate" : 10 ,
"team_member" : {
"object" : "team_member" ,
"id" : "tm_0f1bd55f-d630-4190-bcbd-7b7a2e53164b" ,
"user_id" : "usr_11c3a265-648e-4236-abc3-170b325802ec" ,
"first_name" : "Divay" ,
"last_name" : "Closer" ,
"email" : "closer@example.com" ,
"roles" : []
},
"installment" : null ,
"payout" : {
"date" : null ,
"transfer_id" : null ,
"paused" : false ,
"paused_until" : null
},
"idempotency_key" : "transfer_07eec785-3bca-492d-b3ce-66bae9e77a64_0f1bd55f-d630-4190-bcbd-7b7a2e53164b" ,
"created" : "2026-09-25T06:48:47.986Z" ,
"updated" : "2026-09-25T06:48:47.986Z"
}
],
"refunds" : [],
"installments_summary" : null ,
"installment" : null ,
"created_at" : "2026-09-25T06:48:32.570Z" ,
"closed_at" : null ,
"updated_at" : "2026-09-25T06:48:47.973Z"
},
"payment_type" : "one_time"
}
}
sale.rejected
Fired when a reviewer rejects a sale. Uses the same SaleFatPayload shape; approval_status is rejected, rejection_reason carries the reviewer's reason, and commissions[] is empty because no commission transactions are generated for a rejected sale.
Full sale.rejected payload {
"event_id" : "evt_c9499a9a-3f07-4350-8f42-5552a82fde18" ,
"event_type" : "sale.rejected" ,
"api_version" : "2026-06-01" ,
"created_at" : "2026-09-25T06:49:34.529768Z" ,
"workspace_id" : "ws_9aee4b58-b607-4167-9b38-4b69e0334d1b" ,
"livemode" : false ,
"data" : {
"object" : {
"object" : "sale" ,
"id" : "sl_1338a10a-3bd7-437e-83d8-f0bcca5f61e0" ,
"status" : "paid" ,
"sales_type" : "one_time" ,
"sale_mode" : "manual" ,
"currency" : "USD" ,
"approval_status" : "rejected" ,
"approval_source" : "reviewer" ,
"approved_by" : {
"object" : "user" ,
"id" : "usr_73b9bcbc-6da6-4d39-b983-bc374ee3132d" ,
"first_name" : "User" ,
"last_name" : "" ,
"email" : "reviewer@example.com"
},
"approved_at" : "2026-09-25T06:49:34.183Z" ,
"rejection_reason" : "N/A" ,
"gross_amount" : 40000 ,
"net_amount" : 32000 ,
"platform_fee" : {
"total_amount" : 0 ,
"business_amount" : 0 ,
"team_amount" : 0 ,
"total_percent" : 1
},
"bnpl" : {
"provider" : null ,
"percentage" : null ,
"fee_amount" : null ,
"gross_revenue" : null ,
"net_revenue" : null
},
"product" : {
"object" : "product" ,
"id" : "prd_bc3fd439-6aa4-4c6c-bc55-17e37f934980" ,
"name" : "1:1 Mem" ,
"description" : "1:1 Membership" ,
"unit_price" : "40000.00" ,
"currency" : "USD" ,
"provider" : "stripe" ,
"is_active" : true
},
"customer" : {
"object" : "customer" ,
"id" : "cus_7a82b31a-e073-4a7f-8dbb-5c1d4ab14afc" ,
"name" : "Example Customer" ,
"email" : "customer@example.com" ,
"phone" : null ,
"provider" : "stripe" ,
"crm_source" : "calendly" ,
"created_at" : "2026-08-18T12:53:15.577Z"
},
"setter" : {
"object" : "team_member" ,
"id" : "tm_7cf3e4a1-3ad5-493b-a4c4-cf7079c946de" ,
"first_name" : "Divay" ,
"last_name" : "Mohan" ,
"email" : "setter@example.com" ,
"roles" : [ "setter" ],
"department" : "sales" ,
"is_active" : true
},
"closer" : {
"object" : "team_member" ,
"id" : "tm_0f1bd55f-d630-4190-bcbd-7b7a2e53164b" ,
"first_name" : "Divay" ,
"last_name" : "Closer" ,
"email" : "closer@example.com" ,
"roles" : [ "closer" ],
"department" : "sales" ,
"is_active" : true
},
"payment_link" : null ,
"provider" : "stripe" ,
"payment_type" : "one_time" ,
"commissions" : [],
"refunds" : [],
"installments_summary" : null ,
"installment" : null ,
"created_at" : "2026-09-25T06:49:13.269Z" ,
"closed_at" : null ,
"updated_at" : "2026-09-25T06:49:34.183Z"
},
"payment_type" : "one_time"
}
}
sale.cancelled
Fired when a sale is cancelled. Uses the same SaleFatPayload shape as sale.paid, with status set to cancelled.
sale.payment.failed
Fired when a payment attempt fails. Uses the same SaleFatPayload shape; inspect status and the sale provider to determine the failure context.
Last modified on September 25, 2026