v2609.28.0 — September 28, 2026
MRs: !2431, !2432, !2433, !2434, !2435, !2437, !2438, !2441, !2442, !2444, !2445, !2446, !2447, !2448, !2449
Highlights
A clearer, friendlier signing experience (!2431, closes #6592) The sign page now guides customers to what’s left before they can sign: a marker points at the next step, the footer counts unfinished fields, and clicking a signature that isn’t ready yet lists every unfinished field and jumps to the first one. Finishing a document ends in a completion card with confetti and an instant PDF download, and the sign page stays live afterwards — its footer tracks whether the document is waiting for other signers, fully signed, or deposit due. Sending, opening, signing and completing a document are now recorded as system comments and history on the job, and the job page refreshes live as the customer acts.
Pay Deposit: payment notifications and a button lifetime (!2434, closes #6993) When a customer pays a deposit from a document, the estimator, the person who sent it and job watchers are now notified through the job’s regular payment note — the sender hears about it even without a role on the job. Franchises can also limit how long the Pay Deposit button works (12 hours by default), so deposits can’t be taken for dates they can no longer fill.
New Vancouver Island calculator (!2438) A dedicated VI calculator: local and long-distance moves are distinguished automatically, with ferry fees and a non-bookable-ferry warning per location, location-specific travel-time overrides, truck fees scaled by rate, and default weights per dwelling and storage-unit size built from VI’s data. Two-day moves and end-of-month crew sizing follow VI’s rules.
Dual-pricing estimates for YMM (!2432, closes #6991) A new YMM estimate template shows Cash and Card prices side by side, tells the customer that the price on the estimate depends on the selected payment method, and drops the 3% fee sentence when card pricing is set. The email and SMS that deliver the estimate now identify the cash price too.
Performance
- Removed the result cap when retrieving events for the invoice modal, so large job histories load in full (!2433)
Features
- Reporters now see the full set of non-Karve dashboards — 12 instead of only Payments (!2444, closes #7005)
- OTR labor tracker dashboard improvements: franchise chip colors, configurable row ordering, and dark-theme fixes (!2441, closes #6990)
- Dynamic Reports: owner-attributed franchise columns replicate the legacy 5020.0 Expected Revenue report (!2437, closes #6998)
- Crew-pay calculator: alerts for missing crews, labor raised to the per-diem floor and over-budget forwarded pay; Full Value and Platinum insurance rates that differ when the customer’s boxes are packed; Partner FP, OTR-Operated and Third-Party execution with negotiated agency payout; FP revenue splits across franchises with allocation warnings (!2447, closes #6989)
Fixes
- Accountant roles no longer resolve Karve-internal permissions through stale
*.*grants, and the impersonation endpoint is gated on a dedicatedauth.impersonatepermission instead of a dashboard-visibility key (!2449, closes #7006) - Semi Live Export in YMM no longer fails with “Missing permission reportTypes.export” — export tokens are guarded on
reports.export(!2448, closes #6996) - Sent PandaDoc invoices can be viewed, downloaded and sent again — finalized documents are served without a failing draft refresh (!2442, closes #6999)
- Average Job Size no longer includes damage charges (!2435, closes #6995)
- Config key visibility fixed for Crew Navigator (!2445, closes #7004)
- Template variables resolve correctly in job comments, and the comment email subject resolves again (!2446)
- Pay Deposit closes its window when the send time is unreadable, marks the offer closed before reloading it, and sends its receipt instead of another pay link (!2434)
- Changelog made public-facing for the TSXV-listed parent company (!2436)
Other
- Gitignored the pi-web agent attachment cache so session artifacts never land in the repo (commit 745037c03d)
- Changelog README sample no longer references Redis (commit dc1c2da727)
v2609.24.0 — September 24, 2026
MRs: !2427, !2428, !2429, !2430
Highlights
Intake address selection is more reliable (!2428) The online intake form now only commits an address the customer explicitly selected from the autocomplete dropdown — it no longer auto-fills the first suggestion when the field loses focus. This prevents incorrect addresses from being saved when a customer types a partial address and moves on without picking a suggestion.
OTR Ops Readiness dashboard improvements (!2429, closes #6982) The dashboard now shows only each job’s earliest qualifying event, removing later days of multi-day moves from the planning list. Readiness indicators turn red only when an item is due and incomplete — driver documents and contracts are due 10 days before the event, the 7 Day Call 7 days before. Users can record FP notification status, executing franchise, Inventory Checklist, and Itinerary Created. Hotels Booked is replaced by Job Total, and customer-packet signatures are distinguished from EOM checklist documents.
Features
- Dispatchers can now see a W indicator on confirmed or completed schedule events when Ops Readiness records the welcome call as checked (!2427, closes #6623)
- Transaction dialog, default-receipt document, and payment messages now display the job’s currency (CAD or USD) so users confirm the currency before charging, authorizing, or recording a payment (!2430)
Fixes
- Build tooling updated to exclude vendored chart library test files from type checking and linting (!2384)
v2609.23.0 — September 23, 2026
MRs: !2383, !2406, !2407, !2408, !2409, !2410, !2411, !2412, !2413, !2414, !2415, !2416, !2417, !2418, !2420, !2421, !2422, !2425
Highlights
Collect deposits right on the sign page (!2412, closes #6970) Customers can now pay their deposit directly from the estimate’s sign page — no separate payment dialog needed. After signing, the document prompts for payment, and the document becomes complete only once it’s both signed and paid. The deposit amount is always derived from the document’s own context, and three states (due, pending, paid) keep the PDF accurate through the settlement window.
New Transactions dashboard for payment reconciliation (!2418, closes #6972) A dedicated Transactions dashboard shows one row per transaction — created date, paid date, job, customer, status, provider, amount, card differential, and tip — with filters for status and date anchor. An activity card plots cumulative transactions per day stacked by provider against scheduled and created events, so you can see how collections track against revenue through the month.
Invoices auto-regenerate when totals change (!2383, closes #6760) Invoices now refresh themselves automatically when totals change after a payment. The old “outdated” banner and “Update Document” button are gone — signed documents can be regenerated in place, so you never need to void and renumber an invoice just because a payment landed after it was signed.
Terminal completions handle long waits gracefully (!2408) When a terminal completion takes longer than expected, the panel now clears the stale session and prompts the operator to press Complete again, with per-attempt safeguards to prevent duplicate charges.
Features
- Relentless Moving has a customer-facing claims form for filing loss or damage claims, with personal/move details prefilled from the job and a company-use-only section for adjusters (!2413)
- Crew navigator gains new functionality including ops manager phone number lookup, star rating storage, and scope un-approval — “Send Schedule to Crew” now correctly includes the ops manager line (!2406, closes #6750)
- Pacing comparisons now use ISO-week-aligned like-for-like matching with Prophet forecasts capped at booked revenue (!2410)
- Split deposit config into a default amount and a separate booking requirement flag — franchises can now change the deposit amount without blocking bookings (!2414, closes #6961, #6952)
- Every payment type and pre-auth now shows as its own tile on the payment method grid — eTransfer, EFT, and others get labelled tiles, and “Pre-authorize on terminal” sits beside “Send to terminal” (!2416, closes #6952, #6971)
- Square payment SMS and email now include the amount, transaction type, and job code in the message (!2415)
- Ops Readiness dashboard shows each job’s assigned route with a truck icon; unassigned jobs show “Unassigned” (!2422, closes #6622)
- Internal users who unsubscribed from list emails still receive login magic links and password emails (!2411)
- Templates can now have conditionally required input fields (!2400, !2397)
Fixes
- Permission migration no longer fails on empty restriction maps (!2407)
- Average Job Size and Average Booking Size on the dashboard no longer count $0 jobs (!2421, closes #6980)
- Deposit config keys are now read correctly in the document context (!2420)
- In-flight payment requests in demo mode are now cancelled to prevent stale responses (!2421)
Other
- Internal documentation updates for fleet tooling (!2409)
- Release process improvements: automated version computation, repo skill discovery (!2425)
v2609.21.0 — September 21, 2026
MRs: !2389, !2392, !2393, !2395, !2398, !2399, !2402, !2403, !2404
Highlights
Refunds and hold releases are more reliable under load (!2389) Refunds and hold releases now respond immediately and settle in the background. One refund or release runs per payment at a time, and duplicate requests are prevented. The refund dialog follows the transaction through to completion — showing Refunded $X, the refusal, or Not confirmed.
Event Notes — per-event rich-text notes on the dispatch board (!2398, !2404) Each event now has its own collapsible rich-text notes section on the workorders tab, with a full toolbar (headings, bold/italic, colors, checklists). Notes are stored per-event and sync into the crew schedule email and SMS. The dispatch board also gains block costs, route total time, a notes-toolbar toggle, and route ordering by earliest event start.
Estimate templates compacted and discounts fixed (!2393) Excess page breaks in the estimate family are gone — table padding, room spacing, and inventory gap tightened so the Cincinnati estimate drops from 5 pages to 4. Empty discount rows are hidden, negative discount totals display correctly, and the terms caption is now bound to the signature that accepts them.
Create Template dialog no longer loses your work (!2402, closes #6960) Creating a Quill template from Business → Templates was failing silently. The dialog now stays open until the save succeeds, validates required fields client-side, and shows the real server error message.
Features
- Reporter role now sees the System Revenue dashboard (!2395)
Fixes
- Crew schedule is now sent via both SMS and email — previously only email was sent when both channels were intended (!2392, closes #6923)
- Chat widget loads more reliably after a transient gateway failure (!2399, closes #6953)
- Internal users who unsubscribed from list emails still receive operational emails (!2403)
Other
- Each template script now has its own TypeScript scope, fixing editor tooling and type isolation (!2393)
v2609.17.1 — September 17, 2026
MRs: !2394
Fixes
- Fixed Square payment link creation crashing when remarks are empty or not a valid Quill delta — the backend now defaults to an empty Quill contents object and guards against missing
opsarray (!2394)
v2609.17.0 — September 17, 2026
MRs: !2390, !2391
Fixes
- Fixed “Artifact not found” errors when sending documents — document artifacts linked to a job without a direct zone edge are now visible. Affects artifacts list, event exports, and invoices list (!2390, closes #6929, #6930, #6931, #6932, #6933)
- Square Checkout payment method now appears in the Take Transaction dialog when Square is enabled via zone config (!2391)
v2609.16.1 — September 16, 2026
MRs: !2381, !2387, !2388
Highlights
Dispatch board live updates, notes sync, and conflict highlighting (!2388) The dispatch board now updates in real time when another dispatcher makes changes — a websocket subscription pushes day-level updates so both boards stay in sync without manual refresh. Notes sync between boards automatically. Double-booked crew chips now show a red border with a hover overlay listing each conflicting event. Crew chip hover stats (cost, rate, rating, OT, weekly) are now accessible from the board. The autosave countdown is no longer clipped, and an “Autosave off” indicator appears when a save fails.
Take Transaction wizard replaces the old payment dialog (!2388) The payment dialog has been replaced with a guided Take Transaction wizard that asks each step as a question. Card payment methods are grouped under a single tile, the sole terminal is preselected, and the dialog closes when the money lands. Pay-link creation warns when there’s nobody to send to, and resend replaces instead of duplicating.
Features
- Apex Release of Liability document template added (!2381)
- Ops tasks rework: preset and custom time blocks with overnight handling, zone-timezone-correct times (!2388)
- Additional-contact chips on dispatch job cards with phone/email in tooltip (!2388)
- Config-driven Assign Crew button via zone config (!2388)
- Crew schedule email now renders event times in the zone’s timezone (!2388)
Fixes
- Custom discount amounts are now correctly converted from dollars to cents before dispatch (!2387, closes #6920)
- Pay-link resend now replaces instead of adding a duplicate link (!2388)
- Payment mock rail no longer leaks test data into production (!2388)
- Attention score calculation fixed — was intermittently breaking job writes (!2388)
v2609.16.0 — September 16, 2026
MRs: !2337, !2351, !2352, !2353, !2354, !2355, !2356, !2358, !2359, !2360, !2361, !2362, !2363, !2364, !2365, !2367, !2368, !2369, !2370, !2371, !2372, !2373, !2374, !2375, !2376, !2377, !2378, !2379, !2380
Highlights
Permission gating overhaul — frontend queries now respect role permissions across the board (!2367, !2368, !2370, !2371, !2380, closes #6910, #6911, #6912, #6913) A systemic issue where the frontend fired queries requiring permissions the user’s role lacked has been fixed. SimilarJobs, discounts list, Bluesage query, viewDates, roles view, assets view, crew assignment, and Google Maps distance calculation are all now gated on their respective permissions. Zone admins can once again assign crew. Console errors for crew-level roles are suppressed. This eliminates ~500 errors/24h across affected zones.
Aegis cross-role draft visibility and signing coverage fixed (!2351, !2378, closes #6915) Employee-entered values on a signing page were saved as drafts but invisible to customer signers — customers saw the original PDF values instead of the employee’s edits. Unsigned input drafts are now shared across roles as read-only values while editing authority and signature marks stay role-scoped. Additionally, estimate creation is now blocked when a job has no events, and regeneration races are retried automatically.
OTR dashboards improved and fixed for multi-role users (!2355, !2359, !2361, closes #6855, #6856, #6890, #6892) The OTR System Revenue dashboard gains new filters based on the last scheduled work event end date, new alerts for charge mismatches and unattributed revenue, and improved existing alerts. OTR Labor Tracking now uses the same date boundary filter. Both dashboards are now visible for users with multiple roles — a previous bug hid them entirely. Crew payment numbers now sync correctly between the calculator and the labor tracking dashboard.
Analytics now works reliably even with ad blockers (!2364) Ad blockers were silently blocking analytics sessions. A proxy now forwards browser SDK payloads, and shipped bundles no longer reference blocked domains. SDKs upgraded to 7.13.0 across frontend, intake, and aegis.
Features
- Qube Sheets integration — jobs can now push data to Qube Sheets via API (!2337, closes #6575)
- SMS delivery status and delivered-to number are now displayed in activity, so replies to multi-number customers are unambiguous (!2353)
- Customer summary is now displayed in Apex estimates (!2356)
- Direct calls from Dialpad are now counted when scheduling the next autodial, so the minimum call window applies between a manual call and the next auto-call (!2352, closes #6891)
Performance
- Report period filtering optimized to prevent timeouts for high-volume franchises (!2373, closes #6916)
- Token validation now resolves from already-loaded data instead of re-fetching, eliminating a performance bottleneck on page loads (!2330)
- Charge and price product lookups are now batched, reducing repeated requests (!2332)
Fixes
- Job staff are now notified when a customer replies via SMS — previously the notification only went to the customer (!2379)
- Admins can now delete users — a permission key was blocking the operation entirely (!2358, closes #6901)
- Optional location input strings now accept null, so an end address with no area code can be used as a billing address (!2360)
- Jobs tag filter now drives from the tag when the filter is selective, fixing slow multi-tag filtering (!2362, closes #6887)
- Cloudflare Browser Rendering failures are now retried transiently, so document creation survives temporary timeouts (!2363, closes #6886)
- Virtual estimate sessions are now resumable (!2354)
- Non-revenue events are now exempt from the accounting lock date, and VOSE completion is synced from Yembo (!2369)
- Search queries with special characters no longer cause errors (!2374, closes #6918)
- Frontend null guards added for event notifications, editor content, and style bindings — eliminates ~23 errors/24h (!2375, closes #6919)
- Customer email is now validated before building the job save payload (!2376)
- Unsubscribe button removed from document completed emails (!2377)
- Square payment link creation now normalizes the phone and retries on invalid phone numbers (!2372, closes #6914)
- Console errors for crew-level roles are suppressed on config lookups — eliminates ~192 errors/24h (!2371, closes #6911)
Other
- Analytics SDK upgraded from 4.x to 7.13.0 across frontend, intake, and aegis (!2364)
v2609.09.0 — September 9, 2026
MRs: !2347, !2346, !2345, !2341, !2340, !2339, !2338, !2336, !2335, !2333
Highlights
Editable labor values in the OTR/YMM calculator (!2347, closes #6783) The 2026 OTR/YMM calculator now lets users edit labor values before running the calculation. Labor, travel, storage, insurance, royalties, profitability, revenue splits, and third-party allocations are all computed from the edited values, with warnings for invalid or risky inputs. Partner FP, OTR-Operated, and Third-Party execution modes are supported.
Sign page loads in seconds, not 30 (!2335) Some sign-page documents took ~30 seconds to load with the charges table’s zebra rows running off the sheet and price columns missing. The paginator was inflating pinned column widths in an unbounded loop; it now measures the actual room on the page and stops. The sign page loads in under a second for the affected documents.
Jobs tag filter restored, open/closed tabs now actually filter (!2338, !2341, closes #6867) The tag filter removed in the tabs redesign is back in the jobs page header. Restoring it surfaced two latent bugs: the open and closed tabs returned identical results, and the closed tab was slow because it sorted on an unindexed field. Both are fixed.
Multiple schedule and timeline improvements (!2339, closes #6720) The red “now” indicator on the schedule now moves in real time instead of jumping hour to hour. The customer timeline’s flexibility label no longer shows “Not Flexible” when a two-day range is selected. Availability templates with only Monday and Thursday can now be created.
Features
- Infeasible crew assignments now report a structured, human-readable reason instead of a bare “no solution” — the optimizer surfaces exactly which constraint blocked the assignment (!2333)
Fixes
- Calculator execution now reads the job-specific calculator URL with a zone-config fallback (!2346, closes #6876)
- Admins can now edit and delete comments from other users — permission keys were double-prefixed, making the ownership override silently inert (!2345, closes #6875)
- Document slots with no dispatchable identifier are no longer offered in the UI (!2340)
- Sales leaderboard no longer shows future revenue in the current period (!2336)
v2609.03.0 — September 3, 2026
MRs: !2334, !2332, !2331, !2330, !2329, !2328, !2327, !2326, !2325, !2321, !2320, !2319
Highlights
Terminal payments handle long waits and tell operators what is happening (!2334) Terminal pushes now return within a second and the panel follows the transaction through to settlement, showing waiting, paid, authorized, declined, cancelled, timeout, or lost states with real next-step messages. The review queue can now complete an open hold from a captured device sale, and pay links can be cancelled.
Permission system stabilized for multi-role users (!2320, !2321, !2325, !2328, !2319) A cascade of issues from the interstate permission changes affected cross-zone requests, admin comment editing, dashboard saves, and job imports. All paths now preserve the single-role fallback, merge permissions correctly, and handle the multi-role path correctly.
Performance
- Token validation now resolves from already-loaded data instead of re-fetching, eliminating a performance bottleneck on page loads (!2330)
- Charge and price product lookups are now batched, reducing repeated requests (!2332)
Fixes
- Jobs sidebar sub-items now navigate to the correct child routes (!2329)
- Dispatch crew leader is now auto-promoted when dropping onto a route, with a gold star icon and tooltip (!2329)
- Add-new-mover defaults to available + all 7 days enabled regardless of name parsing (!2329)
- Route table layout restructured to a table-like flex layout with crew on the left, event cards in the middle, and ops summary on the right (!2329)
- Ops summary input now uses a textarea with multi-line support (!2329)
- Crew size colors on schedule cards restored (!2326, !2331, !2332)
- Auto-assign crew from sibling events disabled due to a variable scope bug (!2327, closes #6847)
- Cross-zone permission handling fixed for users with multiple area roles (!2328, closes #6852)
- Calendar event creation now parses stringified metadata before validation (!2319, closes #6808, closes #6812)
- Transaction deletion no longer silently skips records when deleting multiple (!2319, closes #6810, closes #6811, closes #6813)
- Admin users can now edit and delete comments owned by other users (!2320)
- Interstate zone context resolution fixed — users with multiple area roles now context into the job’s owning franchise (!2321, closes #6815, closes #6819, closes #6820, closes #6822)
v2609.02.0 — September 2, 2026
MRs: !2313, !2304, !2318, !2317, !2312, !2314, !2316, !2315, !2308, !2243
Highlights
Dispatch board redesigned — table layout, autosave, and per-event crew (!2313) The dispatch board has been redesigned as a table layout with route rows, crew drop zones, and mini event cards. Crew can now be dragged between routes and assigned to individual events. A push-model save/discard flow with localStorage persistence replaces the old immediate-save pattern, plus an autosave toggle that debounces 5 seconds after the last edit with a visible countdown timer. Dispatch-only events (ops, reserve, admin) are now first-class events, and special blocks can be created, edited, and time-adjusted inline.
New Home page with reorderable cards (!2304) A personalized home page replaces the old landing experience. Cards for Quick Links, Dashboards, Help & Support, Recent Jobs, and Latest Releases can be dragged to reorder, toggled on/off via a gear menu, and persist to localStorage. The dashboards directory and business page have also been reworked with a searchable, categorized icon grid and breadcrumb picker.
Dashboards and Take Payment now gated by permissions (!2318, !2317) Dashboards are now visible based on role permission and zone type — five new permission keys control access. The Take Payment button on the job financials tab is now shown only when the zone has a payment processor enabled and the user holds the payment permission.
Features
- Infeasible worker assignments now return a human-readable reason instead of a bare “no solution” (!2243)
Fixes
- Customer billing address and profile edits are now saved correctly when a lead is created (!2312)
- Interstate jobs shared with a user’s zone now resolve the correct context zone (!2314, closes #6797)
- Sales leaderboard now shows agents with only future/scheduled events in the selected period (!2316)
- MCP reports can now read the 6 Ops Readiness checklist fields via data columns (!2315)
- Documents now notify the creator by email when fully signed (!2308)
- Abandoned and answered inbound calls no longer create stray leads in the wrong zone (!6411 routing fix, closes #6411)
Other
- Large codebase cleanup: removed deprecated scripts and dead config defaults (~106k lines removed)
v2609.01.0 — September 1, 2026
MRs: !2303, !2305, !2306, !2307, !2309, !2310, !2311
Highlights
Card payments go live (!2303) Franchises can now take card payments through terminals. The full flow is live: a terminal picker and push panel, keyed-in card fields, cards on file, payment and refund dialogs, authorization release, dual-pricing rate display, a reconciliation sweep, and refund handling with amounts, reasons, and authorisation tracking. The job financials panel re-reads itself while payments settle, so the job always reflects the money that actually moved.
Document creation gated behind opt-in config (!2307) Document creation is now blocked by default via a per-zone config; zones that still need the legacy document provider can toggle it on temporarily. A latent bug that would have turned a receipt-generation failure into a payment-endpoint error was also fixed.
Tables now split to fill the page (!2310) A customer’s estimate printed the job details on page 1 and left the rest blank because the charges table missed fitting by a fraction of a pixel. Tables now measure the room left on the page and split when they would overflow, so content fills each sheet instead of jumping to the next.
Job summary edits now recorded in history (!2311, closes #6494) Editing a job’s customer, admin, or crew summary left no trace. Summary edits are now diffed server-side and written as history items, so every summary change is auditable.
Fixes
- Global search no longer shows stale results when a second query’s response arrives out of order (!2305)
- AI no longer stops when it calls a non-existent function, and inventory item names are now visible to AI for complete summaries (!2309, closes #6792)
- NSC calculator now uses max labour hours instead of min for labour charges (!2306, closes #6678)
Other
- Receipt generation is now guarded so a receipt failure cannot fail the payment itself (!2307)