You catch off-book oil changes by turning bay camera footage into a list of visits (car in, hood up, hood down, car out) and matching each visit to a POS ticket by time window and plate or VIN. Any worked visit with no ticket goes on an unmatched list. Clear the legit no-charge visits first, save a snapshot of what's left, and let someone outside the store make the final call.
The rest of this post is how to run it without accusing a good tech over a warranty re-check.
Quick answer
- What to compare: every bay visit the cameras saw against every ticket the POS closed, by bay and time.
- How to match: time window first, then plate or VIN where you capture it.
- What to expect: most unmatched visits are top-offs, comebacks, courtesy checks and employee cars. Sort those first.
- Who decides: a reviewer outside the store, looking at a snapshot or short clip. Never the store manager alone.
Why the POS alone can't catch this
Your POS only knows about the cars someone rang up. If a car comes in after close, gets an oil change, and cash changes hands, the POS has no record of it. Every report looks clean.
Bulk oil variance will eventually show the missing quarts (our bulk oil variance guide covers the math). But variance tells you how much oil went missing, not which car took it.
The cameras over your bays already see every car. They just aren't counting.
Some camera vendors publish about "shadow work" in quick lubes, and the idea holds up. What's usually missing is the dull middle part: how you match, what you throw out, and who signs off.
Where the camera layer fits
In our conversations with quick lube operators, one question comes up early: "Do I have to change my POS?"
No. The camera layer sits on top of the POS and audits what the POS can't see. It doesn't take payments, write tickets or schedule appointments, and it shouldn't try to.
The POS stays your record of what was sold. The cameras become your record of what happened in the bay. The audit is the gap between the two.
Step by step: matching bay visits to POS tickets
1. Build a visit timeline for every bay
Log four events per car:
| Event | What it tells you |
|---|---|
| Car in | Visit starts. Timestamp, and the plate if the camera can read it |
| Hood up | Work has started |
| Hood down | Work is done |
| Car out | Visit ends |
A car in and out with no hood up is usually a reposition. Tag it and move on.
2. Pull the day's tickets
Export closed tickets with open time, close time, bay (if your POS records it), plate or VIN, services and total. Include $0 tickets and voids.
3. Match on a time window
For each visit, look for a ticket on the same bay that opened near car in and closed near car out. If advisors open tickets in the lane before the car pulls in, widen the front of the window. After a week you'll know what normal looks like and can tighten it.
4. Confirm with plate or VIN where you have it
Time alone can mismatch when two bays run side by side. If a camera reads plates or your POS captures VIN, use it as the tiebreaker. Where you have neither, bay plus time still works. Just treat those matches as weaker.
5. Build the unmatched lists
You end up with two lists:
- Visits with no ticket. A car was worked on and nothing was rung up.
- Tickets with no visit. Something was rung up and no car was seen. That can be a camera gap, a ticket on the wrong bay, or a ticket for work that never happened.
Run each item through the table below, then the false positive sort.
Decision table: what a camera vs ticket gap means
| Gap | What it likely means | What to check | Who signs off |
|---|---|---|---|
| Hood up, no ticket | Unbilled service, or no-charge work with no $0 ticket | Plate history for a recent paid visit; comeback and warranty log | Outside reviewer |
| Visit before open or after close | Employee car, a favour, or an off-book job | Staff schedule, employee plate list, who had keys | Outside reviewer, then owner |
| Ticket with no visit | Camera blind spot, wrong bay, or a ticket for work not done | Camera coverage for that bay and time; ticket's bay field | Ops manager |
| $0 ticket with a long visit | Comeback or warranty re-check, or a discount hiding a sale | The original paid ticket it refers to | Outside reviewer |
| Visits match, quarts per car climbing | Over-pouring or wrong product mapping, not off-book work | Bulk oil variance by oil type | Store manager, with ops |
| Ticket voided, car still worked on | Sale rung up, then voided after payment | Void reason, who voided, clip of the car leaving | Outside reviewer |
Sort the false positives first
If you send every unmatched visit to a store manager as a "problem," you'll lose the team's trust within a week. Most gaps have a plain reason.
Clear these before anyone calls a visit off-book:
- Warranty re-checks. A customer comes back to check a drain plug or filter from last week. Look for a paid ticket on the same plate.
- Top-offs. Plenty of shops top off fluids free between services. Short visit, hood up, no oil change.
- Comebacks. A leak, or a light came on. It should tie to an earlier ticket on the same plate.
- Courtesy checks. Tire pressure, a bulb, a quick look under the hood for a regular.
- Employee vehicles. Keep a list of staff plates. Your policy decides whether they need a ticket.
Most of these go away with one rule: every no-charge visit gets a $0 ticket with a reason code. Once that sticks, the unmatched list shrinks to the few visits that need a real look.
Keep evidence, then hand it off
For anything left, save a snapshot or a short clip: the car in the bay with the hood up, and the car leaving. Note the bay, the times and the plate. Nobody needs an hour of footage.
Then send it to a reviewer outside the store. That can be an independent auditor, your controller, or an ops person from another location. The store manager should get the chance to explain, but shouldn't close the case. They may have approved the favour.
My rule: nobody gets pulled aside over an unmatched visit until the outside reviewer has seen the clip and the explanation. It protects good techs, and the findings hold up if you ever have to act.
Metrics to watch alongside the match
The match finds single cars. These three numbers show patterns by store and shift. (More on store scorecards in our quick lube KPIs guide.)
- Time to first hood. Minutes from car in to hood up. Long times point to a lane or staffing problem, and long gaps can hide a job being set up off the ticket.
- Bay hours variance. First car in versus posted open, last car out versus posted close. A bay opening late or closing early loses sales. A bay busy outside posted hours needs a reason.
- Revenue per bay-minute. Ticket revenue divided by minutes with a car in the bay. If bay-minutes go up and revenue doesn't, something isn't getting billed.
Worked example (made-up numbers, not real store data)
One store, one Saturday, two bays. Every number is an example to show the math.
| Line | Example value |
|---|---|
| Bay visits with hood up (cameras) | 64 |
| Closed tickets, including $0 (POS) | 60 |
| Visits with no matching ticket | 4 |
| Cleared in the sort (2 top-offs, 1 comeback tied to last week's ticket) | 3 |
| Left for outside review | 1 (car in at 7:38 p.m., posted close 7:00 p.m.) |
| Bay-minutes with a car in | 1,280 |
| Ticket revenue | $5,120 |
| Revenue per bay-minute ($5,120 ÷ 1,280) | $4.00 |
The after-close visit goes to the outside reviewer with two snapshots. The three cleared visits become a coaching note: write the $0 ticket. If this store's revenue per bay-minute sits well under your other stores on similar car counts, that's the next thing to dig into.
Where to start
Pick one store and give it two weeks. First check the cameras: can you see the hood in every bay? If not, fix the angle before anything else.
Run the match daily and review the unmatched list weekly with your outside reviewer. Week one will be long, mostly missing $0 tickets. It gets shorter once the store knows the rule.
This is what we build at Trilix. Our camera analytics run on the cameras most stores already have, log visits per bay and match them to your POS tickets. Flagged visits and the three metrics above roll into an executive dashboard, so you see every store on one screen and only open a clip when something needs a decision. More on how this fits a lube operation on our quick lube page.
Want to see which bay visits never made it to a ticket?
We'll look at your camera coverage and POS export and show you what a daily match would flag.
