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

**URL:** <https://community.servicem8.com/t/webhook-event-issue-proposal-sent-vs-quote-sent/59>\
**Category:** API & SDK\
**Created:** [October 3, 2025, 12:05am UTC](https://community.servicem8.com/t/webhook-event-issue-proposal-sent-vs-quote-sent/59 "2025-10-03T00:05:34Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![developer](https://avatars.discourse-cdn.com/v4/letter/d/bcef8e/32.png) [@developer](https://community.servicem8.com/u/developer)\
**Post date:** [October 3, 2025, 12:05am UTC](https://community.servicem8.com/t/webhook-event-issue-proposal-sent-vs-quote-sent/59/1 "2025-10-03T00:05:34Z")

</div>

**Originally posted by David List**

[![TMT_ServiceM8 Proposals & Quote Webhook Events Error – Watch Video](https://us1.discourse-cdn.com/flex002/uploads/servicem8/original/1X/1ed3aaaa33e6f202159a8cb3a1adcc0ac99ad6b9.gif)](https://www.loom.com/share/175ac51fa69942ccbf93261a1d9372ae)

* * *

## 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 `false` → `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 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 event** — `proposal.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](https://www.loom.com/share/175ac51fa69942ccbf93261a1d9372ae) for a full walkthrough of the issue.
