Skip to content
Profit Jockey Software

The product

Everything it does.
And everything it doesn’t.

This is the long version, written by the person who builds it. Every feature below is in the code today. Several of them ship switched off, because a detailer should not have to turn things off to get a working site. Where something is missing, this page says so.

One detailer’s site runs on this today. The Grime Scene — mobile detailing in Northern California — has been live at tgscene.com (opens in a new tab) since 6 September 2026, with online booking still switched off until the owner turns it on. That is the whole list. There is no wall of logos on this page because there is nothing honest to put in one yet.

Booking and availability

Times you can actually work, not a request form

A customer picks their vehicle size, picks services, and sees start times that fit. Take a two and a half hour mobile job: your day runs 8:00 to 5:00, you keep an hour of travel either side of a mobile appointment, one job at a time, and there is already a mobile job booked at 1:00. The calendar offers 8:00 and 8:30.

  • Start times every 30 minutes, a 24-hour minimum notice and a 60-day booking window. Every one of those is a number you change in your own settings.
  • The slot is checked again the moment they submit, inside a database lock. Two people cannot take the same time, and the second one is told immediately rather than after you have called them.
  • Paying online holds the slot for 30 minutes and then releases it. A payment that arrives late — a slow 3-D Secure check — still confirms the booking.
  • Every time is in your time zone. On the spring-forward morning the calendar skips the hour that does not exist, which is tested in two time zones because it is exactly the kind of thing that silently books someone at 2:30 AM.
  • Change your hours over an appointment that already exists and the software lists the clash and asks you what to do. It never cancels a customer to make your settings tidy.
  • Booking stays off until you switch it on yourself. Until then the site shows your phone number, so nothing can go wrong while you look around.

Not there: a waiting list, deliberate overbooking, and route planning between mobile jobs. The travel buffer is a fixed number of minutes, not a distance.

Thursday · 2 h 30 m mobile job · a mobile 1:00 already bookedIllustration
  • 8:00 AMOpen
  • 8:30 AMOpen
  • 9:00 AM – 2:30 PMbuffer + the 1:00 job
  • after 2:30 PMwould not finish by 5:00

hours 8:00–5:00 · 1 job at a time · 60 min travel each side · 30 min start times

Two start times out of a nine-hour day, and every exclusion has a reason: an hour of travel is kept either side of a mobile job, one job runs at a time, and the work has to finish before you close.

Payment

Pay now and save 5%, or pay at the appointment

Someone books at 11:40 at night, pays $209 on their phone, and the appointment is confirmed before you are awake. The $209 lands in your Stripe account. Not ours — there is no platform fee, no cut and no Stripe Connect in the middle.

  • The 5% is a setting. Set it to zero and the option disappears. It is stored in basis points, the total is computed in whole cents on the server, and the rounding happens once, in one function — so the number on the confirmation is the number Stripe charged, to the cent.
  • Card details never reach your site. Payment happens on Stripe’s own hosted page, and the site stores an identifier, not a card.
  • Optional deposits on pay-at-appointment bookings: a flat amount or a percentage, refundable before your cutoff or not, your choice. Ships off.
  • Refunds are a button you press, never automatic. A cancelled prepaid booking is flagged “refund due” and waits for your decision, because a refund policy is yours to have, not ours to assume.
  • Sales tax is a rate you set, applied after the discounts, shown on its own line.
  • A tip for your detailer, if you switch it on. It is offered with the online payment only, added after every discount, and never taxed. “No tip” is what is selected when the step loads, always — a pre-selected tip is a dark pattern, and there is no setting that turns one on. The percentages are yours to set and are taken on the price of the work, not the discounted total, and the customer sees both figures.
  • A tip is always its own line — on the confirmation, in the email, in your money breakdown, in the export — and the month panel says how much of what you took was tips. A refund never keeps or returns a tip silently: the form says which, in a sentence, before you press the button.
  • Bookings that come to $0 confirm without a card at all, and a total under 50 cents is not offered online — Stripe will not take it.

Not there: invoicing, payment plans, a tip at the appointment, and any way for us to touch your money. Tipping ships off.

Booking · step 4 of 4Illustration
Pay now

Save 5% · charged today

Pay at the appointment

Charged today $0.00

Subtotal
$220.00
Pay-now discount (5%)
−$11.00
Total
$209.00
charged now $209.00due at the appointment $0.00
Every number here is computed on the server from your own menu. The browser sends which services were picked — never a price.

Referral rewards

The reward lands on the booking they just made

Every customer gets a personal code on their confirmation page and in their email, with a share button. When a friend books with it, the person who shared gets 10% off — on the appointment they have already got in the calendar.

That decision matters more than it looks. Credit towards a future visit is worth almost nothing to somebody who details their car twice a year. Ten percent off the detail they booked this morning is worth sending to a group chat this afternoon.

  • If they have not paid yet, their total drops and they get an email with the new amount.
  • If they have already paid, the difference — including its share of the tax — goes back to their card through Stripe, without you doing anything.
  • If the friend cancels before the referrer paid, the total goes back up and the referrer is told why, in plain words. If the friend rebooks, it comes straight back.
  • A friend means a first-time customer, once, and not the same person under a second email address. A code that does not qualify fails softly: the booking still goes through.
  • You decide when it unlocks — when the friend books, when the friend pays, or when the friend’s job is finished, which is the safest against no-shows.
  • The emails never name the friend or show their booking. Nobody finds out who told on them.

There is no switch for this and no charge for it. It is a discount you give out of your own margin, so it would be strange for us to meter it.

What the reward actually doesIllustration
  1. 1

    Dana books

    Their confirmation carries a personal code and a share button.

  2. 2

    Sam books with it

    First time here, a different person, a real booking. It counts.

  3. 3

    Dana’s total drops $22.00

    10% of the booking Dana just made. If Dana already paid, the $22.00 goes back to the card.

If Sam cancels before Dana has paid, Dana’s total goes back up and Dana is told exactly why — and if Sam rebooks, it comes back.

Memberships

Monthly plans, billed on your own Stripe

A price, an interval, one included service and how many visits it covers, and an optional member percentage on everything else. A member who books sees the credit before they pay: the included service comes off the ticket, the percentage comes off the rest.

  • Credits reset each period. They do not stack up, and the plan page and the welcome email both say so before anybody signs up.
  • Cancel a booking that used a credit inside the same period and the credit comes back. After the renewal it does not, and the reason is written into the membership’s history rather than left as a mystery.
  • Members change their card and cancel through Stripe’s own billing portal. No card details on your site, and no cancellation you have to process by hand.
  • Re-price a plan and existing members keep the price they signed up at, because that is what they agreed to.
  • One live membership per customer, enforced by the database rather than by hope.
  • Ships off. While it is off the memberships page returns a 404 and the booking form says nothing about it at all.

Not built: two memberships at once, gift memberships, family or multi-vehicle plans, credits covering more than one service. Also worth hearing before your first statement rather than after it — Stripe charges about 0.7% on recurring billing on top of the usual card fee, and it goes to Stripe.

A plan, as the owner sets it upIllustration
Monthly Maintenance$89 / mo
Included each month
1 × Basic Wash
Member discount
10%
Billed on
your Stripe

A member books the Basic Wash and their included visit takes it off the ticket. The 10% comes off the rest. Both are decided on the server, inside the transaction that creates the booking.

The subscription is created on your own Stripe account. No platform cut, and no card details on your site.

Marketing

Campaigns and follow-ups, gated on consent

One-off campaigns and three automatic follow-ups: a thank-you a day after the job — carrying your review link, if you have given us one — a win-back at 90 days, and a rebook nudge at 120. Audiences are worked out from your bookings when the send starts, so there is no stored list to go stale.

Why it is gated

Only customers who ticked the box in your booking form can be mailed. Having booked is not consent, and neither is being on a list: the customer importer brings in names and past visits, never consent, and refuses a column that tries to. Every promotional email carries a one-click unsubscribe and the physical postal address the law requires, and the panel refuses to send while that address is empty. An unsubscribe takes effect in the same request, not in ten business days.

This is not paperwork for its own sake. Your confirmations and reminders leave from your own domain. One run of spam complaints and they stop landing in inboxes — and then the reminders stop working, which is the part that actually costs you money.

  • Audiences: everyone, customers, lapsed at 90 days, never booked, or people who bought a particular service inside a window you set.
  • Campaigns are plain text with merge fields. Write it, send yourself a test, schedule it, cancel it while it is still scheduled.
  • Every skipped recipient is listed with the reason: not opted in, blocked, no address, or mailed too recently.
  • That last one is a 72-hour cap counted across campaigns and automations together, so two features cannot both mail the same person before breakfast.
  • Confirmations, reminders and receipts are not marketing. They always send, they carry no unsubscribe link, and none of these rules touch them.

No marketing texts. Texting an offer needs its own written consent under the TCPA, and quietly reusing a booking consent for it would be wrong — so it is a documented piece of work, not a switch. No tracking pixels and no open or click tracking either.

Campaign · audienceIllustration

Lapsed customers

A completed booking, nothing since 90 days, and nothing on the calendar — worked out from your bookings when the send starts.

Will receive it
34
Skipped
12
  • not opted in9
  • no email address1
  • mailed in the last 72 hours2
Nobody is skipped silently. Every address that did not get the email is listed with the reason it did not.

Crew profiles

The people who do the work

A photo, a name, a role and a few sentences for each person, under your About copy. A new profile is a draft until you publish it, and you set the order.

Bios are capped at 600 characters with a live count, because three sentences read better than a page. Published people are added to the site’s structured data, which is the part Google reads. It is presentation only, and the software is honest about that: a booking is never assigned to a technician.

If nobody is published, the section does not exist. No heading, no placeholder faces, no invented names. That rule runs through the whole product — it will not print a testimonial, an award, a years-in-business number or a customer count, because you have not said any of it and we are not going to say it for you.


Bringing your customers with you

Your customer list and their past visits, read in from a file

An established detailer’s customers live in Jobber, Housecall Pro or a spreadsheet. Export them as a CSV — one row per past visit, which is the shape those tools already write — and the admin reads it in: the customers, and a completed booking for each visit, dated the day it happened. Twenty customers can be pasted straight from the spreadsheet without saving a file.

  • You see everything before anything is written: every column by name and where it goes, who will be created, who already exists, and every skipped row with its line number and one plain sentence saying why. A column the file names differently you point at the right field by hand. Nothing is saved until you press the button on a preview you have read.
  • A customer already in the system is never overwritten. Blank fields are filled; a name or phone that differs is shown to you as a conflict, and the stored value wins.
  • Imported customers are not subscribed to marketing email. There is no consent column, and a column that tries to be one — opt-in, subscribed, newsletter — refuses the whole file by name rather than being quietly dropped. They can opt in when they next book.
  • Imported visits carry no money. There is no amount column, and there will not be one: money this software did not take is not revenue, and it stays out of your takings, your balance due and your close-out list.
  • The same file twice creates nothing the second time. A corrected file adds only what is new.
  • An import can be undone for as long as nothing has come to depend on it — a real booking, a payment, a sent email. The record that a list was brought in and withdrawn stays.

What the history is for: a win-back at 90 days has a date to count from, and the marketing panel knows a returning customer from a stranger — on the day they tick the box on a booking of their own, and not before. One CSV, up to 2 MB and 5,000 rows. No XLSX: save it as CSV first.


Missed calls

One text back to the caller you could not pick up

A detailer under somebody’s car with wet hands is not answering the phone, and the caller is dialling the next detailer about ninety seconds later. Your published number rings your own mobile through Twilio, for as many seconds as you set. When nobody picks up, the caller gets one text: “Sorry we missed your call. This is your business. How can we help? Reply to this text and we’ll get right back to you. Reply STOP to opt out.” What they text back lands in your admin, and you answer it yourself.

  • It is one fixed text — in your own words, if you change them — and nothing that answers on your behalf. No bot, no menu, no voicemail, no transcription. A reply is stored and shown to you; nothing replies to it automatically.
  • One text per caller, not one per call. Three calls in a minute get one message; the same number is texted at most once inside a window you set, an hour by default, and never more than three times in a day whatever the window says.
  • A number that has replied STOP is never texted again, on any path, for good.
  • A call that was answered — however briefly — sends nothing. A call whose outcome never came back sends nothing either, and is put in front of you with the raw status beside it, rather than texting a stranger who may have just finished speaking to you.
  • Off by default, and off never means the phone stops ringing: the switch governs the text, not the call. It cannot be switched on until texting is on and Twilio is configured, and the settings screen names whichever one is missing.
  • Every call and every message is a line in one thread per number — the missed call, the text it produced, the reply, your answer — with unread replies and today’s missed calls counted at the top.

Not there: a lead record — a missed call creates no customer and no booking — call recording, and any way to text a number that never contacted you. It sits on Pro, behind the same carrier registration as the reminders.


Drafting

Three things it drafts. You read them, and you send them.

Three pieces of text you already had a form for, drafted inside the admin by a language model: a short brief from a booking’s notes before the job; a title and caption for a gallery photo, from what is visible in it; and a reply to a review you paste in. A model drafts. A person sends.

  • Nothing it writes goes anywhere on its own. It never posts, never sends and never publishes. A draft lands in the field you were about to type in and is saved when you save it; the review reply you copy out yourself, and nothing is posted anywhere.
  • It never invents a number or a claim. Prices and durations come from your menu, as the checkout computes them. A draft that contains a figure of its own, or says best, award-winning, certified, guaranteed or anything else you did not type, is thrown away unread — you see “Couldn’t draft this — write it yourself”, and you do.
  • It sees only what the draft is about: your business name, your own copy and your menu, and then that one booking’s notes, that one photo’s fields, that one review. Never another customer, never your customer list, never card details.
  • The brief is shown on the admin page and nowhere else — never in an email, never on the customer’s page, never stored — because a candid note of yours surfacing where a customer could read it is the failure this is shaped to prevent.
  • Off by default, and until you switch it on nothing runs: no model is contacted and no prompt is built. It runs only when you press the button, never on a timer, and it stops for the month at a ceiling, so a runaway costs a sentence and not a bill.
  • Switching it on names the model’s provider, Anthropic, as a processor of your business’s data on your privacy page, saying what is sent and when. While it is off, the page says nothing about a model.

It sits on Pro. Not there, deliberately: a chat widget, a text that answers a customer, a voice that books, marketing copy, and anything that writes to a customer-facing page without your save. A model that talks to your customers in your name is its own decision, and it has not been made.


The owner admin

Built for a phone, held in one hand, next to a car

The part you use every day. Nothing in it needs a developer, which is the whole point: a booking site you have to email somebody to change is a booking site you stop changing.

  • The dashboard: today, what is coming, who is mid-payment right now, what needs closing out, what needs a decision, the balance owed and the month’s takings.
  • Take a phone booking with an override for your own rules, and it behaves like any other booking — reminder, calendar file, close-out, the lot. That is better than blocking the time out.
  • Reschedule, cancel, record a cash or terminal payment, refund, resend a confirmation. Search by name, phone, email, plate or reference.
  • Nothing is ever rewritten. Every status change and every movement of money appends a line, so the history of a booking is a log rather than a guess.
  • Forget to close a job out and it completes itself after 48 hours and flags it, so a day’s takings are never quietly lost.
  • Availability, services, gallery, customers, a referrals report, the customer importer, the text threads, and CSV exports of bookings and customers.
  • Sign-in is an email and a password, with sessions that expire, sign-out-everywhere, and a reset by email. A locked-out account emails you rather than leaving you guessing.

When a customer asks to be removed you can do it properly: names, addresses, plates and notes are replaced, while the amounts and statuses stay, so your books still add up.

The words are settings too. “Vehicle”, the size tiers, the year-make-model fields and the service categories are configuration rather than code, so the same product can be set up for a trade that is not detailing. It was built for detailing, and detailing is the one trade running on it.

Admin · dashboardIllustration

3

Today

1

Needs close-out

$418

Due at appointment

Slot conflict after paymentGS-7QK4M2

They paid, but by then the time was no longer free. Move one of the two.

A flag is the software saying what it did and asking what you want done about it. It never quietly cancels a customer to tidy up its own problem.

The honest part

What it does not do

Written down here so you find out now instead of three weeks in, when you have already sent us money and told a customer it can do it.

  • No text messages on day one

    SMS is built, but it needs a Twilio account in your name and US carrier registration, which takes one to two weeks and is not ours to hurry. It stays switched off until that clears, and it sits on the Pro plan. The missed-call text-back stands on the same registration, so it waits too.

  • No app

    It is a website. It works in the browser on your phone and on your customers’ phones. There is nothing to install, nothing to update, and no app store deciding whether your customers can book.

  • One business, one location

    One set of hours, one menu, one gallery, one address. Two shops with different hours are two sites. The jobs-at-once setting covers a second crew working the same day — it is not a second location.

  • No accounting integration

    No QuickBooks, no Xero, no bookkeeping sync of any kind. There is a CSV export of bookings and one of customers, and that is the whole of it.

  • No per-technician scheduling

    A booking is never assigned to a person and nobody has their own calendar. Crew profiles are a page about your people, not a rota.

  • An import brings visits, not money

    The importer reads customers and their past visits from a CSV. It reads no amounts — money this software did not take is not revenue — no addresses, no XLSX, and no upcoming appointments. Save the sheet as CSV, and book the future ones.

  • Nothing talks to a customer on its own

    A missed call gets one fixed text. A reply is stored and shown to you, and nothing answers it. A model can draft a brief, a caption or a review reply for you to read; it never posts, sends, chats or books. There is no chat widget, and there is not going to be one quietly.

  • No customer accounts

    Deliberate. Customers cancel or move an appointment from a signed link in their own email. Nothing for them to remember, and no password of theirs for us to lose.

  • No gift cards, no distance pricing, no tip after the job

    A mobile job forty minutes away costs what a mobile job next door costs — the travel buffer is time, not money. A tip is offered with the online payment and nowhere else: not on a pay-at-appointment booking, not on a deposit, and not from a button afterwards. Cash handed to your detailer is not something this software sees, records or reports.

  • A prefix change never re-issues a code

    Referral codes and booking references carry a prefix taken from your business name, or a short one of your own from settings. A code already handed out keeps the prefix it was printed with, because re-issuing it would void every card a customer is carrying.

  • No custom code for one client

    Every site runs the same build. That is why a fix ships to all of them the same day, and why “can you add just this one thing for me” is usually a no — unless it is right for everyone, and then everyone gets it.

If something you need is on that list, say so on the call. Some of it is a decision that takes five minutes and some of it is a fortnight of work, and it is much better for both of us if you know which before you pay for anything.

Make it my own

See it with your logo on it

Send your prices, your logo and a few facts about how you work, then pick a time. We build your instance before the call, so it opens on your site — your menu, your colours, your service area — instead of a slide deck. Thirty minutes, with the person who writes the code.

Everything on this page is written down in a specification the code is checked against. Ask for it on the call and you can read the thing yourself.