Discussions
⛓️💥 Webhook Event Issue — Proposal Sent vs Quote Sent
Overview
When registering to webhook events for proposal.sent
and quote.sent
, we’re seeing both events fire for a single proposal send action.
After testing, I noticed this behaviour appears to be caused by how the primary job
object is structured:
- The
job
object still only hasquote_sent
as a boolean field. - Sending a proposal toggles that
quote_sent
field fromfalse
→true
. - Because proposals are a newer feature, there’s no dedicated
proposal_sent
field in the job object. - It looks like the backend is currently using the
quote_sent
flag to cover proposals as well, which means both webhook events are triggered.
Why This is a Problem
Developers need to distinguish between a true quote being sent vs a proposal being sent.
Right now:
- A single proposal send results in two webhook events: one for
proposal.sent
and another forquote.sent
. - We have to implement awkward workarounds such as:
- Checking the quote’s dollar value to figure out whether it was a real quote or just triggered by a proposal.
- Waiting to see if a
proposal.sent
event follows to confirm what actually happened.
This makes filtering unnecessarily complex and brittle.
Phantom Events
In the attached Loom video, I also encountered what I’ll call “phantom” webhook events:
- I sent two proposals and got two
proposal.sent
events plus onequote.sent
event. - One of the
proposal.sent
events even had a separate event ID but no corresponding action on the UI. - Not sure if this is related, but worth noting.
Missing Data in proposal.sent
Object
proposal.sent
ObjectThe current proposal.sent
object doesn’t include the total value of the selected proposal items:
- Proposals can have multiple-choice items and selectable pricing options.
- The webhook payload should ideally include the calculated total for the selections made at the time the proposal is sent.
Suggestions
-
Separate the flags in the
job
object:
Add a dedicated field forproposal_sent
so the webhook events aren’t tied toquote_sent
. -
Fix event duplication:
Ensure sending a proposal only triggers one relevant event —proposal.sent
. -
Include totals in the proposal payload:
Add atotal_selected_amount
field (or similar) to theproposal.sent
object so developers can act on the chosen amount without further lookups.
Key Takeaways
- The duplication of webhook events makes automation logic error-prone.
- Phantom events add confusion during debugging.
- Missing total values in proposals reduces the usefulness of the webhook.
👉 Click the GIF above or watch the Loom video here for a full walkthrough of the issue.