v2.4.0
MinorCurrentConvergence · July 1, 2026
Offline edits now merge field-by-field instead of last-writer-wins, quote recalculation moved onto a precompiled deduction table, and the GraphQL schema opened up beyond the read-only preview.
- API contract
- 2026-07-01
- Minimum tablet build
- 2.4.112
- Released
- Jul 2026
- ImprovedCPQ
Sub-10 millisecond quote recalculation
Deduction resolution moved from a per-line rule walk to a precompiled lookup table built when a price book is published. On our internal load harness a 40-line quote recalculates in 8.4 ms at the median and 12.1 ms at p95, against 68 ms and 141 ms on v2.3.2. These are harness numbers on synthetic quotes, not measurements from a customer tenant.
- ImprovedMobile
Conflict-free offline sync
Two technicians editing the same work order in a dead zone used to resolve on reconnect by last-writer-wins, which silently discarded the earlier edit. Each field is now a conflict-free replicated register, so both edits survive and only genuinely contended fields raise a review flag. A 2,000-operation backlog converges in 1.9 s against 26 s previously.
- AddedAPI
GraphQL schema expansion
The read-only preview became a supported surface: quote, quoteConnection, dispatch, and technician root fields, cursor pagination on every connection, persisted queries, and a per-tenant complexity budget so one deep query cannot starve the rest of the tenant.
- AddedPlatform
Audit ledger export
Administrators can export the field-level audit ledger over any date range as CSV or JSONL, including margin-override reason codes. Exports are themselves audited, because an unlogged export of an audit log is a gap auditors ask about.
- DeprecatedAPI
Scalar lineItems[].deduction
The scalar deduction value is replaced by an object carrying { value, unit, source }, because the scalar could not express which rule produced the number — the question every disputed quote eventually turns into. The scalar keeps being served alongside the object until v2.6.0.
- AddedAPI
Route responses name the constraint that excluded a technician
Route and assignment responses carry a rejections array naming the technician, the job, and the specific constraint that ruled them out. Dispatchers stopped having to open a ticket to find out why a particular person was never offered the job.
- FixedFMS
Routes crossing the DST boundary
Where a technician's device timezone differed from the tenant timezone, stops scheduled across the March transition were sequenced an hour early. Scheduling now resolves entirely in the tenant timezone and converts for display only.
What you have to do
Move to the object form of lineItems[].deduction
Removed in v2.6.0Read deduction.value instead of deduction. The unit and source fields are additive and can be ignored until you need them. Both shapes are served today.
Pin the API date header on GraphQL calls
Send X-NS-Api-Version: 2026-07-01. Requests without the header resolve against the oldest contract your tenant has ever used, which is safe but will not expose the new root fields.