August 18, 2026
Your customers' page reads cleanly in dark mode (still light by default)
The customer's project page had a set of colours that only worked on a light background — blue headings and links that faded on dark cards, pale yellow and green boxes that glowed, one message bubble that vanished entirely. Every one of them now follows the same light-or-dark colour rules as the rest of the app, and the light version got two small legibility improvements too (grey captions and the amber/green notice text are a step darker). Customers still see the light page; the dark version is ready for the owner to review.
Labour: the side-menu filters open the right list, every time
Two things were wrong with the Labour side-menu filters. "Approved" opened the Pending Review list instead of the Approved one, and clicking a second filter while already on the page changed the web address but not the list. Both fixed: the address is now the single source of truth for which list you see, so the side menu and the page always agree. On desktop the row of pills above the list is gone — the side menu already carries the same filters; on phones (where the side menu is hidden) the pills stay.
The app agrees with itself about what day it is
Eighteen screens worked out "today" from the clock in London rather than in Vancouver, so from about five in the afternoon the dashboard windows, the installer's today list, the calendar highlight, the phone nav badge, the labour sheet and the project page all quietly believed it was tomorrow. Every one now reads the same business-day rule the customer's page uses. Two more things from the same rule: the dashboard calls a measurement "late" only once its day is over (the way the customer sees it), and an installer is no longer offered "request a new date" for a visit whose day has passed — mark it done or move it to Pending Booking instead.
Your store's phone, hours, address and logo come from your settings
The phone number in customer texts and the email footer, the hours in the away-message, the logo on the customer's page and the city the assistant describes were still typed into the software in a few places. They now all come from the store's own settings — the phone you set under Admin → Settings wins everywhere. Nothing changes for this store today; a new store sees its own details on day one.
Signing in happens on the server now
Until today the app checked your password in the browser, which meant the password hashes had to travel to it. Sign-in and the invite link now run on the server; the hashes never leave the database. Nothing changes about how you sign in — same screen, same PIN or password. This is the first step of locking down who can read what; the next steps are done with the owner watching.
Messages shows you who went quiet
The right-hand side of the messages page used to say "Select a conversation" — half the screen describing something you could already see. It now lists the customers you messaged who never replied, longest silence first, with the last thing you said to each one. On live data it found six people, the oldest waiting forty-three days. Clicking one opens their thread. If everyone has answered, it says so instead.
One New button, and filters on your messages
A customer page had four separate "Start new…" buttons scattered down it, each in its own section, all saying the same thing. They are one **New** button in the header now, next to Book Job. On the messages list there are All / Unread / SMS filters above both halves — Unread shows only what you have not answered across customers and team, and SMS narrows to customer texts.
Your staff list is data, not code
The people on your team — who gets copied on a new order, who is the salesperson behind the initials on a sheet, who an installer notification names — used to be written into the software itself. They now come from the same team list you manage in the app. For this store nothing changes; a new store starts with its own people on day one instead of somebody else's.
Tidier calls and messages lists
Every row in the messages list is now the same height instead of three different ones, and each row shows one time — how long since the last message — rather than two that disagreed. Hovering the little dot beside someone still tells you when they were last online. On the calls page the team is a single row of names rather than a block of cards, and the day summary is back to four figures; the missed count now sits on the Missed filter beside it.
The customer page stops contradicting itself
A customer who had paid in full could show "No payment data" a few inches from a panel reading $12,404 and a summary saying the balance was settled — three answers to one question on one screen. The payment figure now simply does not appear when we hold no record, which is what the labour sheet version of the same panel already did. The journey down the left now reads top to bottom with each date beside its step instead of scrolling sideways, and the two panels that only ever said "nothing here yet" no longer take up room until they have something.
Every automation now reads the store from the deployment — zero left
The last fourteen places — follow-up sequences, the missed-call auto-reply, installer day-before reminders and the automation engine — no longer have the first store's name written in. Sixty places were fixed today across the whole server side; the check that counts them is now a hard zero, so one can never creep back. Nothing changes for this store; a new store's app will find its own settings everywhere on day one.
Text-message handling no longer assumes one shop
The part of the system that receives and reads customer texts had the first store's name written into three settings lookups. It now reads the store from the deployment. Nothing changes for this store's texts; the next store's message settings will be found instead of ignored.
Customer reminders and follow-ups no longer assume one shop
The nightly and hourly automations that send install reminders, quote follow-ups and balance nudges had the first store's name written into twenty-one places. They now read the store from the deployment. For this store nothing changes — the same messages go out at the same times; for the next store, the automations will find their settings instead of silently doing nothing.
Groundwork for new stores: 22 fewer places assume one shop
Behind the scenes, twenty-two places in the server code had the first store's name written in as the key that picks its rate card, settings and jobs. They now read the store from the deployment instead. Nothing changes for the current store; for the next store it means those screens will not come back empty. The remaining places are on the messaging paths and are being done one file at a time, watched.
A measurement date that has passed stops asking you to change it
If a customer's measurement day went by and nobody had marked the visit done, their portal kept showing the old date with a "Change this time" button — a door that led nowhere, sometimes for weeks. It now says their measurement date has passed and their salesperson will reach out shortly with final pricing, and the change-time button is gone. Nothing is assumed about whether the visit happened; staff still set the real status. The date is judged in your store's own timezone, so an evening appointment never reads as yesterday's.
Copy a customer their portal link, from the quote
The quote screen can now hand you the link to the customer's own view of their job — one item in the quote menu, copied straight to your clipboard so you can paste it into a text or an email you are already writing. It copies rather than opening, because opening it would put YOU in their portal and count as them looking at it. A quote that is not attached to a job yet has no portal, and the menu says so instead of handing back a broken link.
A suggestion while you are still on the call
When a customer pushes back on price, names a deadline, or mentions another company, a card now appears under the call bar with one sentence you could say next — the actual words, ready to read aloud, not advice about what to do. It only appears when there is something worth saying: on a call going fine you see nothing at all. One card at a time, never more than one every eight seconds, and you can dismiss it if you have already handled it.
ifloor.app: the website, refreshed
The public site now looks like the product it sells: the same warm light and dark themes as the app (it follows your device, or pick one in the header), the real staff screen on the home page instead of a drawing, a nine-chapter tour of every screen, and a changelog page. Try the colour swatches on the home page — the app frames repaint in that store's colour. Nothing about the app itself changed in this release; this is the website (ifloor-web 5a462fe).
Listen, whisper, or jump into a call
Listening in on someone else's call was silent-only — you could hear the trouble and do nothing about it. An admin listening can now switch to Whisper, where only your rep hears you and the customer does not, or Jump in, which makes it a three-way call. A band beside the controls says in plain words who can hear you at that moment, and Jump in is the only red button on the screen.
The customer page has a shape
A customer's page was thirteen full-width bands stacked in the order they were built, and Communications appeared on it TWICE — a full timeline near the top and a second SMS-only list at the bottom, together more than half the page. It is now three columns: where they are in your process on the left, everything ever said in the middle, and what you sold them plus what we know on the right. The duplicate list is gone (every message was already in the timeline), sections that had nothing to say no longer take up space, and the page is roughly half as long.
Watch a colleague’s call as it happens
Opening someone else’s live call in the call centre used to show their transcript up to fifteen seconds late — long enough that by the time you read what the customer objected to, your colleague had already answered. Their words now appear as they are spoken, and the label says “live” instead of “a few seconds behind”. If you open a call that started earlier you still get the part you missed first, then the rest as it happens.
Call transcripts say who was speaking
Live transcripts were one block of text with both voices run together, so you could not tell a customer’s question from the answer. Each line is now marked “You” or “Them”, and the saved transcript on the call record is labelled the same way. The alert for a call going wrong now only listens to the CUSTOMER — before, reading a complaint back to someone could set it off yourself.
Hold gets louder, and you can’t transfer to an empty chair
A call left on hold now turns amber after a minute and red after two, because a timer that looks the same at five seconds and four minutes is how somebody ends up waiting. The transfer list shows who is actually available: people who are offline are still listed, so you know where they are, but you cannot hand a customer to them and leave the customer listening to nothing.
Calls page: the log stops being the page
The call log had grown to 83% of the page — 59 rows, nearly 3,000px, above everything else. It now shows the newest twenty with a button that says exactly how many older calls there are ("Show 39 more"), so nothing is hidden and the filter row does the scanning past that point. The whole page now follows one design rather than a new section stacked on an old one.
Calls page readable in dark mode
In dark mode more than half of the calls page was unreadable — the word "Calls" and customer names were painted the same colour as their background. The cause was an old template stylesheet the app had never used but which still defined colour names other files borrowed. Fixed at the root, so every page that borrowed those names is fixed with it.
Messages: your customers' texts are front and centre
Forty-four customer SMS conversations were folded behind one row labelled "SMS Inbox" while staff and installer chats sat at the top. Customers are now at the top level of the Messages list, where the people who pay you belong.
The quote page: the number and the total were invisible in dark
On a quote in dark mode the quote number and the project total were painted the same colour as their background. Eighteen colour failures on that page traced to one stylesheet written against a palette the app does not use; it now reads the app's own tokens in both themes.
"Send to customer" no longer shows $0.00
The send dialog could preview a $0.00 total for a real quote because it read the figure from the wrong place. It now shows the same total the quote does. No customer received a wrong number — the dialog only previews.
The floating toolbar answers two questions
Nine controls at six different heights became four at one height. Your name, settings and profile now sit at the bottom of the side menu; open tasks and notifications are one bell with two tabs and one combined count. Found and fixed on the way: the notification panel had been unreadable in dark mode since dark mode shipped.