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.
- AddedIoT & Controls
DALI group and scene address export
Commissioned shade groups export as a DALI-2 short-address and group map in CSV and in the .dtr form most control desks import, so the controls contractor stops retyping an addressing scheme that already exists in the work order. Certified-product records are matched on GTIN, brand, and firmware version against the DALI Alliance registry, and a device whose firmware does not match the certified entry exports with the mismatch named rather than silently.
- AddedIoT & Controls
Somfy setup import with protocol-aware position state
Pulling a TaHoma setup brings devices in with their deviceURL intact, which is what tells the platform whether a motor can report position or only receive commands. io-homecontrol devices show live state; RTS devices show the last command sent, labelled as such. Reporting a one-way motor's position as though it were measured is the kind of confident wrong number that gets a technician sent back to site.
- AddedFMS
Traffic-aware travel times on same-day routing
Same-day route recalculation resolves travel legs against observed conditions through Google Maps Platform; routes beyond the current day stay on the historical model, because paying for a live traffic read on a job three weeks out buys nothing. Stop overhead — access, setup, teardown — remains our estimate in both cases and is not replaced by the traffic model.
- AddedSecurity
Device-bound technician sessions
Tablet refresh tokens are bound to a device key generated in hardware-backed storage at enrolment, so a token lifted off a device is unusable anywhere else. Administrators can revoke a single device without ending the technician's other sessions, which is what actually happens when a tablet is left on a job site.
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.