September 5, 2026 · 5 min read
The quote gets its own copy, on purpose
Build a quote off a deal and HubSpot creates a second, complete set of line items describing the same sale. Here's why it's built that way, what it costs a team that tries to fix it, and the one hidden property that ties the pair back together.
A line item is born once, copied off a product with no live link back to it. That was the last piece. The very next thing that happens to it is another copy: a second, complete line item, created for the quote, describing the exact same sale the deal already has.
Build a quote off a deal and the deal keeps whatever line items it already had. The quote doesn't point at them. It gets its own set, one new line item per product, matching the deal's item for item, created in the same transaction as the quote itself.
Here's a worked example from the portal I traced, reduced to numbers. One deal carrying five products. The instant a quote was built off it, ten line item records existed instead of five, five associated to the deal and five to the quote.
| Deal-side record | Quote-side record | Created (to the millisecond) | Price |
|---|---|---|---|
| 6713993037 | 6695637176 | 2023-08-31T18:43:45.783Z | $2,495 |
| 6713993036 | 6695637177 | 2023-08-31T18:43:45.783Z | $2,495 |
| 6713993039 | 6698482032 | 2023-08-31T19:37:46.349Z | $4,995 |
| 6713993038 | 6695637175 | 2023-08-31T18:43:45.783Z | $2,495 |
| 6713993040 | 6698482033 | 2023-08-31T19:37:46.348Z | $7,495 |
Read down the created column and each pair matches to the millisecond. These aren't the same record seen from two angles. They're ten separate objects with ten separate IDs, describing five sold things twice. On the traced sale from the first piece, this is where two of the fifteen came from: the quote's copy and the deal's copy, the latter being the same record the order will later share, which is a different exception and gets its own piece.
HubSpot tells you to build it this way
This isn't a side effect of how the quote tool happens to behave. It's the documented pattern. HubSpot's developer guide for the object says it directly:
"if you're creating a deal and a quote, you should create one set of line items for the deal, and another set for the quote"
The portal bears it out. Of 632 line items, exactly one is associated to both a deal and a quote at once, and that one wasn't created by HubSpot's own quote tool. It came in through an outside integration. Left to its native path, the object copies every time a quote is built off a deal, with no exception I could find.
Why sharing one set would be worse
The obvious question is why not associate one shared set of line items to both the deal and the quote and skip the duplication. I asked it myself, and the guide answers in the same breath it gives the instruction:
"deleting a quote will delete the quote's line items, and if those line items are associated with a deal, the deals line items will also be deleted"
Read that for what it says. If a deal and a quote shared one set of line items, deleting the quote would delete the deal's line items along with it. A team replacing a draft quote a customer never signed, or clearing out an old one, would wipe the record of what the deal is worth, as a side effect of tidying something that looks completely unrelated to the deal.
The duplication is what prevents that. Because the deal's set and the quote's set are separate records, either can be deleted without touching the other. What reads as two containers failing to share data is the thing that stops one container's cleanup from destroying the other's revenue record, and once I understood that I stopped wanting to fix it.
Finding the copies again
So two full copies of the same sale exist in two containers, and neither is associated to the other. The deal-side record is associated only to the deal, the quote-side record only to the quote. If you need to know that a given deal line item and a given quote line item are the same underlying sale, HubSpot gives you one hidden property for it, the identifier that ties a copy back to its origin, hs_origin_key. HubSpot's description, in full: "Identifier to track the origin of the Line Item."
When HubSpot creates the parallel copies, both receive the same hs_origin_key, a UUID stamped onto both at creation. A short example from the portal: two line items, both $495, created in the same millisecond, one associated to a deal and the other to a quote, both carrying origin key 8f4647de-bf8b-43e9-a82a-208ba70754cb. That shared value is the only thing on either record that says the two are the same sale.
It has real limits as a reconciliation tool, and I'd rather name them than have you discover them. It's hidden, so it isn't offered in list filters or the standard report builder, the same blind spot the last piece found on hs_product_id. And it's recent: the earliest line item carrying one was created 2025-10-24. Of the 632 line items in this portal, 560 carry no origin key at all, everything older than that date plus a handful created as recently as June 2026. Of the smaller set that does, 72 records form 50 distinct keys; 22 of those keys are shared by exactly two records, and 21 of those 22 pairs are a deal and a quote like the one above.
For anything created before late October 2025 the property won't help, and a small number of newer records don't carry one either. Reconciling those pairs means matching by hand on product, price and creation timestamp, which is the exact set of signals the origin key exists to replace.
What to check
If your team has ever associated one shared set of line items to both a deal and its quote, to avoid the duplication this piece just walked through, I'd stop. That's the configuration the deletion-cascade sentence is warning about, and it stays a live risk for as long as the setup does, right up until someone deletes an old quote.
For a deal and quote pair created since October 2025, read hs_origin_key off both records and match them on the key they share instead of guessing which record goes with which. It isn't in the filter list, so pull it from an export or a direct record read. For anything older, match on product, price and creation timestamp.
Two copies now hold the same sale. The next piece is about the deal's copy, which has to answer a question the quote's copy never does: what is this deal worth, and is that number a rollup of the line items underneath it, or something someone typed in?