The same guarantee the catalog already makes to a sent estimate, extended one level up. A package's lines are stored as a frozen copy rather than references into the catalog, and applying one copies again.
Also called: editing a template changed my quote · template linked to old estimates
- 1instantiatePackage() gives every applied line a fresh id and the package's instance id.
- 2Quantities, rates, sizes and quoted prices are exactly what was saved.
- 3linesForPackage() strips per-estimate identity when saving, so a package saved out of an estimate that contained another package doesn't carry the older grouping forward.
- 4Every line in a saved package gets a fresh id, because the editor keys rows by id.
A rate already freezes when a service is added to an estimate, so that editing your catalog never silently reprices a quote a customer is holding. A package sits between the two and has to obey the same rule: applying one copies its lines into the estimate, so editing the estimate never writes back to the template and editing the template never reaches into estimates already built from it. Each copied line gets a fresh identity as well — an early version left them blank, which made every line in a saved package indistinguishable from the others and landed edits on the wrong row.
- Template edits leaking into estimates already built from them, in either direction
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →