<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.
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.
- fix (ENG-4654): Route service-time calculation corrected — per-stop service seconds are now properly divided by crew size, fixing over-estimated travel durations on multi-crew routes.
- feat (ENG-4454): New dispatchQuickDispatchTemplate mutation — dispatches a saved Quick Dispatch Template, creating scheduled events for all configured properties in a single call.
- feat (ENG-4194): Quick Dispatch Templates GraphQL API — new quickDispatchTemplate(id) and quickDispatchTemplates queries, plus createQuickDispatchTemplate, updateQuickDispatchTemplate, and deleteQuickDispatchTemplate mutations. Templates define a reusable dispatch configuration (service, crew, schedule, and properties) that can be dispatched with a single call.
October 10 — v4.0.0
- 🧩 feat (ENG-4152): Custom fields on Events and Properties —
customFields: [CustomField!] is now available on Event and Property types. Each entry returns the field's id, label, value, and type. Values are validated against their declared type on write; empty date values are returned as null.
- 🗺️ feat (ENG-4282): Areas CRUD — New
areas query plus createArea, updateArea, and deleteArea mutations. Areas support sortOrder and can be reordered. Requires areas.* permissions.