<aside>
📋 This changelog covers user-facing GraphQL API changes from January–July 2026. Internal infrastructure, CI/CD, and non-API changes are omitted.
</aside>
This document tracks user-facing changes to the Homeworks GraphQL API over time. It is intended for external API consumers (MCP clients, integrations, and partner developers) as well as internal product and engineering teams tracking what has shipped.
Each entry describes a change that affects the observable API contract — new queries or mutations, field additions or removals, type changes, filter/sort options, and breaking renames. Internal details (CI/CD, build tooling, test coverage, refactors with no schema impact) are intentionally omitted.
⚠️ Breaking changes are marked explicitly.
November 12, 2026
- Route geometry corrected for HERE routing provider —
routePreview and other route queries using the HERE provider were decoding polyline coordinates incorrectly (precision-6 flexible polylines were read as precision-3, placing coordinates ~1000x off). Route geometries now decode correctly. The HERE route cache key has been bumped to v3; stale cached routes will not be served.
- Route stop order preserved in repeated routes — Stop ordering for future weeks in repeated routes is now stable. Previously stops could reorder after the first occurrence week.
- Drive distance no longer attributed to stops without a location — Drive legs are no longer credited to stops that have no location set, fixing inaccurate drive time and distance totals on routes containing unlocated stops.
addEventTag, removeEventTag, and all BeforeAndAfter mutations now return up-to-date event data — These mutations previously returned a stale snapshot of the parent event (including updatedAt) taken before the event touch write. They now return the post-write state.
- Cross-tenant validation on
createEvent, updateEvent, and estimate line item mutations — These mutations now verify that all associated foreign IDs (customer, crew, estimate, category, estimate line items) belong to the requesting company. Passing an ID that belongs to a different company now returns a not-found error instead of succeeding silently.
October 2026
October 28 — v4.1.0
- fix (ENG-4664): Quick Dispatch Template dispatch now names the exact problem. Previously a deleted/inactive property caused a bare "Property not found" error. The error now identifies each problem property by template property id, property id and name, and customer id and name, with a specific reason (customer deleted, property deleted, customer inactive, property not found). All template properties are validated before geocoding or opening a transaction.
- fix: Dispatch error messages for template properties now label each field with its API argument name (templatePropertyId, propertyId) instead of bare numbers, making it easier to match errors back to mutation input.
- feat (ENG-4579): New Customer.emailSendability field — returns the customer's current email sendability status.
- feat (ENG-4616): budgetedHours is now accepted on EstimateLineItemInput — allows setting budgeted hours directly on estimate line items.
- fix (ENG-4643): Legacy per-user schedule color fields (scheduleColors) removed from the API. These were a holdover from an old scheduling feature and are no longer supported.
- fix: GraphQL nested relation field selection corrected — field transforms with nested relations (e.g. lineItems { item { category } }) now correctly return sub-selected fields instead of dropping them and returning null.
- fix (ENG-4454): Quick Dispatch Template dispatch unblocked — mutation responses and input validation corrected.
- fix (ENG-4655): Route startLocationType / endLocationType values are now read literally from the database. The previous implicit COMPANY→CUSTOM remapping has been removed.