Discussions

Ask a Question
Back to all

⛓️‍💥 Webhook Event Issue — Proposal Sent vs Quote Sent

TMT_ServiceM8 Proposals & Quote Webhook Events Error – Watch Video


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 has quote_sent as a boolean field.
  • Sending a proposal toggles that quote_sent field from falsetrue.
  • 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 for quote.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 one quote.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

The 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

  1. Separate the flags in the job object:
    Add a dedicated field for proposal_sent so the webhook events aren’t tied to quote_sent.

  2. Fix event duplication:
    Ensure sending a proposal only triggers one relevant eventproposal.sent.

  3. Include totals in the proposal payload:
    Add a total_selected_amount field (or similar) to the proposal.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.