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 Fields

Fields with no value in DealHub are omitted from the event payload entirely. This applies to every event described below.

Draft Quote (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:

FieldDescriptionCan be omittedValid Values / Format
eventBusiness event typeNo"draftQuote"
statusStatus of the quoteNo"Draft"
quote_upgrade_requiredIndicates 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.Notrue, false
newly_created_quotetrue for a newly created quote; false for an update to an already-existing draft quote.Notrue, false
external_opportunity_idExternal opportunity ID (CRM opportunity ID provided during the create-quote call)No
external_quote_idExternal quote ID (as provided during the create-quote call)Yes
external_customer_idExternal customer ID (CRM customer ID)No
dealhub_opportunity_idDealHub opportunity IDNo16 chars
dealhub_quote_idDealHub quote IDNo16 chars
primary_quotePrimary quote flagNotrue, false
executed_byUser loginNo
impersonated_byLogin of the admin, if they performed the action on behalf of another userYes
execution_dateGMT date/time of quote creation or updateNoyyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44
sync_flagWhether the user requested to sync quote data back to the CRM when saving the draft quoteNotrue, false
quote_summary.currencyQuote currencyNoISO-4217
quote_summary.total_list_priceTotal list price of the quoteNo
quote_summary.total_net_priceTotal net price of the quoteNo
quote_summary.total_discountTotal discount on the quoteNo
quote_summary.sales_discountTotal discount provided by the sellerNo
additional_dataList 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)

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:

FieldDescriptionCan be omittedValid Values / Format
eventBusiness event typeNo"primaryQuote"
statusStatus of the quoteNoDraft, ApprovalProcess, ReadyToBeSent, Rejected, Recalled, Published, Won
external_opportunity_idExternal opportunity IDNo
external_quote_idExternal quote IDYes
external_customer_idExternal customer IDNo
dealhub_opportunity_idDealHub opportunity IDNo16 chars
dealhub_quote_idDealHub quote IDNo16 chars
executed_byUser loginNo
impersonated_byLogin of the admin, if they performed the action on behalf of another userYes
execution_dateGMT date/time of the quote submissionNoyyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44
quote_summary.currencyQuote currencyNoISO-4217
quote_summary.total_list_priceTotal list price of the quoteNo
quote_summary.total_net_priceTotal net price of the quoteNo
quote_summary.total_discountTotal discount on the quoteNo
quote_summary.sales_discountTotal discount provided by the sellerNo
additional_dataList 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)

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 quotePendingApprovaldraftQuote 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:

FieldDescriptionCan be omittedValid Values / Format
eventBusiness event typeNo"quotePendingApproval"
statusStatus of the quoteNo"ApprovalProcess"
newly_created_quotetrue if the user submitted a newly created quote; false if they submitted an existing draft quote.Notrue, false
external_opportunity_idExternal opportunity IDNo
external_quote_idExternal quote IDYes
external_customer_idExternal customer IDNo
dealhub_opportunity_idDealHub opportunity IDNo16 chars
primary_quotePrimary quote flagNotrue, false
dealhub_quote_idDealHub quote IDNo16 chars
executed_byLogin of the user who submitted the quoteNo
impersonated_byLogin of the admin, if they switched to another user's login and submitted the quoteYes
execution_dateGMT date/time of the quote submissionNoyyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44
note_for_approvalNote the submitter added for the approversYesUp to 3000 chars
quote_summary.currencyQuote currencyNoISO-4217
quote_summary.total_list_priceTotal list price of the quoteNo
quote_summary.total_net_priceTotal net price of the quoteNo
quote_summary.total_discountTotal discount on the quoteNo
quote_summary.sales_discountTotal discount provided by the sellerNo
approval_detailsDetails of this approval stepYes
approval_details.statusStatus of this step within the approval flowNo"approved"
approval_details.reviewed_byLogin of the approving/rejecting personNo
approval_details.impersonated_byLogin of the person who approved/rejected on behalf of the approverYes
approval_details.review_dateTime of the approval/rejectionNoyyyy-mm-dd hh:mm:ss
approval_details.reviewer_commentNote the reviewer added during approval/rejectionYes
additional_dataList 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)

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:

FieldDescriptionCan be omittedValid Values / Format
eventBusiness event typeNo"quoteReady"
statusStatus of the quoteNo"ReadyToBeSent"
newly_created_quotetrue if the user submitted a newly created quote that didn't need approval.Notrue, false
external_opportunity_idExternal opportunity IDNo
external_quote_idExternal quote IDYes
external_customer_idExternal customer IDNo
dealhub_opportunity_idDealHub opportunity IDNo16 chars
dealhub_quote_idDealHub quote IDNo16 chars
primary_quotePrimary quote flagNotrue, false
executed_byLogin of the user who submitted the quoteYesPresent only when the user submitted a draft quote that needed no approval
impersonated_byLogin of the admin, if they switched to another user's login and submitted the quoteYesPresent only when the user submitted a draft quote that needed no approval
execution_dateGMT date/time of the quote submissionYesPresent only when the user submitted a draft quote that needed no approval
quote_summary.currencyQuote currencyNoISO-4217
quote_summary.total_list_priceTotal list price of the quoteNo
quote_summary.total_net_priceTotal net price of the quoteNo
quote_summary.total_discountTotal discount on the quoteNo
quote_summary.sales_discountTotal discount provided by the sellerNo
approval_details.statusStatus of this step within the approval flowNo"approved"
approval_details.reviewed_byLogin of the approving/rejecting personNo
approval_details.impersonated_byLogin of the person who approved/rejected on behalf of the approverYes
approval_details.review_dateTime of the approval/rejectionNoyyyy-mm-dd hh:mm:ss
approval_details.reviewer_commentNote the reviewer added during approval/rejectionYes
additional_dataList 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)

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:

FieldDescriptionCan be omittedValid Values / Format
eventBusiness event typeNo"quoteRejected"
statusStatus of the quoteNo"Rejected"
external_opportunity_idExternal opportunity IDNo
external_quote_idExternal quote IDYes
external_customer_idExternal customer IDNo
dealhub_opportunity_idDealHub opportunity IDNo16 chars
dealhub_quote_idDealHub quote IDNo16 chars
primary_quotePrimary quote flagNotrue, false
approval_details.statusStatus of this step within the approval flowNo"rejected"
approval_details.reviewed_byLogin of the approving/rejecting personNo
approval_details.impersonated_byLogin of the person who approved/rejected on behalf of the approverYes
approval_details.review_dateTime of the approval/rejectionNoyyyy-mm-dd hh:mm:ss
approval_details.reviewer_commentNote the reviewer added during the rejectionNo
additional_dataList 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)

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:

FieldDescriptionCan be omittedValid Values / Format
eventBusiness event typeNo"quoteRecalled"
statusQuote statusNo"Recalled"
external_opportunity_idExternal opportunity IDNo
external_quote_idExternal quote IDYes
external_customer_idExternal customer IDNo
dealhub_opportunity_idDealHub opportunity IDNo16 chars
dealhub_quote_idDealHub quote IDNo16 chars
primary_quotePrimary quote flagNotrue, false
executed_byLogin of the user who recalled the quoteNo
impersonated_byLogin of the admin, if they performed the action on behalf of another userYes
execution_dateGMT date/time of the recallNoyyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44
additional_dataList 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)

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:

FieldDescriptionCan be omittedValid Values / Format
eventBusiness event typeNo"quotePublished"
statusStatus of the quoteNo"Published"
external_opportunity_idExternal opportunity IDNo
external_quote_idExternal quote IDYes
external_customer_idExternal customer IDNo
dealhub_opportunity_idDealHub opportunity IDNo16 chars
dealhub_quote_idDealHub quote IDNo16 chars
primary_quotePrimary quote flagNotrue, false
executed_byLogin of the user who published the quoteNo
impersonated_byLogin of the admin, if they performed the action on behalf of another userYes
execution_dateGMT date/time the quote was publishedNoyyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44
dealroom_idID of the quote's DealRoomNo16 chars
dealroom_urlURL of the quote's DealRoomNo
additional_dataList 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)

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:

FieldDescriptionCan be omittedValid Values / Format
eventBusiness event typeNo"quoteUnpublished"
statusStatus of the quoteNo"ReadyToBeSent"
external_opportunity_idExternal opportunity IDNo
external_quote_idExternal quote IDYes
external_customer_idExternal customer IDNo
dealhub_opportunity_idDealHub opportunity IDNo16 chars
dealhub_quote_idDealHub quote IDNo16 chars
primary_quotePrimary quote flagNotrue, false
executed_byLogin of the user who unpublished the quoteNo
impersonated_byLogin of the admin, if they performed the action on behalf of another userYes
execution_dateGMT date/time of the unpublishingNoyyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44
dealroom_idID of the quote's DealRoomNo16 chars
additional_dataList 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)

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:

FieldDescriptionCan be omittedValid Values / Format
eventBusiness event typeNo"quoteWon"
statusQuote statusNo"Won"
external_opportunity_idExternal opportunity IDNo
external_quote_idExternal quote IDYes
external_customer_idExternal customer IDNo
dealhub_opportunity_idDealHub opportunity IDNo16 chars
dealhub_quote_idDealHub quote IDNo16 chars
primary_quotePrimary quote flagNotrue, false
execution_dateGMT date/time the quote was signedNoyyyy-mm-dd hh:mm:ss, e.g. 2021-10-22 09:34:44
executed_byLogin 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_byLogin of the admin, if they performed the action on behalf of another userYes
additional_dataList of playbook question/answer pairs, custom per account. Each element is a key/value pair; multi-select answers are semicolon-separated.Yes

Did this page help you?