Back to changelog
    · 7 min read10 updates

    Billing that keeps your site up, a viewer anyone can use, and filters on the tours list

    BillingViewerDashboard

    An audit of the product turned up a set of problems that were live rather than theoretical. This is the batch that closes them.

    A declined card no longer takes your site down

    This was the worst of them. Stripe reports a failed payment as past due and then retries the card for about three weeks. We treated anything other than an active subscription as unpublished, so the first failed retry replaced a paying customer's public showcase with the preview watermark and stopped their custom domain resolving, with no email explaining why. You would have found out from a buyer.

    The same rule caught cancellations, which in Stripe means paid through to the end of the period, so cancelling something you had already paid for watermarked it immediately instead of at the date it actually ends.

    A project now serves normally for as long as its subscription is live, and that includes a card being retried and a cancellation that still has paid time left. It falls back to preview in three cases: it was never published, Stripe gave up collecting, or a cancellation reached the end of the paid period. Custom domains and the AI assistant follow the same rule, so a retrying card cannot take a domain offline either.

    Billing emails

    The billing lifecycle was silent. It now writes to the organization's admins at four points:

    • Your card was declined, your project is still public, and here is what happens if the retries fail.
    • Your project is live, when it goes public from draft or after being restarted.
    • Your cancellation is scheduled, naming the date the project stops being public.
    • Your project is no longer public, with the right next step depending on whether it was a failed payment or a cancellation, and an explicit note that nothing was deleted.

    A subscription that is past due or unpaid now also shows a banner in the dashboard with a button into the Stripe portal, which is the way back for both. Previously an unpaid subscription showed nothing actionable at all.

    Tax ID and billing address on invoices

    Checkout asks for a billing address and, optionally, a tax ID, and writes both onto your customer record rather than leaving them attached to the payment page. That is what puts a VAT number on an EU invoice.

    A billing details card on the billing page shows the company name, invoice email, tax ID and address that invoices are being issued to, and editing goes through the Stripe portal, which validates VAT numbers as you type them. We collect and display this identity; we do not calculate or charge tax.

    The viewer, for people who don't use a mouse

    Four things stopped a buyer completing the journey, and all four are fixed.

    Tabbing through the unit list crashed the viewer to the error page. Focus reached the small floor-plan icon in a row and the entire page unmounted.

    On a phone, every page except Home was a dead end. The menu button lived inside the sidebar, which only renders on Home, so Location, About, Gallery, Downloads and Compare had no menu and no way back, and the browser's back button left the site entirely. Those pages now carry a bar with a back control, the page name and the menu, and back moves between pages the way it should.

    Keyboard and screen reader users could not select a unit at all. Rows are now focusable and selectable with Enter or Space, and focusing a row highlights the matching shape on the render the way hovering does. The shapes are buttons with real names, so a screen reader announces "A-001, Available" rather than an unlabelled graphic.

    Submitting an empty inquiry form printed a validation library's internal error three times over. It now says what is missing, in the visitor's language.

    Alongside those: names on the zoom, close, back and collapse controls, titles on map markers, an alternative to the pulsing selection highlight for people who have asked their system to reduce motion, and a proper page heading and main landmark, which the viewer had never had.

    Tapping a flat on the model

    On a phone, tapping a flat on the building render did nothing at all. No selection, no highlight, no details, no feedback of any kind about where you had just tapped.

    Taps now work on every device, with a guard so that panning and pinching are not mistaken for a tap, and the tapped flat gets a summary card with a way through to the full details. While fixing it we found the selection highlight was invisible for part of its animation, fading to nothing at both ends of every cycle. The selected flat now keeps a white outline throughout, on every project, on desktop as well as mobile.

    The dashboard, same treatment

    Sortable table headers were clickable divs, so they could not be reached with Tab and nothing announced which column was sorted. They are real buttons now, and each column says which way it is sorted. Unit status was carried by colour and a hover tooltip alone, so the label is now available to assistive technology as well.

    Icon-only buttons across the asset library, unit galleries and the detail pages have names, and the reorder and remove controls that only appeared on hover now appear on focus too, so a keyboard user is no longer focusing a button they cannot see.

    A correctness bug turned up while doing it: the dashboard showed sale wording on rental projects, because the units table was reading the listing type from a store that only exists in the viewer.

    Sorting and filtering virtual tours

    The tours list had a search box and nothing else, with the order fixed to newest first. It now sorts by newest, oldest or name, filters by project, and filters by whether a tour has linked scenes or is a single view. All three live in the URL, so a filtered list is a link you can send. The empty state tells the difference between having no tours and having no matches, and offers to clear the filters.

    Switching a tour's engine now asks for confirmation and says what will happen, rather than rebuilding a published tour on a single click from a menu.

    Fixes around leads and email

    • Ten dashboard pages were not behind the sign-in guard. A signed-out visitor got the full dashboard shell until an API call bounced them.
    • On the inquiry page, the lead's email and phone were links pointing nowhere and the copy button did nothing, on the one screen where you act on a lead. All three work.
    • Replying to a lead notification email reached us rather than the buyer, silently. It now replies to the lead.
    • Emails rendered a broken image where the logo should have been, in every message we send.
    • The follow-up emails after an invite or a new account went out unconditionally, so people were told they had not accepted an invitation they had accepted, and accounts that had been deleted still got a check-in. Both now check before sending.
    • Saving your profile showed a success message and then put the old values back on screen.

    The assistant's costs and privacy

    Conversations are no longer retained by the model provider, which matters because a visitor can give the assistant their name, email and phone. Cost is now measured properly, counting the project context sent with every turn and any web searches, rather than the reply alone, so the monthly budget on a project reflects what is actually being spent.

    Smaller things

    • The build identifier that sat under the product name in the sidebar is gone for customers. It was a support detail, and it is still there for us.
    • The embed page's offer of help linked to our agency's contact page. It links to the product's own contact page now.
    • The movement hint that explains how to look left and right no longer sits on top of the frame labels.
    • Long apartment descriptions fade out rather than being cut off mid-line.
    Contact

    Tell us more about
    what you're building.

    Book a 30 min call

    Bring a project and we’ll sketch how it could look in the viewer.

    Eng. Fabio Palvelli

    Typically we reply within 24h