You are in the home-screen app. Sign in with your email and password here — Google and Apple sign-in open in a separate browser and cannot hand the session back to this app.
{{ loginErr }}
{{ loginDividerLabel }}
First-time setup. Sign in with your ADMIN_TOKEN, then create a staff email & password. The token stops working once you do.
Two-factor required — enter the 6-digit code from your authenticator app
{{ loginFootnote }}
WELCOME BACK{{ chooseWho }}
Where are you working from today? You can switch at any time by signing in again.
{{ twofaTitle }}
Every staff account needs an authenticator before it can be used. Until you finish this, your sign-in can do nothing else.
In Google Authenticator / Authy, tap add, scan this code, then enter the 6 digits it shows to confirm.
{{ setupKeyLabel }}
{{ twofaSecretGrouped }}
Letters and the digits 2–7 only. There is never a zero, one, eight or nine in it — anything round is the letter O.
{{ twofaErr }}
{{ payTitle }}
{{ paySub }}
This records money you have already taken on site and emails the customer a receipt. It does not charge a card.
Read live from Twilio each time you open this, and not stored here. Call records contain customers' phone numbers, and keeping a second copy would mean another place for them to leak from.
EMAIL
{{ mailProviderBadge }}
Booking confirmations, job updates and the weekly backup all go out from {{ mailFromAddress }}. Switch service, then send yourself a test — if it does not arrive, switch back.
Connect the business SumUp account and card payments (deposits, pay-by-link) go straight into it. Every checkout is raised at the site's live price at that moment, so what the customer pays can never lag behind a price change made here.
The download is every tyre at today's selling price with its photo link, ready for Items → Import in the SumUp dashboard. SumUp has no way for the site to write into its item list automatically, so re-download and re-import after a price change if you use the SumUp app's own item list — online payments never need it.
{{ suMsg }}
BOOKING DEPOSIT
{{ depState }}
A deposit is taken by card when the customer books, and comes off the final bill. It cuts no-shows on emergency call-outs, and it puts a payment step in front of every booking — which will lose you some jobs. Try it and watch the numbers.
Card payments are not set up yet, so deposits cannot be switched on. Until the card keys are set — SUMUP_API_KEY and SUMUP_MERCHANT_CODE — sending a customer to a checkout would take them to a page that fails.
{{ depMsg }}
{{ depErr }}
HOW LONG DATA IS KEPT
The law says you may only keep personal data for as long as you actually need it, and the ICO will ask you what your periods are. Anything older than these is deleted automatically overnight. A job that is still open is never deleted, whatever these say.
Your privacy notice states these periods in writing. It is a separate page and it does not update itself — if you change a number here, the notice has to be changed to match, or what customers were told is no longer true. You will get a warning below if they stop agreeing.
Your privacy notice no longer matches what this system does.
{{ d.text }}
Get the notice updated to match. A published retention period you are not keeping to is the kind of thing a complaint is made of.
{{ retJobYears }} · HMRC want 6 years, and so does the limitation period for a claim
{{ retContactYears }} since their last job
{{ retMessageYears }}
{{ retAuditYears }} · who changed what, and when
Counters only, no personal data
Emails and texts that did not arrive
{{ retLastRunLabel }}
The overnight purge has never run. A retention policy that reads correctly and deletes nothing is worse than no policy at all — it is a written promise you are not keeping. Press Run the purge now below to prove it works.
{{ retMsg }}
{{ retErr }}
MESSAGES SENT
What this system has sent on your behalf. Texts and WhatsApp messages go to customers about their jobs; emails are confirmations and receipts.
Month
Texts
Text segments
WhatsApp
Emails
{{ u.month }}
{{ u.sms }}
{{ u.segments }}
{{ u.unicodeNote }}
{{ u.whatsapp }}
{{ u.email }}
A text is charged per segment, not per message: 160 plain characters is one segment, but a single unusual character — a long dash, a curly apostrophe, an emoji — drops the limit to 70 and can turn one text into three. That is why both columns are here.
What Twilio has charged this month
{{ twilioTotal }}
Read live from Twilio for account {{ twilioSub }}. This is the billed figure, not our count.
{{ t.what }}{{ t.count }}{{ t.price }}
Twilio's own billing figures are not available: {{ twilioReason }}
CHECKS & BACKUPS
The system checks itself every morning and emails you only when something is wrong. A copy of everything is emailed to you every Monday. You can do either right now.
{{ retLastBackupLabel }}
No backup has ever been sent. There is no undo on this system: a record that gets overwritten is gone. Send one now and check it arrives.
Everything the daily check looks at is working.
{{ p.text }}
These could not be emailed to you — there is no valid owner address set, which is itself one of the problems above.
What the purge deleted
Nothing was old enough to delete. The purge ran, and that is the proof it works.
{{ r.label }}{{ r.count }}
Set up your staff login now. Create an email & password below — the shared admin token stops working as a login as soon as you do.
ADD OR UPDATE A STAFF LOGIN
Each person gets their own email and password. Entering an existing email changes that person's password.
Staff — jobs, customers, messages, stock and pricing. The day-to-day. Developer — all of that, plus the System tab and the data export. For whoever maintains the site. Remove this account at handover and nothing else changes. Owner — the business. Only an owner can touch another owner's account, and the last owner can never be removed, so you cannot be locked out of your own dashboard.
{{ stMsg }}
{{ stErr }}
Email
Name
Role
Status
Added
Actions
{{ a.email }}
{{ a.nameLabel }}
{{ a.roleLabel }}
{{ a.statusLabel }}
{{ a.joined }}
No staff logins yet — the dashboard is still protected only by the shared admin token. Add your own login above.
CUSTOMER CRM
Click a customer to view job history, set a discount and add notes
Nothing here can breach the £{{ pMinMargin }} minimum margin.
Run a sale without checking every line. A tyre takes the best single offer it qualifies for — offers never stack. Where a discount would eat into your minimum margin, the price simply stops falling and the tyre is marked floor in the catalogue.
{{ prErr }}
{{ o.name }}{{ o.state }}
{{ o.detail }}
No offers running. Everyone pays the calculated price.
Type a price to override that tyre. Clear the box and press Enter to go back to the calculated price.
TYRE CATALOGUE
Every tyre the supplier stocks, at your prices. Sort by worst margin to find anything the markup rules have got wrong.
{{ k.value }}
{{ k.label }}
{{ catInvertedHeadline }} A customer looking at those sizes is shown a budget tyre that costs more than a premium one. It comes from budget carrying a bigger markup % than premium — check the Tyre Pricing tab. Worst offenders: {{ catInvertedList }}
Loading the catalogue…
Nothing matches that search. Clear the box or pick a different brand.
Press the button and sign in with the business Google account (the one whose calendar should hold the jobs). Google will ask for permission once; after that every booking lands on that calendar automatically and customers get an invite.