Admin Dashboard | Cousins Mechanical Services
Cousins
ADMIN & STAFF PORTAL
{{ loginSubtitle }}
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.
{{ payErr }}
{{ payMsg }}
ALREADY RECORDED
{{ h.when }} · {{ h.method }} {{ h.amount }}
Cousins
ADMIN
DEMO DATA
{{ k.value }}
{{ k.label }}
RefServiceVehicleCustomerWhenConfirmStatusMove toMoneyLive GPS
{{ j.ref }} {{ j.svcLabel }}
{{ j.note }}
{{ j.reg }}
{{ j.name }}
{{ j.phone }}
{{ j.postcode }}
{{ j.when }} {{ j.statusLabel }} {{ j.confirmedNote }}
{{ j.paidLabel }} {{ j.mailLabel }}
No jobs yet.
Loading your settings…
{{ sysMsg }}
{{ sysErr }}
IS EVERYTHING LIVE?
{{ svcDomainHost }}
{{ svcDomainLabel }}
YOUR NUMBERS
{{ n.number }} takes {{ n.detail }}
{{ svcNumbersReason }}
RECENT CALLS
{{ svcCallsIn }} in · {{ svcCallsAnswered }} answered · {{ svcCallsMissed }} missed
{{ c.who }} {{ c.status }} {{ c.length }} {{ c.when }}
No calls recorded yet. {{ svcCallsReason }}
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.
{{ mailNote }}
{{ mailProblemHeadline }}
{{ f.to }} {{ f.subject }} {{ f.reason }} {{ f.when }}
CARD PAYMENTS — SUMUP
{{ suState }}
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.
MonthTextsText segmentsWhatsAppEmails
{{ 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 }}
EmailNameRoleStatusAddedActions
{{ 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
NameEmailMobileJobsDiscountNotesSMSMarketingJoined
{{ c.name }} {{ c.email }} {{ c.phone }} {{ c.jobCount }} {{ c.discountLabel }} {{ c.notesLabel }} {{ c.sms }} {{ c.marketing }} {{ c.joined }} Manage ›
No customers yet.
{{ custName }}
{{ custEmail }} · {{ custPhone }}
Open in HubSpot ↗
Loading…
{{ custErr }}
{{ custBookingCount }}
Jobs booked
{{ custSmsLabel }}
SMS updates
{{ custMktLabel }}
Marketing
LOYALTY DISCOUNT
Recorded for your reference when quoting. Not applied to prices automatically.
{{ custMsg }}
NOTES
{{ n.text }}
{{ n.when }}
No notes yet.
JOB HISTORY
RefServiceWhenStatus
{{ b.ref }} {{ b.svc }} {{ b.when }} {{ b.status }}
No jobs booked yet.
REGISTERED PORTAL USERS
AUTH ENGINE ACTIVE
NameEmailPhoneAuth MethodRegistered
{{ u.name }} {{ u.email }} {{ u.phone }} {{ u.authType }} {{ u.joined }}
No portal user accounts registered yet.
ADD NEW DRIVER / MOBILE VAN
DriverEmailVan RegMobileStatusNotesAccess
{{ d.name }}
{{ d.username }}
{{ d.email }}
{{ d.emailLabel }}
{{ d.status }}
{{ nt.when }} — {{ nt.text }}
Cannot approve until they confirm their email
{{ drvMsg }}
No drivers yet. A driver registers at /driver, confirms their email, then you approve them here.
LIVE FLEET & CLIENT TRACKING MAP
Real-time GPS positions of mobile service vans and active customer job locations
⚡ {{ invMsg }} SYSTEM ACTIVE
Total Tracked SKUs {{ invTotalSkus }} Catalogued inventory items
Low Stock Threshold Alerts {{ lowStockAlertsCount }} Items requiring reorder
Auto-Reorders Dispatched {{ invReordersCount }} Email/API POs generated
Total Stock Valuation {{ invTotalAssetValue }} Current wholesale asset value
AUTOMATION ENGINE
THRESHOLD & AUTOMATED REORDER RULES
{{ autoOrderTitle }}
{{ autoOrderBlurb }}
CENTRALIZED INVENTORY & THRESHOLD TRACKER
Brand & Item Description SKU Category Stock Level Min Thresh / Reorder Qty Cost / Retail Auto-Reorder Actions
{{ p.name }}
Brand: {{ p.brandLabel }} · Fitment: {{ p.sizeLabel }}
{{ p.sku }} {{ p.categoryLabel }}
{{ p.qty }} units ({{ p.statusBadge.text }})
Min: {{ p.minThreshold }} / Reorder: {{ p.targetReorder }}
Cost: {{ p.costLabel }}
Retail: {{ p.priceLabel }}
{{ p.autoReorderLabel }}
No tyre stock items match filter.
ADD NEW TYRE CATALOGUE ITEM & THRESHOLD RULE
REORDER LIST — WHAT NEEDS BUYING
Anything a job needed that wasn't in stock. With auto-ordering off, this is your buy list.
{{ reorderPendingLabel }}
WhatQtyWhyAddedStatusActions
{{ rl.description }} {{ rl.qty }} {{ rl.reason }} {{ rl.when }} {{ rl.statusLabel }}
Nothing waiting to be ordered.
SUPPLIER PURCHASE ORDERS & REORDER DISPATCH AUDIT LOGS
Automatic email/API reorders triggered when stock falls below set threshold
PO Reference Trigger Source Tyre Item / SKU Qty Ordered Supplier Email Status Supplier API Status Est. Delivery
{{ po.poRef }}
{{ po.customerName }}
{{ po.jobRef }}
{{ po.tyreDetails }} {{ po.qty }} units Email Dispatched API 200 OK {{ po.estDelivery }}
No supplier purchase orders generated yet.
REMOTE SUPPLIER CATALOGUE
WHOLESALE CATALOGUE LOOKUP & REORDER
{{ catalogueSummary }}
{{ c.brand }}
{{ c.model }}
Size: {{ c.size }} · SKU: {{ c.sku }}
Cost: £{{ c.cost }} Retail: £{{ c.price }}
No customer messages yet.
{{ t.name }}
{{ t.last }}
{{ m.text }}
{{ m.who }} · {{ m.time }}
Select a conversation
RETAIL PRICING & STOCK
Set your margin once and every tyre on the website reprices. Override any single tyre, and tick what is in the van.
MARKUP ON WHOLESALE COST
0 = not shown to customers
Shown on the booking form
The floor. No sale goes below it.
Customer price = wholesale cost + markup % + fitting fee, rounded.
{{ pMsg }}
{{ pErr }}
OFFERS & SALES
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.
LOOK UP A SIZE
{{ pStockSummary }}
In van Tier Tyre Your SKU Cost Sell price Margin Supplier
{{ t.tier }}
{{ t.brand }} {{ t.model }}
{{ t.label }}
{{ t.sku }} {{ t.costLabel }}
{{ t.priceNote }}
{{ t.marginLabel }} Order →
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.
{{ t.brand }} {{ t.tierLabel }}
{{ t.model }}
{{ t.label }}
{{ t.sku }}
{{ t.priceLabel }} {{ t.wasLabel }} cost {{ t.costLabel }}
{{ t.offerLabel }}
{{ t.marginLabel }}
{{ t.priceNote }} Order →
{{ catPageLabel }}
{{ calAccountLabel }}
{{ calErrorMsg }}
{{ calMonthLabel }}
MON
TUE
WED
THU
FRI
SAT
SUN
{{ calPickLabel }}
{{ r.time }}
{{ r.title }}
{{ r.sub }}
{{ r.statusLabel }}
Nothing in the diary that day.
{{ cd.label }}
{{ cd.count }}
{{ j.time }}
{{ j.title }}
{{ j.sub }}
{{ j.statusLabel }}
Nothing in the diary from today onwards. New bookings appear here, and on the Google calendar, automatically.
CONNECT YOUR GOOGLE CALENDAR

Connect the business Google account and every booking lands on your calendar automatically. You can also open the jobs calendar in Google at any time.

Open Google Calendar ↗
{{ calMsg }}

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.