<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.
feat: User capacity fields — weeklyBillableHours renamed to weeklyCapacityHours, billableExclude renamed to excludeFromCapacity. New dailyCapacityHours field added to User. (ENG-3804)
feat: New UserDayOverride type with User.dayOverrides field, userDayOverrides query, overrideUserDayCapacity mutation, and deleteUserDayOverride mutation — allows per-date capacity hour overrides per user. Requires users.READ / users.UPDATE. (ENG-3804)
feat: New ScheduleColors type with visit, todo, meeting, maintenance fields. User.scheduleColors field added (merges stored values against defaults). setScheduleColors(input: SetScheduleColorsInput!): User! mutation added. The old User.scheduleColor (raw JSON string) is deprecated — use scheduleColors instead. (ENG-3733)
⚠️ breaking (ENG-3814): Several fields renamed to properly typed replacements. Old names no longer exist in the schema.
Company: customerNeedsDeposit → depositRequirement: DepositRequirement (NONE | ALL | PER_CUSTOMER);
invoiceGroup → invoiceGrouping: InvoiceGrouping (PER_VISIT | BY_CUSTOMER | BY_PROPERTY | BY_PROPERTY_AND_ASSET);
defaultInvoiceDate → invoiceDatePolicy: InvoiceDatePolicy (DATE_SENT | LAST_SERVICE_DATE | NO_CHANGE)
Customer: totalDue → showTotalDue: Boolean; invoiceCustomerSettings → autoChargePolicy: AutoChargePolicy (INHERIT | DISABLED | USE_COMPANY).
Item: markupType type changed SafeInt → ItemMarkupType (NONE | PERCENTAGE | FLAT)
User: dbSettings renamed to dashboardLimit: SafeInt; ccRole removed (vestigial, never populated).
fix: Conflicting same-relation sub-selections now return a clear GraphQLError instead of a server crash. (ENG-3817)
feat (admin): New admin-only report queries: companyReport, adminSmsReport, subscriptionChangeReport, appEventReport, userReport — cross-tenant groupBy aggregates.
fix (admin): Admin SmsReportRow now exposes customer, counterPartyUser, and sentByUser fields (moved to common schema so both company and admin APIs have access).
tag { customers } and tag { customerCount } soft-delete fix — These nested tag relations were including soft-deleted customers, producing a count mismatch vs. the top-level customers(tags: { in: [...] }) query. Both now correctly exclude deleted customers.refresh_token is issued alongside the old one. The old token remains valid until its natural expiry, so concurrent requests using the same token all succeed. Callers should persist and use the new token going forward, but presenting the old token continues to work until it expires.