Quote Webhook Events Reference
This reference provides the full payload structure and a JSON example for every webhook event published for the Quote entity.
For the list of Quote events and what triggers them, see Webhooks Overview.
Optional FieldsFields with no value in DealHub are omitted from the event payload entirely. This applies to every event described below.
Draft Quote (draftQuote)
draftQuote)Published when a user creates a quote and saves it as a draft, or opens an existing draft and modifies it. This can happen via an API call, when a user explicitly creates or modifies a quote, or when a user duplicates an existing quote.
{
"event": "draftQuote",
"status": "Draft",
"quote_upgrade_required": false,
"newly_created_quote": true,
"external_opportunity_id": "786865656565",
"external_quote_id": "",
"external_customer_id": "65545425413",
"dealhub_opportunity_id": "2323232565685498",
"dealhub_quote_id": "6563232565685498",
"primary_quote": false,
"executed_by": "[email protected]",
"impersonated_by": "",
"execution_date": "2021-10-22 16:39:08",
"sync_flag": true,
"quote_summary": {
"currency": "USD",
"total_list_price": 4600.00,
"total_net_price": 3000.00,
"total_discount": 34.78,
"sales_discount": 34.78
},
"additional_data": [
{ "q1": "some text" },
{ "q2": "red;green;blue" },
{ "q3": "" }
]
}The table below describes each field in the payload:
| Field | Description | Can be omitted | Valid Values / Format |
|---|---|---|---|
event | Business event type | No | "draftQuote" |
status | Status of the quote | No | "Draft" |
quote_upgrade_required | Indicates the quote needs to be "upgraded". When true, the user should open the quote, review it against the new active Version, and save the changes. | No | true, false |
newly_created_quote | true for a newly created quote; false for an update to an already-existing draft quote. | No | true, false |
external_opportunity_id | External opportunity ID (CRM opportunity ID provided during the create-quote call) | No | |
external_quote_id | External quote ID (as provided during the create-quote call) | Yes | |
external_customer_id | External customer ID (CRM customer ID) | No | |
dealhub_opportunity_id | DealHub opportunity ID | No | 16 chars |
dealhub_quote_id | DealHub quote ID | No | 16 chars |
primary_quote | Primary quote flag | No | true, false |
executed_by | User login | No | |
impersonated_by | Login of the admin, if they performed the action on behalf of another user | Yes | |
execution_date | GMT date/time of quote creation or update | No | yyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44 |
sync_flag | Whether the user requested to sync quote data back to the CRM when saving the draft quote | No | true, false |
quote_summary.currency | Quote currency | No | ISO-4217 |
quote_summary.total_list_price | Total list price of the quote | No | |
quote_summary.total_net_price | Total net price of the quote | No | |
quote_summary.total_discount | Total discount on the quote | No | |
quote_summary.sales_discount | Total discount provided by the seller | No | |
additional_data | List of playbook question/answer pairs, custom per account. Each element is a key/value pair; multi-select answers are semicolon-separated. | Yes |
Primary Quote (primaryQuote)
primaryQuote)Published once a user or system marks a quote as the "Primary" quote. A quote can be marked primary at any point in its lifecycle, and only one quote per opportunity can be primary at a time. If Quote-A was primary and the user now marks Quote-B as primary, DealHub only sends primaryQuote for Quote-B — there is no separate event for Quote-A losing that status; the consuming system must infer it.
{
"event": "primaryQuote",
"status": "Draft",
"external_opportunity_id": "786865656565",
"external_quote_id": "",
"external_customer_id": "65545425413",
"dealhub_opportunity_id": "2323232565685498",
"dealhub_quote_id": "6563232565685498",
"executed_by": "[email protected]",
"impersonated_by": "",
"execution_date": "2021-10-22 16:39:08",
"quote_summary": {
"currency": "USD",
"total_list_price": 4600.00,
"total_net_price": 3000.00,
"total_discount": 34.78,
"sales_discount": 34.78
},
"additional_data": [
{ "q1": "some text" },
{ "q2": "red;green;blue" },
{ "q3": "" }
]
}The table below describes each field in the payload:
| Field | Description | Can be omitted | Valid Values / Format |
|---|---|---|---|
event | Business event type | No | "primaryQuote" |
status | Status of the quote | No | Draft, ApprovalProcess, ReadyToBeSent, Rejected, Recalled, Published, Won |
external_opportunity_id | External opportunity ID | No | |
external_quote_id | External quote ID | Yes | |
external_customer_id | External customer ID | No | |
dealhub_opportunity_id | DealHub opportunity ID | No | 16 chars |
dealhub_quote_id | DealHub quote ID | No | 16 chars |
executed_by | User login | No | |
impersonated_by | Login of the admin, if they performed the action on behalf of another user | Yes | |
execution_date | GMT date/time of the quote submission | No | yyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44 |
quote_summary.currency | Quote currency | No | ISO-4217 |
quote_summary.total_list_price | Total list price of the quote | No | |
quote_summary.total_net_price | Total net price of the quote | No | |
quote_summary.total_discount | Total discount on the quote | No | |
quote_summary.sales_discount | Total discount provided by the seller | No | |
additional_data | List of playbook question/answer pairs, custom per account. Each element is a key/value pair; multi-select answers are semicolon-separated. | Yes |
Quote Pending Approval (quotePendingApproval)
quotePendingApproval)Published when a user submits a quote that requires approval, and again each time an approver approves their part of the flow. If a user creates a quote, answers all relevant playbook questions, and submits it in one motion, DealHub publishes only quotePendingApproval — draftQuote is not sent in that case. The approval_details object is populated as the approval flow progresses.
{
"event": "quotePendingApproval",
"status": "ApprovalProcess",
"newly_created_quote": false,
"external_opportunity_id": "786865656565",
"external_quote_id": "",
"external_customer_id": "65545425413",
"dealhub_opportunity_id": "2323232565685498",
"dealhub_quote_id": "6563232565685498",
"primary_quote": true,
"executed_by": "[email protected]",
"impersonated_by": "",
"execution_date": "2021-10-22 16:39:08",
"note_for_approval": "some note",
"quote_summary": {
"currency": "USD",
"total_list_price": 4600.00,
"total_net_price": 3000.00,
"total_discount": 34.78,
"sales_discount": 34.78
},
"approval_details": {
"status": "approved",
"reviewed_by": "[email protected]",
"impersonated_by": "[email protected]",
"review_date": "2021-10-22 16:39:08",
"reviewer_comment": ""
},
"additional_data": [
{ "system_name1.group_id.question_id": "some text" },
{ "group_id1.q_id2": "red;green;blue" },
{ "q3": "" }
]
}The table below describes each field in the payload:
| Field | Description | Can be omitted | Valid Values / Format |
|---|---|---|---|
event | Business event type | No | "quotePendingApproval" |
status | Status of the quote | No | "ApprovalProcess" |
newly_created_quote | true if the user submitted a newly created quote; false if they submitted an existing draft quote. | No | true, false |
external_opportunity_id | External opportunity ID | No | |
external_quote_id | External quote ID | Yes | |
external_customer_id | External customer ID | No | |
dealhub_opportunity_id | DealHub opportunity ID | No | 16 chars |
primary_quote | Primary quote flag | No | true, false |
dealhub_quote_id | DealHub quote ID | No | 16 chars |
executed_by | Login of the user who submitted the quote | No | |
impersonated_by | Login of the admin, if they switched to another user's login and submitted the quote | Yes | |
execution_date | GMT date/time of the quote submission | No | yyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44 |
note_for_approval | Note the submitter added for the approvers | Yes | Up to 3000 chars |
quote_summary.currency | Quote currency | No | ISO-4217 |
quote_summary.total_list_price | Total list price of the quote | No | |
quote_summary.total_net_price | Total net price of the quote | No | |
quote_summary.total_discount | Total discount on the quote | No | |
quote_summary.sales_discount | Total discount provided by the seller | No | |
approval_details | Details of this approval step | Yes | |
approval_details.status | Status of this step within the approval flow | No | "approved" |
approval_details.reviewed_by | Login of the approving/rejecting person | No | |
approval_details.impersonated_by | Login of the person who approved/rejected on behalf of the approver | Yes | |
approval_details.review_date | Time of the approval/rejection | No | yyyy-mm-dd hh:mm:ss |
approval_details.reviewer_comment | Note the reviewer added during approval/rejection | Yes | |
additional_data | List of playbook question/answer pairs, custom per account. Each element is a key/value pair; multi-select answers are semicolon-separated. | Yes |
Quote Ready (quoteReady)
quoteReady)Published once a quote is ready to be shared with the customer. This occurs when: a newly created quote requiring no approval is submitted; an existing draft quote requiring no approval is submitted; or a quote is fully approved (in which case approval_details reflects the last approver).
{
"event": "quoteReady",
"status": "ReadyToBeSent",
"newly_created_quote": false,
"external_opportunity_id": "786865656565",
"external_quote_id": "",
"external_customer_id": "65545425413",
"dealhub_opportunity_id": "2323232565685498",
"dealhub_quote_id": "6563232565685498",
"primary_quote": true,
"quote_summary": {
"currency": "USD",
"total_list_price": 4600.00,
"total_net_price": 3000.00,
"total_discount": 34.78,
"sales_discount": 34.78
},
"approval_details": {
"status": "approved",
"reviewed_by": "[email protected]",
"impersonated_by": "[email protected]",
"review_date": "2021-10-22 16:39:08",
"reviewer_comment": ""
},
"additional_data": [
{ "q1": "some text" },
{ "q2": "red;green;blue" },
{ "q3": "" }
]
}The table below describes each field in the payload:
| Field | Description | Can be omitted | Valid Values / Format |
|---|---|---|---|
event | Business event type | No | "quoteReady" |
status | Status of the quote | No | "ReadyToBeSent" |
newly_created_quote | true if the user submitted a newly created quote that didn't need approval. | No | true, false |
external_opportunity_id | External opportunity ID | No | |
external_quote_id | External quote ID | Yes | |
external_customer_id | External customer ID | No | |
dealhub_opportunity_id | DealHub opportunity ID | No | 16 chars |
dealhub_quote_id | DealHub quote ID | No | 16 chars |
primary_quote | Primary quote flag | No | true, false |
executed_by | Login of the user who submitted the quote | Yes | Present only when the user submitted a draft quote that needed no approval |
impersonated_by | Login of the admin, if they switched to another user's login and submitted the quote | Yes | Present only when the user submitted a draft quote that needed no approval |
execution_date | GMT date/time of the quote submission | Yes | Present only when the user submitted a draft quote that needed no approval |
quote_summary.currency | Quote currency | No | ISO-4217 |
quote_summary.total_list_price | Total list price of the quote | No | |
quote_summary.total_net_price | Total net price of the quote | No | |
quote_summary.total_discount | Total discount on the quote | No | |
quote_summary.sales_discount | Total discount provided by the seller | No | |
approval_details.status | Status of this step within the approval flow | No | "approved" |
approval_details.reviewed_by | Login of the approving/rejecting person | No | |
approval_details.impersonated_by | Login of the person who approved/rejected on behalf of the approver | Yes | |
approval_details.review_date | Time of the approval/rejection | No | yyyy-mm-dd hh:mm:ss |
approval_details.reviewer_comment | Note the reviewer added during approval/rejection | Yes | |
additional_data | List of playbook question/answer pairs, custom per account. Each element is a key/value pair; multi-select answers are semicolon-separated. | Yes |
Quote Rejected (quoteRejected)
quoteRejected)Published when an approver rejects the quote.
{
"event": "quoteRejected",
"status": "Rejected",
"external_opportunity_id": "786865656565",
"external_quote_id": "",
"external_customer_id": "65545425413",
"dealhub_opportunity_id": "2323232565685498",
"dealhub_quote_id": "6563232565685498",
"primary_quote": true,
"approval_details": {
"status": "rejected",
"reviewed_by": "[email protected]",
"impersonated_by": "",
"review_date": "2021-10-24 09:39:08",
"reviewer_comment": "Low revenue."
},
"additional_data": [
{ "q1": "some text" },
{ "q3": "" }
]
}The table below describes each field in the payload:
| Field | Description | Can be omitted | Valid Values / Format |
|---|---|---|---|
event | Business event type | No | "quoteRejected" |
status | Status of the quote | No | "Rejected" |
external_opportunity_id | External opportunity ID | No | |
external_quote_id | External quote ID | Yes | |
external_customer_id | External customer ID | No | |
dealhub_opportunity_id | DealHub opportunity ID | No | 16 chars |
dealhub_quote_id | DealHub quote ID | No | 16 chars |
primary_quote | Primary quote flag | No | true, false |
approval_details.status | Status of this step within the approval flow | No | "rejected" |
approval_details.reviewed_by | Login of the approving/rejecting person | No | |
approval_details.impersonated_by | Login of the person who approved/rejected on behalf of the approver | Yes | |
approval_details.review_date | Time of the approval/rejection | No | yyyy-mm-dd hh:mm:ss |
approval_details.reviewer_comment | Note the reviewer added during the rejection | No | |
additional_data | List of playbook question/answer pairs, custom per account. Each element is a key/value pair; multi-select answers are semicolon-separated. | Yes |
Quote Recalled (quoteRecalled)
quoteRecalled)Published once a user explicitly requests to cancel (recall) the quote.
{
"event": "quoteRecalled",
"status": "Recalled",
"external_opportunity_id": "786865656565",
"external_quote_id": "",
"external_customer_id": "65545425413",
"dealhub_opportunity_id": "2323232565685498",
"dealhub_quote_id": "6563232565685498",
"primary_quote": true,
"executed_by": "[email protected]",
"impersonated_by": "",
"execution_date": "2021-10-22 16:39:08",
"additional_data": [
{ "q1": "some text" },
{ "q2": "red;green;blue" },
{ "q3": "" }
]
}The table below describes each field in the payload:
| Field | Description | Can be omitted | Valid Values / Format |
|---|---|---|---|
event | Business event type | No | "quoteRecalled" |
status | Quote status | No | "Recalled" |
external_opportunity_id | External opportunity ID | No | |
external_quote_id | External quote ID | Yes | |
external_customer_id | External customer ID | No | |
dealhub_opportunity_id | DealHub opportunity ID | No | 16 chars |
dealhub_quote_id | DealHub quote ID | No | 16 chars |
primary_quote | Primary quote flag | No | true, false |
executed_by | Login of the user who recalled the quote | No | |
impersonated_by | Login of the admin, if they performed the action on behalf of another user | Yes | |
execution_date | GMT date/time of the recall | No | yyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44 |
additional_data | List of playbook question/answer pairs, custom per account. Each element is a key/value pair; multi-select answers are semicolon-separated. | Yes |
Quote Published (quotePublished)
quotePublished)Published once the quote is published to a DealRoom.
{
"event": "quotePublished",
"status": "Published",
"external_opportunity_id": "786865656565",
"external_quote_id": "",
"external_customer_id": "65545425413",
"dealhub_opportunity_id": "2323232565685498",
"dealhub_quote_id": "6563232565685498",
"primary_quote": true,
"executed_by": "[email protected]",
"impersonated_by": "",
"execution_date": "2021-10-22 16:39:08",
"dealroom_id": "657657676898",
"dealroom_url": "http://dealroom.dealhub.io",
"additional_data": [
{ "q1": "some text" },
{ "q2": "red;green;blue" },
{ "q3": "" }
]
}The table below describes each field in the payload:
| Field | Description | Can be omitted | Valid Values / Format |
|---|---|---|---|
event | Business event type | No | "quotePublished" |
status | Status of the quote | No | "Published" |
external_opportunity_id | External opportunity ID | No | |
external_quote_id | External quote ID | Yes | |
external_customer_id | External customer ID | No | |
dealhub_opportunity_id | DealHub opportunity ID | No | 16 chars |
dealhub_quote_id | DealHub quote ID | No | 16 chars |
primary_quote | Primary quote flag | No | true, false |
executed_by | Login of the user who published the quote | No | |
impersonated_by | Login of the admin, if they performed the action on behalf of another user | Yes | |
execution_date | GMT date/time the quote was published | No | yyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44 |
dealroom_id | ID of the quote's DealRoom | No | 16 chars |
dealroom_url | URL of the quote's DealRoom | No | |
additional_data | List of playbook question/answer pairs, custom per account. Each element is a key/value pair; multi-select answers are semicolon-separated. | Yes |
Quote Unpublished (quoteUnpublished)
quoteUnpublished)Published if a user unpublishes the DealRoom.
{
"event": "quoteUnpublished",
"status": "ReadyToBeSent",
"external_opportunity_id": "786865656565",
"external_quote_id": "",
"external_customer_id": "65545425413",
"dealhub_opportunity_id": "2323232565685498",
"dealhub_quote_id": "6563232565685498",
"primary_quote": true,
"executed_by": "[email protected]",
"impersonated_by": "",
"execution_date": "2021-10-22 16:39:08",
"dealroom_id": "657657676898",
"additional_data": [
{ "q1": "some text" },
{ "q2": "red;green;blue" },
{ "q3": "" }
]
}The table below describes each field in the payload:
| Field | Description | Can be omitted | Valid Values / Format |
|---|---|---|---|
event | Business event type | No | "quoteUnpublished" |
status | Status of the quote | No | "ReadyToBeSent" |
external_opportunity_id | External opportunity ID | No | |
external_quote_id | External quote ID | Yes | |
external_customer_id | External customer ID | No | |
dealhub_opportunity_id | DealHub opportunity ID | No | 16 chars |
dealhub_quote_id | DealHub quote ID | No | 16 chars |
primary_quote | Primary quote flag | No | true, false |
executed_by | Login of the user who unpublished the quote | No | |
impersonated_by | Login of the admin, if they performed the action on behalf of another user | Yes | |
execution_date | GMT date/time of the unpublishing | No | yyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44 |
dealroom_id | ID of the quote's DealRoom | No | 16 chars |
additional_data | List of playbook question/answer pairs, custom per account. Each element is a key/value pair; multi-select answers are semicolon-separated. | Yes |
Quote Won (quoteWon)
quoteWon)Published once the quote is signed, either via DealRoom or externally.
{
"event": "quoteWon",
"status": "Won",
"external_opportunity_id": "786865656565",
"external_quote_id": "",
"external_customer_id": "65545425413",
"dealhub_opportunity_id": "2323232565685498",
"dealhub_quote_id": "6563232565685498",
"primary_quote": true,
"execution_date": "2021-10-22 16:39:08",
"executed_by": "[email protected]",
"impersonated_by": "",
"additional_data": [
{ "q1": "some text" },
{ "q2": "red;green;blue" },
{ "q3": "" }
]
}The table below describes each field in the payload:
| Field | Description | Can be omitted | Valid Values / Format |
|---|---|---|---|
event | Business event type | No | "quoteWon" |
status | Quote status | No | "Won" |
external_opportunity_id | External opportunity ID | No | |
external_quote_id | External quote ID | Yes | |
external_customer_id | External customer ID | No | |
dealhub_opportunity_id | DealHub opportunity ID | No | 16 chars |
dealhub_quote_id | DealHub quote ID | No | 16 chars |
primary_quote | Primary quote flag | No | true, false |
execution_date | GMT date/time the quote was signed | No | yyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44 |
executed_by | Login of the user, if they explicitly confirmed the quote was signed externally; otherwise "SYSTEM" (e.g. when all DealRoom signers signed the contract) | Yes | "SYSTEM" or a user login |
impersonated_by | Login of the admin, if they performed the action on behalf of another user | Yes | |
additional_data | List of playbook question/answer pairs, custom per account. Each element is a key/value pair; multi-select answers are semicolon-separated. | Yes |
Updated 23 days ago
