There is a newer version of this app. Tap here to load it — what you are looking at now is out of date.
TB Enterprises
You have an unfinished work order from .
My Pay
Only your own earnings are visible here — the database enforces that, not this page.
Loading…
Work Orders
All open and recent jobs across every site.
Your scheduled work
The jobs already booked in your name — including every stop on a trip you committed. Open one of these rather than starting a new work order, or the visit ends up recorded twice.
Loading…
Need the office to call a customer?
For anything you can't settle on site — a billing argument, a quote they want, an account question. It lands in the office queue straight away. This doesn't count as having contacted them; office logs that when they actually make the call.
Flags you've raised
Loading…
Your AI assistant use
What the assistant has cost on your own calls. Only yours — the database scopes this to you, not the page.
Loading…
Loading…
New Work Order
Log work from the field. It'll be recorded under your name.
My Truck
What you carry, against what the office says a van should carry. Only yours — the database scopes this to you, not this page.
Stock on board
Need to restock
What you are short of, and what has never been counted. Ordered by what it costs to fill, so the top of the list is the expensive gap.
Loading…
On the truck
Everything you have counted, whether you are short of it or not. This is the inventory — it does not shrink when you have enough.
Receipts
Photograph every business expense, whether or not anyone is paying you
back — that is how the business proves what it spent. The card
statement says what left the account; the receipt says what it was for.
File a receipt
My receipts
Loading…
Waiting for review 0
What the AI read is shown as a suggestion. Check it against the photo
before accepting — the numbers you confirm are the ones that reach
the ledger.
Loading…
Everyone’s receipts
Loading…
Road — plan vs reality 0
The rate card is the plan that proved the model works;
the receipts are that plan in motion. These are the jobs where the two
are a long way apart. Under is the one that costs money
quietly — the road comes off before the 65%, so a receipt
nobody filed pays the tech more, not less.
Loading…
Who owes whom
A denied company-card charge does not un-spend itself — the money
left, so the tech owes it back. Money a tech fronted works the same way
in reverse.
Loading…
Payroll
The three numbers BBSI asks for, per person, for one pay period.
TB does not pay anybody — BBSI does. This is what
gets reported.
Pay period
Open a new period
What to enter
Hours and commission are wages. Reimbursement is not —
BBSI adds its burden to the first two and passes the third through at
par. Keep them in their own boxes: a reimbursement entered as
commission gets taxed, so the tech gets back less than they spent.
Person
Hours
Commission
Reimbursement
Choose a period.
Check their invoice
What TB expects to be billed, so BBSI’s number is checked rather
than paid on trust.
Ledger
Every movement of TB’s own money: the opening balance, expenses,
income, and checks against the bank.
This is an estimate, not a bank balance, and it is not
accounting. Customer payments live on invoices and wages go
through BBSI — putting either in here would count them twice.
Cash position
Loading…
Expected in and out
None of this is in the balance above, on purpose.
Money that has not moved is not cash, and adding it here is how a
balance quietly starts counting the same pound twice.
Loading…
Record a movement
What actually left or arrived in the account. There is no delete
— a mistake is voided and rewritten, so both stay legible.
Check against the bank
Enter what the bank actually says. The difference is posted as its own
entry, so the ledger agrees with the bank and the history
explains why. Typing over the balance is not offered
— the gap is the useful part.
The register
Newest first. Voided rows stay listed — the
running balance skips them, but a correction people can see is worth
more than a tidy list.
Date
What
Type
Amount
Balance after
Loading…
Recurring bills
What TB expects to pay again. These predict cash out
and never move it — nothing posts on a due date, because a date
passing is not evidence that money left the account.
Loading…
Add a recurring bill
FreshBlends
The service tickets FreshBlends send us, and where each one has got to. 500 machines on trial — this queue is how the rest are earned. Internal: nothing here is shown to FreshBlends.
Record a ticket they sent
Their fields, in their order — copy them straight off the email. Only their ticket number is required; the rest can be filled in later, and a second send updates the same ticket rather than raising a new one.
⚠️ The one sentence that is a REQUEST lives in a person's forward, not in the automated block — and it is the line the tech needs.
⚠️ Their email repeats the report block twice, verbatim. Paste it once.
Loading…
Places
Where to stay and eat when you're working away from home — and where not to. Kept by town, not by customer, so anything written here shows up for every job in that town from now on. Internal only: customers never see any of this.
Loading…
Add a place
One entry per hotel or restaurant. Say what you'd tell the next tech driving in.
Map
Every site TB services or has sold into, drawn from the coordinates FreshBlends already holds — nothing here was geocoded, so nothing here costs anything to draw. Pins cluster until you zoom in. Internal only.
Sites with no coordinates
These are in the database but cannot be drawn — FreshBlends never recorded a position for them. Listed rather than dropped, because a map that quietly leaves sites out is worse than one that says which.
Build a Trip
Pick the machines, pin anything that is already promised to a customer, say roughly how long each stop takes — and the portal proposes an order and chains the drives from one account to the next. Nothing is charged until somebody presses Bill.
Trips
Start a trip
Who is driving, from where, and how long a working day is. The day length is not pre-filled on purpose — it decides how many stops fit in a day, and a number nobody chose would be deciding that quietly. Put in whatever day you actually want to work; nothing here caps it.
The stops
Moves the whole run — every stop, including pinned ones. To pull just one stop earlier, pin that stop instead and the trip opens up in front of it.
Installs to fit in
no address yet — on the list so it is not forgotten
What is due
Add a stop
Committing puts the date and the tech on every stop’s work order, and creates one where a stop has none. It does not change a work order’s status and it does not measure or bill anything.
The run
Each leg is measured from where the last one ended. A leg already measured costs nothing to measure again — the answer is cached, because the daily lookup limit cannot be raised.
Travel to bill
A leg bills the job it drives toward, one way, at the rate card’s $95 an hour — and the drive home is billed to the stop the day ended on. TB eats all PM driving, including the drive home when a day ends on one, so PM legs are absent from this list rather than shown at zero.
Troubleshoot
Ask about a machine you are standing in front of. The answer is built from
the service manuals for that machine's product line and from what TB's own techs have
written on that machine before — and it names the document and page, so you can open it and
check.
It will tell you when the manuals do not cover something. That is
the useful answer, not a failure — a confident guess sends somebody to a site for nothing.
Which machine?
Loading…
What is it doing?
What to try
Did that fix it? Saying so is what makes
the next answer better — it is the only way TB learns anything from this.
What you have asked
Your own questions and what came back. Office can see everybody's, and what
each one cost — that is how the AI spend is tracked, per person, and it always was.
Customers
Every customer and prospect, with where they sit in the funnel. The stage is computed live from service agreements, work orders and logged contact — nobody sets it by hand, so it can't drift.
Office queue
connecting…
Customers a tech has asked the office to call. New flags appear here the moment they're raised — no refresh needed.
Loading…
Contact changes to enter in FreshBlends
Site contacts a tech has added or corrected in the field. Nothing here reaches FreshBlends on its own — somebody has to key it in, and then mark it done. The old value is kept beside the new one so you can find the record over there.
Loading…
New sites and machines from the field
Added by a tech standing at the machine. Check the details, set a new customer's agreement on their customer page, and approve. The tech has not waited for you — the work order is already on it.
Loading…
Loading…
Add a prospect
A location with a machine that isn't a customer yet. They start at prospect and move up the moment you log a call or book work.
Billing
Turning finished work into money. Ready to bill is what nobody has invoiced yet; Invoices is everything that has been raised, and where you send it.
Ready to make into a job
Completed work orders that have not been priced into a job yet. Check the figure against the work order before you press — after this, it is what the customer gets billed.
This does not bill anybody. It creates the job and moves it down to Ready to bill, where raising the invoice is a separate press.
Open the work order to change what is on it. Labour lines and parts are edited there and the job just reads them — so anything that needs fixing is fixed before you press, not after.
Loading…
Ready to bill
Finished jobs that have no invoice yet. The amount shown is what the work order actually adds up to — check it before raising anything.
Raising an invoice does not send it. It records a draft in TB with its own number (INV-nnnnn) — nothing is emailed. Office then raises the bill in Square by hand from that number, and records the money here when it comes in (Record a payment on the Invoices card below).
Loading…
Invoices
Every invoice TB has raised. A draft is TB thinking out loud — the customer cannot see it. Pressing Send is the moment it becomes a bill on their screen, dated today and due in 30 days.
To change what somebody is billed, change the work order. The amount here is added up from the parts fitted and the charge lines — it is not typed, and it cannot be typed over. Each row links to the work order behind it.
Loading…
Office
The queues office clears. Everything here is a list that should be getting shorter — nothing on this page is a setting.
Parts to order
Parts a tech has flagged as needed. Techs record what the machine needs; ordering is yours. Nothing here is on the customer's bill until a tech marks it fitted.
Loading…
Waiting for the next visit
Parts a tech recorded as needed but not urgent. Nobody is being asked to buy these — they come back automatically the next time someone opens a work order on that machine. Shown here only so the backlog is countable.
Loading…
PMs due
Machines whose next preventive maintenance is due within 60 days or already past, soonest first. Six months after the last PM unless the customer’s signed agreement says otherwise; a machine already on an open work order is shown with it. Tick the ones you want and put them straight on a trip — an open draft, or a new one. Plan these on Build a Trip goes the other way, to the fuller picker with its own search.
Loading…
Not contacted within 24 hours
Jobs where more than 24 hours passed between us being notified and actually reaching the customer. This is a review list, not a block — the work order was still submitted, and nobody was stopped from doing their job.
Loading…
Missing photos
Work orders filed without a before and an after. The form asks for both — these are the ones that got through anyway.
Loading…
Equipment
What is out there and what is on the vans. "Nobody has looked" is its own answer on this page and never gets folded into "no" — a machine nobody has checked is a machine to go and check, not a machine you know about.
Lid conversion
Machines still on the old three-finger lid. A tech records the lid on a work order and the machine remembers it — nobody has to keep a list. "Not recorded yet" means nobody has reported on that machine, which is not the same as knowing it's old.
Loading…
Self-cleaning machines
Machines fitted with a self-cleaning kit need sanitizer and drain cleaner, which bill at $250 a visit. "Nobody has looked" is its own state and nothing is billed on it — a tech answers it at the machine. The ones flagged below have been billed for a kit in the past, which is worth checking but is not an answer on its own.
Loading…
Who services which machine
Assigning a tech to a machine lets them see the invoices for work done on it — including the amounts, so they can check their own commission. Taking them off removes that straight away.
A tech always sees the bill for a job they personally worked, assigned or not. This is for the machines they look after.
Loading…
Truck stock by tech
Each tech counts their own van on their My Truck tab. This is where you check on them — and, more usefully, see who has not counted in a while. Open a van to put a part on it.
Loading…
People
Who can get in, and where they work from. The two invite cards are deliberately separate — one mints a login inside TB, the other binds an outsider to a single customer, and those are very different things to hand somebody.
I-9s
Whether it is done — not the form itself. No document numbers, no citizenship or immigration status, no social security numbers are stored here or anywhere in TB. The I-9 is completed elsewhere; this records that it happened.
TB collects the I-9 itself — BBSI does payroll and the rest. The signed form stays on paper; this screen is the record that it was done, not the document. Note where the paper lives if that helps at audit time — but never a document number, and never an SSN.
Section 2 is yours and cannot be done here. An I-9 has two halves: the employee's, on or before their first day, and the employer's — within three business days, and it needs a person to physically examine original documents. Marking someone complete means that happened, not that a form was filled in.
Loading…
Invite an employee
Creates a tech login and gives you a one-time link to send them. They set their own password — you will never see it, and neither will Steve. Office logins are still Steve's to make.
Inviting a customer is the card below, deliberately separate. The two mint very different things: this one makes a login inside TB, that one binds an outsider to a single account.
Invites
Who has been invited and what became of it. A link that has gone stale is not a problem — withdraw it and send a new one.
Loading…
Who can sign in
Every TB login. Suspending one stops that person signing in and changes nothing else — their pay still works out, past work orders still say who did them, and their machines stay assigned to them. Somebody leaving is a suspension; taking them off the roster is a separate job.
Loading…
Invite a customer
Creates a customer login bound to one company, and gives you a one-time link to send them. They set their own password — you will never see it. They see their own sites, service history and invoices, and nothing of TB's.
Send a password-reset link
For somebody who already has a login — employee, customer or FreshBlends — and cannot get in: never set a password, forgot it, or their invite link was mangled by their mail program. Makes a one-time link that opens the Choose a new password screen. Tell them to open it in Safari or Chrome, not from inside Outlook.
Invite a FreshBlends contact
Creates a partner login. They see the tickets
FreshBlends have sent TB and where each one has got to — and nothing
of TB's: no tech, no parts, no notes and no bills. They set their own
password and you will never see it.
One person, one login — their own reports name the agent who filed
a ticket and the person who asked for the visit separately, and a shared
account throws that away.
FreshBlends logins
Who at FreshBlends can sign in, and whether they have.
Tickets sent is the answer to "is this login being used" — an
invite nobody took up looks identical to one somebody uses daily until
you count something.
Loading…
Customer invites
Who has been invited at which company, and what became of it. "Has not signed the agreement" is the one worth watching: until somebody at that company signs, everybody there sees the agreement and nothing else.
Loading…
Where each tech is based
A town, not a street address — "Louisville, KY" is precise enough for a drive time and is not somebody's front door. Drive times are measured from here, so a tech with no home base cannot have travel quoted for them at all.
Loading…
Admin
Settings, records and the things you set up once. Nothing here is a daily queue.
AI assistant spend
What the assistant has cost, per person. The number that settles arguments is the average per call — check it before deciding this is worth attributing to anybody.
Loading…
AI limits
The brake. The assistant refuses before calling out, so a runaway loop costs nothing beyond a few database reads. Switching a feature off stops it instantly — no deploy, no waiting for anyone.
Loading…
Nightly backup
Everything in one press — all records, work-order photos and receipt photos — saved to a folder you choose, such as a plugged-in drive. Do this at the end of the day.
This is your copy to keep — spreadsheets and photos you can open
on any computer, for an audit, a dispute, or if the portal ever went
away. It is not the same thing as putting the portal back on its feet
after a bad day; that is what the daily automatic backup on the hosting
side is for. Keeping both is the point.
Download all records
Every table in the portal, as spreadsheet files, in one download. Uses your own login — you get exactly what you can already see, and nothing else. Keep one somewhere that is not the portal — that is the whole point of having it.
Download work-order photos
The actual pictures, filed under the work order they belong to. The table download above records that a photo exists; this one is the photo. Expect it to be large — it is images, not text.
Add a customer
Add a site
Add a machine
Add a customer contact (who to contact, not a login)
This records who to contact at the customer — a name, an email, a phone number. It does not create a login. Customer logins DO exist now (migrations 058 and 062): to give somebody at this company access to the portal, use People → Invite a customer, which mints a login bound to one company and hands you a one-time link. A row here is the address book; that is the door.
Supplier costs change and rates get revised — this is where that happens. It doesn't touch how a price gets calculated for a job (used/branded/agreement math is untouched); it only edits the numbers that calculation reads from. Every parts change is logged automatically.
Edit a part's price
Add a new part
Rate card
Labor, travel, PM visits, and the rest of the 2026 rate card. Edit an amount and save just that row.
Sales commissions
Customer discount & agreement
Whether a customer has a signed twice-yearly agreement (for billing purposes) and their parts discount rate. Marking the agreement as legally signed still happens off this page.
TB Enterprises
Customer portal
Welcome to TB Enterprises
Before your portal opens, choose how you would like TB to look after your machines, and sign the agreement below. This takes a minute and you only do it once.
1. Choose your option
2. The service agreement
3. Sign it
TB records your name, the option you chose, the date and time, and the exact text of the agreement shown on this screen.
My Sites
Every address TB services for you, and the machines at each one.
Loading…
Service History
Every visit and every job on your account. What was wrong, what TB did, and when.
Loading…
Invoices
Invoices appear here once TB has sent them. A draft TB is still working on is not shown, because it is not a bill yet.
Loading…
Request a Service Call
Tell TB what is happening and somebody will be in touch. For a machine that is out of service or a health risk, phone 406-208-0317 — that reaches a person faster than this form.
TB Enterprises
FreshBlends — service requests
Your service requests
Every ticket your team has sent TB Enterprises, and where
each one has got to. Completed ones stay on this list.
Loading…
Need someone at TB to ring you?
For anything that is not a machine to fix — an account question, a quote, something about an invoice, or a ticket you would rather talk through. It reaches TB’s office straight away. Nobody is dispatched and nothing is billed.
Calls you have asked for
Loading…
Send us a service request
These are the fields your Machine Cares Report already
carries, in its order — copy them straight across. Only your ticket
number is required. Sending the same number again updates that ticket
rather than raising a second one.
Put TB on your home screen
Portal manual
Which manual do I need?
Five manuals, one per person. Written 2026-09-05. Print the one that is yours.
You are
Read
You sign in as
A tech — anybody in a van
MANUAL 1 - Tech.md
field
The office
MANUAL 2 - Office.md
office
The owner — Steve
MANUAL 3 - Admin (Steve).md
admin
A customer
MANUAL 4 - Customer.md
customer contact
FreshBlends
MANUAL 5 - FreshBlends.md
partner
Each one is complete on its own. You do not need to read the others, and the manual for your job never tells you to go and look somewhere else.
None of them name a person except the owner's. Hand MANUAL 1 to the next tech on their first morning and it is already right.
The one thing everybody should know
The portal is portal.tbenterprises.co. Same address for everyone. What you see after signing in depends on who you are, and a tab you cannot see is not a tab that is broken.
And the one rule behind all five
If you press something and nothing happens, say so. Say which button and which work order number.
Three separate times in the first week of September the app really had answered and put the answer where the person could not see it. Every one of those was a real defect, and every one was found because somebody said "I pressed it and nothing happened."
That report is useful. It is not a complaint, and it is not you being slow.
The portal, for a tech
For anybody who works out of a van. Written 2026-09-05, revised 2026-09-06. Print it and leave it in the truck.
You sign in as a field login. That means you see: My Pay · Work Orders · New Work Order · My Truck · Receipts · Places · Map · Build a Trip · Troubleshoot.
You do not see Billing, Office, People, Equipment, Admin, Payroll, Customers or FreshBlends. That is on purpose. Those are not your job and nothing is wrong with your login.
⚠️ FreshBlends tickets reach you as work orders. The office reads their ticket and assigns you the job — you never have to watch a second queue. Their ticket number is printed on the work order itself, so if you have to quote it on the phone it is right there in front of you.
THE ONE PAGE VERSION
You want to
Do this
See your jobs
Work Orders
See everything ever done on THIS machine
Work Orders → the find box → type the machine id (e.g. WBT119) — new 2026-09-10
Open one
Tap the row
Finish one
Open it → Mark complete at the top
Kill one that shouldn't exist
Open it → Cancel this work order → say why
Fix a typo / add a part / add a photo
Open it → Correct this work order
Change HOW MANY of a part
Open it → Parts on this order → type the new number → Change
Take a part back OFF
Open it → Parts on this order → Take it off → say why
Take TIME ON SITE back off
Open it → Visits → Take it off → again to confirm
Add the time you LEFT to a visit you already saved
Open it → Visits → Change the times → type the time out → Save the times — new 2026-09-29
Find a part without scrolling
In the part picker, type a couple of letters in the box above it (o-ring, lms, a part number) — new 2026-09-29
The site's address is wrong
Open it → Site contact → Correct this address
Say whether a machine has the black cup cover / a self-cleaning kit
Open the job → Add to this work order → The machine — new 2026-09-19
Raise a brand new job
New Work Order
The site or machine is not in the portal (a new install, a machine nobody added)
New Work Order → under the site list, + Not in the list? Add a new site or machine — new 2026-10-01
Get the office to ring a customer
Work Orders → "Need the office to call a customer?"
Plan a run of stops
Build a Trip
Look up a site, its machines, the gate code
Places
Log a receipt you paid for
Receipts
See what's in your van
My Truck
Check your pay and commission
My Pay
Send a bill
You don't. That's the office.
Read this manual on your phone
Manual button, top right — new 2026-09-07
Put the portal on your phone like an app
Sign-in screen → Put TB on your home screen, or Manual → Add to home screen — new 2026-09-27. On an iPhone, do it in Safari; the new icon asks you to sign in once more the first time
Can't sign in / forgot your password
Ring the office — they text you a one-time reset link. Open it in Safari or Chrome, not from inside your email.
1. A day, start to finish
Morning
Open Work Orders.
Your jobs are listed under Your scheduled work. Anything that says scheduled is waiting for you.
Tap one to open it.
⚠️ Open the job that is already there rather than starting a new one. If a trip put a stop on your list and you raise a second work order for the same visit, the customer can end up billed twice and the drive gets billed to nobody.
At the machine
Correct this work order — this is where you type what you found and what you did, add the parts you fitted, the hours, and the photos.
Parts, hours and photographs are under Add to this work order — scroll down. You do not need to raise a new work order to add them.
Photos come from your camera roll. Take them in the Camera app if you like, then attach.
Before and after are both asked for. The ones filed without them show up on an office list, and somebody has to chase you for them.
Fill in the drive if it asks: out and back, or one way. It asks because the system cannot know, and it will not guess.
Done
Mark complete. Top of the screen, blue button.
⚠️ This is the step that matters most. A work order left on scheduled is invisible to the office. It cannot be priced, it cannot be billed, and nobody gets paid for it. On 2026-09-02 that had already hidden $976.05 of work that had actually been done.
2. "Correct" and "Mark complete" are two different buttons
This is the one that costs people hours, so it gets its own section.
Button
What it does
Correct this work order
Changes what it says. It does not finish it.
Mark complete
Says the work is done. Moves it on to the office.
Correcting does not complete. Completing does not stop you correcting. They sit next to each other at the top of the same screen.
2b. ⚠️ THE TWO MACHINE QUESTIONS — added 2026-09-19
Open any job that has a machine on it → "Add to this work order" → "The machine". Two questions:
Black cup cover on it? — Yes, has one / No, needs one / Not sure. No puts it on the conversion list so a cover gets ordered.
Self-cleaning kit fitted? — Yes, fitted / No, not fitted / Not sure. ⚠️ This one reaches a bill.Yes means sanitizer and drain cleaner apply, and they charge the customer $250 a visit. Only say yes if you have looked.
They save the instant you press one. There is nothing else to submit, and you do not need to press Correct this work order first.
"Not sure" is a real answer, not a blank. Nothing is billed on it, and it is how you undo a wrong tap. Guessing is worse than leaving it — the portal is happy to say nobody has looked.
Why this appeared: these questions used to exist only on the New Work Order form. Every job that came off a trip already had a work order, so there was nowhere to answer them. Now they are on the job itself, wherever you opened it from — even on a job the office has already billed, because it is a fact about the machine, not about the money.
The lid twice, and it is not a mistake.Correct this work order also has a Machine lid box. That one is what this visit saw; the buttons above are what the machine is now. Changing the visit's one also moves the machine's, because the visit is the event.
3. ⚠️ THE NUMBER OF PARTS — added 2026-09-06
Tyler, 2026-09-06:"I only had one in there. I tried to add three more for a total of four it would not let me add LMS valves again. But I could not go back and change the value."
He was right, and it was the portal's fault, not his. Here is how it works now.
A part gets ONE line on a work order. The number lives on that line. That is why adding the same part twice is refused — a bill must not name LMS valve on two separate rows.
To change how many
Open the work order.
Scroll to Parts on this order.
The Qty column is a box you can type in. Type the total you want.
Press Change beside it.
⚠️ Type the TOTAL, not the extra. You had one and you need four — type 4, not 3. The number you type is the number that goes on the bill.
The line total and the parts total are worked out again straight away, so you can see it took.
If you try to add a part that is already there
You will get: "That part is already on this work order… change the quantity on its row."That is the screen telling you where to go, not you having done something wrong. Go down to Parts on this order and change the number.
⚠️ To take a part back OFF — added 2026-09-06
You fitted the wrong one, or you put a line on and then did not use it.
Open the work order and scroll to Parts on this order.
Press Take it off on that row.
It turns into Really take it off? and a box opens on the row. Say why. The database will not take it without a reason.
Press it again.
⚠️ Say what actually happened."removed" is a question somebody has to ring you about. "removed, wrong valve, fitted the LMS instead" is a record. It is kept forever with your name on it.
⚠️ The line is NOT deleted. It stays on the work order, struck through, with your reason on it — and it stops counting towards the bill. If you took the wrong one off, Put it back is sitting on that same row. Putting it back does not erase the removal; both stay on the record.
⚠️ If the work order has already been billed you will get told so, not ignored. The invoice has to be cancelled on the Billing tab first — that is the office's job, so ring them. A bill that changes underneath a customer with nothing saying so is the thing this is built to prevent.
⚠️ Take it off and Change are on the same row and do different things. Change sets how many. Take it off removes the line entirely.
⚠️ To take TIME ON SITE back off — added 2026-09-10
You typed the wrong time, or you logged your hours on the wrong job.
Open the work order and scroll to Visits.
Press Take it off on that row.
It turns into Really take it off?. Press it again.
⚠️ This one really is removed — it is the only thing on that screen that is. A part stays struck through; a visit row goes. What is kept is a line in the internal notes saying which visit went and who took it off, so the record still answers the question.
⚠️ The hours come off what the labour is worked out from. That is the point of it, and it is also why you should be sure. If the time was right and only the JOB was wrong, take it off here and log it on the right work order.
⚠️ On a work order that is already complete or billed you cannot. Complete is the office's; billed is nobody's until the invoice is cancelled. The screen says which it is.
⚠️ To add the time you LEFT — added 2026-09-29
Tyler, 2026-09-29:"you put in the time and date you start you hit save you cannot go back and add the time you leave. You have to create a new line."
He was right, and it was the portal's fault. And the second line cost him: a visit with only a time in, or only a time out, counts as 0 hours. On WO 72, 16:00 on one line and 23:15 on another counted nothing at all.
Open the work order and scroll to Visits.
A visit missing a time says so in red: "No time out — this visit counts 0 hours."
Press Change the times on that row. Two boxes open, with what you saved already in them.
Type the time out. Press Save the times.
⚠️ If you already logged the leave time as a separate line, take THAT line off afterwards (Take it off, twice) — otherwise the day is on the work order twice.
⚠️ Time out has to be after time in. A visit that ran past midnight is two visits: this one up to 23:59, and the rest on the next day. The screen refuses a backwards time rather than saving something that counts 0 hours.
A line goes into the internal notes saying what changed and who changed it — the hours are what the labour is billed from.
⚠️ Finding a part — added 2026-09-29
Tyler:"It's too long of a list to scroll through to pick out an item."
Above the Part list there is now a box. Type a couple of letters — o-ring, pump, lms, or a part number like MAN0000. The list shrinks to what matches and the first one is picked for you; pick another from the shortened list if it is not the one.
Every word you type has to be in the name, so cip pump finds the CIP pump and not every pump.
A different spelling usually still works — our names are not always Square's (whipper / wiper).
Nothing matches? Pick Other / not in catalogue and describe it. The office adds it.
⚠️ A site or machine the portal has never heard of — added 2026-10-01
Tyler, 2026-10-01:"I go into Maps and I don't know how to create something from scratch." You couldn't — only the office could add a site. Now you can, from the work order itself. Not from Maps: Maps only shows what is already there.
New Work Order. Under the Site list, press + Not in the list? Add a new site or machine.
Pick one:
A new site — a new install, or a store that isn't in the list at all. Choose the customer (type a few letters to find them). If the company is new to TB, pick + A new customer at the bottom and type their name (and their phone / billing email if you know them). Then the site name, street, town and two-letter state (GA, SC). A site contact if you have one. Leave There is a machine here ticked and fill in what is on the sticker — Fresh Cloud id, serial, model — or leave them blank if you don't have them yet.
A new machine at the site chosen above — the site is in the list but the machine isn't (Statesboro). Choose the site in the list first, then this, then the machine's id / serial / model.
Save it and use it for this work order. The site and machine are now chosen in the form, and a blank job type becomes Installation. Carry on and fill in the work order as normal — finish it, mark it complete.
It goes to the office for a quick look over. You do not wait for them.
The screen will refuse, and say why, if:
that Fresh Cloud id or serial is already in the portal — it tells you which site it is at. Pick that site instead; if the machine has moved, tell the office (they move it).
the customer name is one TB already has — pick it from the list.
that customer already has a site of that name in that town — it's in the list.
there is no town or state.
You can't set a customer's PM agreement or discount — the office does that when they look it over. Until they do, a brand new customer is on no agreement (full price).
4. If there is no "Mark complete" button
Read the line on the screen. It will say something like:
This one was filed by somebody else and is not assigned to you, so you cannot complete or cancel it. If you did the work, ask the office to put your name on it.
That is not you doing it wrong. Ring the office, they put your name on it, the button appears.
Who can finish a work order:
the person who filed it, or
the tech it is assigned to, or
the office.
(Before 2026-09-05 it was only the person who filed it — which meant nobody in the field could finish a job a trip had created. That is fixed.)
5. Cancelling
Open the work order.
Cancel this work order — tap the words to open it.
Type why. It will not let you past without a reason. One line is enough: "duplicate of WO-00032", "site closed", "customer fixed it themselves".
Press the red button. Check the number in the box matches the job on your screen, then say yes.
Nothing is deleted. It keeps its number and stays on the record with your reason on it. Only the office can un-cancel one, so if you get the wrong one, ring them — it's a phone call, not a disaster.
If it won't let you cancel: the screen will say it has parts, charge lines or logged hours on it. That is real recorded work — take those lines off first (Take it off, section 3), or complete it and let the office decide. Hours count as work too, so a work order with time on site on it will not cancel until that comes off — section 3 has the steps. Charge lines are the office's to remove.
A work order that is already marked complete has no cancel button for you. Only the office can cancel or reopen a finished one — ring them. (A test entry you completed while learning the screen is exactly that: tell the office which number, they cancel it in one press, and it stays on the record as cancelled.)
5b. ⚠️ Finding what has been done before — added 2026-09-10
Standing at a machine and want to know its history? Work Orders tab, the box at the top, type the machine id off the machine — WBT119. Every job ever logged on it comes back, newest first, including the ones from before this portal existed.
The same box also takes:
a site — Dakota Shell — or just the town, Oacoma
a customer — Cenex brings back every job at every one of their sites
a serial number, a store number, or the street
their ticket number or our WO number
a few words of the title or what was written in the job
⚠️ Spelling counts. It matches what is in the system, so Dakota Schell finds nothing and Dakota Shell finds all of it. If a name will not come up, try the town instead — that is usually shorter and harder to get wrong.
⚠️ If nothing comes back it tells you what it looked at. That sentence is worth reading: it is the difference between "we have never been there" and "you typed it differently to whoever set the site up".
6. When the customer needs a phone call, not a repair
On Work Orders, under your job list, there is a card: "Need the office to call a customer?"
Use it for anything you cannot settle standing at the machine — a billing argument, a quote they are asking for, an account question, a manager who wants somebody from the office to ring him.
Pick the customer.
Say what they need to be called about, in a sentence.
Flag for office.
It lands in the office queue immediately — it appears on their screen without them refreshing anything. Your own flags, and what the office did about them, are listed underneath the form.
⚠️ This does not count as having contacted the customer. The office records that when they actually make the call. And it is not a work order — nobody is being dispatched.
7. Building a trip
Build a Trip → name it, pick the first day, set how long a working day is (driving included — see below).
Add stops — search a site, tick it, add.
On each stop set the job type and check the minutes on site.
Propose an order. That works out the days and the route.
Commit it. That creates the work orders and puts them on your list.
Measure the drives — the button is below the stop list, so scroll down.
⚠️ A committed trip's work orders are assigned to you, and you can finish them.
⚠️ Adding a stop to a trip you have already built — added 2026-09-23
Once a trip is committed, Add a stop is still there. Before you tick a machine, three boxes ask:
Which day — any day of the trip, or a new day on the end.
Job and Minutes on site — the minutes follow the job until you type your own. PM too works the same as on a draft.
Tick the machine and press Add the ticked machines. The portal puts it in the best spot on that day (the one that adds the least driving), makes its work order straight away, dated and on your list, and every other stop keeps its date. Nothing gets re-proposed.
If the machine already has one open work order (a call the office took, say), that work order is used and the stop takes its job — a warranty call stays a warranty call even if the box said PM.
Drives Google had already measured that the new stop changes are cleared. Press Measure the drives again. Legs already measured are free to measure again.
⚠️ If the office has already billed the travel for that day, it will say so and refuse. Ask the office. That day's drives are on a bill, and changing them would bill a drive nobody made.
Installs to fit in: no address yet — added 2026-09-23
Know about an install but have no address, no machine and maybe no date? Every trip has a list called Installs to fit in. Type a town, a state and a line like "Town Pump, new machine". Any one of those is enough, and the date is optional. It shows on the trip and on the printed trip sheet, so it isn't forgotten.
It is not a stop and is not on the route. There is nowhere to drive to until the office has set the site up. When it has, press Find it (it searches for you), add it as a stop, then press Done. Done items stay on the list, crossed out, with an Undo.
The machine id and serial of a new install — added 2026-09-23
A machine the office entered before it was installed may have no machine id or serial yet. Open the job → Add to this work order → The machine, and there are boxes for whichever one is missing. Read them off the machine and Save. You can fill in a blank one once. After that only the office can change it, so check the sticker. The boxes only appear on a job you are on.
⚠️ How the days are worked out — changed 2026-09-11
A day is time on site PLUS the driving. Your working day (say 10 hours) has to hold the drive to each stop, the work there, and — if you are going home every night — the drive home. Before 2026-09-11 it only counted the time on site, which is how a plan could put a 15-hour drive and a 6-hour job on one day and look fine.
The driving is an estimate until you press Measure the drives — it is worked out from straight-line distance, no Google, and every estimate on the screen carries a ≈ so you know which numbers are guesses. Once the drives are measured, the real figure replaces it.
What the job types start at: a PM is 6 hours, an install is 6 hours, a service call is 3. (Tyler set those. They are the cautious end; change the box on any stop if you know better — a number you type is yours and the planner keeps it.)
"PM too." Doing an install and the PM while you are there? Tick PM too on that stop. It adds the PM's hours to the estimate (an install + PM is 12 hours), and when the trip is committed the work order is flagged so that marking it complete bills the PM visit as well as the install. The job type stays Installation. The tick is not there on a PM stop, because a PM already bills.
A stop longer than your day (that 12-hour install + PM, or a very long drive) is no longer refused. It gets a day to itself and the day reads over its length — ≈ 14h against a 10h day — so you can see it and decide: split it, make the day longer, or accept it.
The order. On an on the road trip the whole route is worked out from where you start to your home base, so it no longer works you east and then jumps you west to finish — it ends heading home. On a home every night trip each day is its own loop from home. A pinned date always wins over the route.
One stop a day? Every stop was probably left as a PM at 6 hours, and 6 + 6 does not fit a 10-hour day. Set the job types first, then Propose again.
Planning ahead — added 2026-09-23. The What is due box has Due in the next 30 / 60 / 90 days. Each one includes what is already overdue: a machine past due is still due within the next 30 days.
Printing — added 2026-09-11, changed 2026-09-23
Two buttons at the top of an open trip, beside The stops. ⚠️ Since 2026-09-23 the sheet opens on the screen first, with its own Print and Close buttons at the top. The print window is tried straight away. If it does not appear, press Print on the sheet. If the printer is the problem, the sheet is still in front of you to read, share or Save as PDF. Close puts you back where you were. (Before this, a slow phone could show nothing at all, which looked like the button was dead.)
Print this trip — the plan day by day, with each stop's address and phone number (the store's, not head office), the job, the minutes on site and the drive. Drives marked ≈ are estimates until Measure the drives has run. A day marked OVER holds more than your working day — it is on the sheet so you can see it. The sheet says DRAFT until the trip is committed.
Print all sites by state — every site TB has, grouped by state, with customer, address, phone and machine ids. It is read from the portal the moment you press it, so print it when you check out of the hotel and it is current. The same button is on the office's Customers tab.
On a phone, Print offers Save as PDF — that works too.
A sales visit — added 2026-09-11
Stopping by a site to sell, because you are passing through? The job type is Sales visit. It goes on a trip like any other stop (it has a drive and time on site), and it bills the customer nothing — not the drive, not the time. Do not file it as a service call: a service call bills both the moment it is completed. A phone call is still Phone / Remote.
⚠️ "I added stops and they never showed up" — added 2026-09-10
They did. The stop list is at the bottom of that screen, below both the what is due list and the search box — and a stop you have just added has no day yet, so it goes to the bottom of the stop list too. On a phone that is a long way down from the button you pressed.
The page now scrolls you to them and the green message says where they went. They will have no date until you press Propose an order — that is what works out the days and the driving.
⚠️ "I know that machine exists and the search says nothing" — added 2026-09-10
Three different things cause that, and the screen now tells you which:
What it says
What it means
What to do
"N more machines are here and not shown"
The Due or overdue box (or one of the next 30 / 60 / 90 days choices) is filtering them out. A machine that is not due yet can still go on a trip.
Set that box to Everything
"one machine is switched off under that name"
It is in the portal but marked not in service, so it cannot go on a trip
Tell the office — it is one setting
"this portal has never been told about it"
It really is not here
Tell the office and it can be added
⚠️ That last one is not rare. On 2026-09-10 thirty-one machines that FreshBlends shows as live turned out to be missing from this portal entirely — including Miles City, Havre and Lava Hot Springs. They are in now. If you stand at a machine and this portal has never heard of it, say so — that is real and it is worth knowing.
⚠️ A brand new site has no pin on the map yet
A site the office has just added has no position until somebody puts one on it, and a trip cannot be routed through a site with no position. The row says so. The office does it on the Map tab in about ten seconds.
8. The site: its address, and who to ask for
Places is the lookup: every site, its machines, its address, what is known about getting in.
You can fix both of these from the work order you are standing in. Open it and scroll to Site contact.
The person, their phone, their email
If a site contact's name, phone or email is wrong, correct it there. It saves, and it shows back to you under "Site contact given by the tech".
If nobody is on file for this site yet, there is a button that says exactly that: Add a contact for this site. Use it — a site with nobody on it is the reason the next man rings the wrong number.
⚠️ The address the BILL goes to is not yours to change — added 2026-09-10. Near the top of that same panel it says where bills for this site go. You can read it; only the office can move it, because it is money. If it is wrong, ring them with the right address. The person to ask for at the site is a different thing and that one IS yours.
⚠️ The address — added 2026-09-06
The work order now shows the site's street address near the top, under the site's name. If what it says is not where you are standing:
Site contact → Correct this address.
Fix the street, the second line, the town, the postcode.
Save the address.
⚠️ The STATE is locked, and the screen says why. The state sets the pay rate for work done at that site. If a site is in the wrong state that is a real problem — tell the office, do not work around it.
⚠️ The map pin does not move. Drive times are measured from the pin, not from the typed address, so your travel is still measured the same way until the office re-checks the pin. The screen says this too. It is not a failed save.
⚠️ None of it reaches FreshBlends
Nothing in this portal writes to their system. What your correction actually does is put that site on an office list of changes somebody has to retype over there by hand. That is the design — so make the correction, and know it is a hand-off, not a sync. If you corrected something last week and it is still waiting, the panel says so, so you do not correct it twice.
9. Things that trip people up
"I pressed it and nothing happened." Say so, and say which button and which work order number. Three separate times in the first week of September the app really had answered and put the answer where the person could not see it. Every one of those was a real defect, found because somebody said that. The report is useful. It is not a complaint and it is not you being slow.
⚠️ "It gave me a load of computer gibberish." Also worth reporting, and also not you. On 2026-09-06 the New Work Order screen was printing a page of the programmer's own notes above the photo boxes, and a refused part came back as duplicate key value violates unique constraint .... Both were real defects, both were fixed the same day, and both were found because Tyler sent a photograph of his screen. A photo of the screen is the single most useful thing you can send.
Print — every work order and every customer has a Print button now, for the office filing cabinet.
Deferred parts come back on their own. A part you record as needed but not urgent reappears next time somebody opens a work order on that machine. You do not have to keep a list.
You cannot see Billing or Square. Correct. Not yours.
The portal, for the office
Written 2026-09-05, revised the same day when Square came out of the portal, and again 2026-09-06. Print this.
You sign in as an office login. You see everything a tech sees, plus: Payroll · Ledger · FreshBlends · Customers · Office · Billing · Equipment · People · Admin.
The one thing you do not get is the pricing page — setting what a thing costs everywhere is the owner's. You can price one work order all you like.
THE ONE PAGE VERSION
You want to
Go to
See what's finished and needs billing
Billing
Turn a finished job into a bill
Billing → Bill this
Send that bill to the customer
Billing → Send to — then raise it in Square yourself
Record money that has come in
Billing → the invoice → Record a payment
Fix what a customer is being charged
Open the work order and change it
See who a tech has asked you to ring
Customers → Office queue
Enter a site contact into FreshBlends
Customers → contact changes queue
Enter a corrected ADDRESS into FreshBlends
Customers → address changes queue — new 2026-09-06
Give a customer their access back
People → customer invites → Reactivate
Somebody cannot get in — never set a password, forgot it, or their link died
People → Send a password-reset link — new 2026-09-07
Stop somebody signing in / let them back
People → Who can sign in
See which machines are due a PM
Office → PMs due — new 2026-09-07
Find every job on a machine, site, town or customer
Work Orders → the find box — type the machine id, site, town or company. New 2026-09-10
Put the due PMs on a trip
Office → PMs due — tick the ones you want, pick the trip, Add the ticked machines. New 2026-09-19
Cancel a completed test / duplicate work order
Open it → Cancel this work order (under the Reopen box) → say why — office only, new 2026-09-10
Take time on site off a work order
Open it → Visits → Take it off → again — new 2026-09-10
Change where a site's bill goes
Open the work order → Site contact → Bill this site to — office only
Read this manual on screen
Manual button, top right — new 2026-09-07
Change how many of a part is on a job
Open the work order → Parts on this order → type the number → Change
Take a part back off a job
Open the work order → Parts on this order → Take it off → say why
Give a PM customer the 10% on a part
Open the work order → Parts on this order → PM 10% off — new 2026-09-29
Make a PM customer's service call free
Open the work order → Services and charges → PM customer — no charge for this call — new 2026-09-29
Add a prospect, log a call, work the funnel
Customers — see §4
Answer a FreshBlends ticket
FreshBlends ⚠️ techs cannot see this tab — you assign the work
Chase missing photos / open work
Office
Pay people
Payroll
Money in and out
Ledger
1. Getting a job billed — the whole path, once
⚠️ This changed on 2026-09-05 and the old version of this manual is wrong. The portal used to create and publish the invoice inside Square for you, with a Create it in Square button and a Publish it button. Both are gone. TB raises the bill in Square by hand now. If somebody hands you a printed manual with those buttons in it, it is out of date — this is the current path.
The tech presses "Mark complete"
│
▼
BILLING TAB ── you press "Bill this" → it becomes a job
│
▼
"Raise the invoice" → a DRAFT here. Nobody sees it.
│ You can still "Re-add it up".
▼
"Send to <them>" → ⚠️ THIS puts it on the
│ customer's own screen, and
│ gives it a number: INV-00001
▼
YOU, IN SQUARE → key that same invoice in.
│ ⚠️ Square emails them and
│ takes the money. Not us.
▼
"Record a payment" → once the money is in, back
here, so their screen stops
saying they owe it.
⚠️ Nothing in this portal talks to Square any more. Not a button, not a background job, nothing. The two systems are kept level by you. That is the whole cost of the change, and it is one press per bill at each end.
⚠️ Write the TB number on the Square invoice.Send to gives every bill a number of its own — INV-00001, then INV-00002, the same shape as WO-00036. It is the only thing that ties our record to Square's. Without it, the two systems have nothing in common but an amount and a date.
Before you press Send, check three things
Is there an email address? You cannot bill somebody you cannot reach, and Square will need one when you key it in. The card says so plainly when there isn't. Fix it on the customer record.
⚠️ Is this a duplicate? Between 3 and 5 September the field could not complete trip-built work orders, so new ones were raised instead:
WO-00024 ↔︎ WO-00032 — Lake IN THE Hills Shell (GM32)
WO-00025 ↔︎ WO-00033 — Delta Sonic, 1940 Oswego IL (DEL1)
Check both of a pair before billing either. Retire the dead one with the cancel button on the work order, and say why.
Is the drive answered? On a service call, if nobody has said whether the tech drove home, the travel is not on the bill. There is a list of those.
2. "To change what somebody is billed, change the work order"
The figure on Billing is added up from the work order — parts fitted, charge lines, hours in the visit log, the drive, the PM charge. It cannot be typed over.
That is deliberate: a total that disagrees with the work order behind it is a total nobody can explain to a customer on the phone.
Wrong figure? Open the work order, fix what it's made of, then press "Re-add it up".
⚠️ A PM done during an install (or a service call) — new 2026-09-11
A work order has one job type. When the tech also did the PM while he was there, the work order carries a tick — "A PM was done on this visit too" — and marking it complete bills the PM visit exactly as a PM work order would: the customer's PM price (twice-yearly $800, annual or no agreement $1,050), one line, once. The install itself bills whatever an install bills; the PM line sits beside it.
Where the tick comes from: the tech ticks PM too on the stop when he builds the trip, or ticks it on the work order itself under Correct this work order. The work order's title reads Installation + PM when it came from a trip, and the PM panel on the work order says what completing it will bill before anybody presses the button.
If the PM should not be billed on that visit, untick it under Correct this work order before it is completed — or, after, take the line off under Services and charges the way you would any other line. (Steve, 2026-09-11: "we need a pm bill item so he can add it onto that.")
⚠️ Changing how many of a part — new 2026-09-06
A part gets ONE line on a work order, and the number lives on that line. Adding the same part twice is refused, because a bill must not name the same part on two rows.
Open the work order → Parts on this order → the Qty column is a box → type the total you want → Change. The line total and the parts total are worked out again from it.
⚠️ It sets, it does not add. One on the line and four needed means typing 4.
⚠️ It is refused once the job is billed, the same as Correct this work order — void the invoice first. That is so a bill cannot be quietly re-priced from a table cell after the customer has it.
⚠️ The PM 10% on a part — new 2026-09-29
The 10% comes off by itself when BOTH are true: the part is a FreshBlends part, and the customer is on the twice-yearly agreement. Annual customers pay full price on parts (Steve, 2026-08-22).
⚠️ It is worked out when the part goes on the work order. On WO 72 the Sanitizer and Drain Cleaner went on at 4:38 pm and Hanks signed the PM agreement at 5:09 pm — so both went on at full price. That is what PM 10% off is for:
Open the work order → Parts on this order.
Press PM 10% off on that row. The price drops, and the row says PM 10% off. The customer's bill shows the lower price.
Wrong one? Undo PM 10% puts back exactly what was there.
It is refused — and says why — on a used part (half price already), a part FreshBlends covered, a line taken off, a line that already has the 10% (two 10%s would be 19%), and a line with a price somebody set by hand. Not on a billed work order: cancel the invoice first.
⚠️ The free PM service call — new 2026-09-29
The twice-yearly agreement includes one service call at no charge for labour or travel. Tyler: "I like the fact that it shows how much it would have cost … Shows the customer how much money they saved."
Open the work order → Services and charges. The labour and travel lines stay exactly as they are.
Press PM customer — no charge for this call → Yes, no charge.
One line goes on underneath: "Not charged — PM customer. This service call is included in your agreement — you saved $1,545.00", minus the same amount. The customer sees that line on their bill and on the printed sheet. Parts are still billed.
⚠️ If the hours change after you press it, the panel says the no-charge line no longer matches. Remove that line and press the button again — it does not re-size itself behind your back.
⚠️ Check the customer really is on a PM agreement (the customer's page). On 2026-09-29 only two customers in the portal were: Hanks Lexington and Collettsville General Store. A PM customer the portal thinks has no agreement also misses the automatic 10% on parts.
⚠️ Taking a part back off — new 2026-09-06
On the same row: Take it off. It arms — Really take it off? — and a box opens for the reason, which is required. Techs have it too, on any work order they can still correct.
What it does to the money. The line stops counting: the parts total, the invoice the customer reads, the office's total, the commission pool, the parts to order, the deferred queue, and what a FreshBlends arrangement is worth all drop it, together, off one shared test. ⚠️ Nine places read that table and all nine agree — there is no version of this where the bill says one thing and somebody's commission says another.
What it does NOT do. It does not delete the row. The line stays on the work order, struck through, with who took it off and why, and Put it back in place of its Change. Putting it back does not erase the removal — both stay on the record, which is what you want when a customer rings and asks why the figure moved.
⚠️ A removed line is NOT "a part not fitted." It has its own footer line on the bill screen. The not fitted bucket means a part is still waiting to be installed and somebody may be chasing an order for it — opposite news. If you see it in the wrong bucket, that is a bug and worth ringing about.
⚠️ It is refused once the job is billed — the screen says so and names the way out: cancel the invoice on the Billing tab first. The cancelled invoice stays on the record, which a silent change to the bill would not.
⚠️ There is no Delete anywhere, and there is no longer even the permission for one. The database's delete grant on part lines had existed since the beginning and nothing had ever used it; it was taken away with this. Nothing is destroyed, and that includes being destroyed from view.
3. Cancelling, reopening, and what is yours alone
Who
Cancel a work order with nothing on it
tech or office, reason required
Cancel a completed one with nothing on it
office only, reason required — open it, Cancel this work order is under the Reopen box. One press; no need to reopen first
Cancel a completed one with parts, charges or hours on it
nobody — it is the record of that work. If the lines are wrong, Reopen it, take the lines off, then cancel
Cancel one that has been made into a job
nobody — the screen names the job. Cancel the job first (and void the invoice before that, if one went out)
Take time on site off a work order
whoever may still correct it — Visits → Take it off, twice. New 2026-09-10
Reopen a completed one
office only, reason required
Put a cancelled one back
office only
Anything once it is billed or made into a job
nobody — void the invoice / cancel the job first
Nothing is ever deleted. A cancelled work order keeps its number and carries the reason. A voided invoice stays on the record as voided.
Cleaning up test and duplicate work orders (Tyler, 2026-09-10): open each one, type the reason ("test entry", "duplicate of WO-00032"), press the red button. Open ones: anybody who could complete it. Completed ones: office, from the same screen. They drop off the open lists and stay findable as cancelled — that is the clean-up; there is no delete and there will not be one.
If it refuses, it says which of three things is in the way, and each has a way through: hours — Visits → Take it off (new, and it is what stopped WO-00039); parts — Parts on this order → Take it off, with a reason; charge lines — Remove, on the services table, office only. Once the order carries nothing, the cancel button is there. A work order that has become a job is the fourth case and there is no way through it from this screen: cancel the job, and void the invoice first if one has gone out.
Where a site's bill goes is office-only. A tech can read the address on the work order and cannot change it — the screen tells him to ring you. So "the email is wrong on that job" usually means: change it on the customer or the site, from the work order's Site contact panel.
Putting the PMs that are due on a trip — new 2026-09-19. Office tab → PMs due → tick the machines you want. A bar appears: Put them on, a list of the trips that are still drafts, and Add the ticked machines. Pick one and press it, and they go on as PM stops with no day yet — open the trip and press Propose an order and the route places them. The message says which trip they went on and gives you a button straight to it.
Choosing — a new trip — instead takes you to Build a Trip with those machines already picked; say whose trip it is and which day it starts, press Create the draft, and they go on as its stops.
Only trips that are still drafts are offered here. To add to a trip that has already been committed, open it on Build a Trip. Since 2026-09-23 it has Add a stop with a Which day box. The machine goes into the best spot that day, its work order is made and assigned to the trip's tech at once, and every other stop keeps its date.
⚠️ Once you have billed a day's travel, that day takes no more stops. The portal refuses and names the stop, because a new stop changes the drives already on the bill. Put the extra machine on another day or a new trip.
Installs to fit in (new 2026-09-23). Every trip has a short list where a tech can note an install with no address yet: a town, a state and a name. It is not a stop and is not routed. It is his reminder, and it prints on the trip sheet. When he says he has one, you set up the customer and the site (and pin it on the Map), and he adds it as a real stop. A machine you enter before it is installed can be left without its machine id and serial. The tech on that job can fill each one in once, while it is blank. After that, changing it is yours, on the Admin tab as for any machine.
Plan these on Build a Trip still does what it always did — it takes you to the fuller picker on Build a Trip, which has its own search and can show machines that are not on the due list.
4. The CRM — the Customers tab, end to end
This is the whole customer side of the business on one page: who they are, where they sit in the funnel, who owes them a phone call, and every conversation anybody has had with them.
4.1 What the four stages mean, and why there is no dropdown
Stage
What puts them there
Prospect
A location with a machine that isn't a customer yet. Where everyone starts.
Contacted
Somebody logged a call, visit or email against them.
One-time
They have had work done — a completed work order — but no agreement.
On contract
They have a signed service agreement.
⚠️ Nobody sets the stage by hand, and there is deliberately no dropdown for it. It is worked out live from the service agreement, the work orders and the contact you have logged. That is so it cannot drift — the usual way a CRM rots is somebody forgetting to move a card, and there is nothing here to forget.
So: to move a prospect to "contacted", log the call. That is the only lever, and it is the one that leaves a record.
Inactive is not a fifth stage. It is a drawer — a retired account. It shows last, and only when there is something in it, so the funnel still reads as a funnel. A retired account is not a prospect.
4.2 The two queues at the top of the page
Office queue — "who has asked you to call."Two kinds of row land here, and they read differently on purpose.
A tech raises one from their Work Orders tab when they can't settle something at the machine: a billing argument, a quote, an account question. The card is headed with the customer's name and carries an Open customer button.
FreshBlends raise one from their own tickets page (new 2026-09-05). The card is headed "FreshBlends — " and has no Open customer button, because a partner is not one of TB's customers. ⚠️ They are asking TB to ring THEM, not asking about a payer.
Both appear the moment they are raised — you do not need to refresh. Each says who asked and why. Clear it by making the call and closing the flag with a note about what happened.
⚠️ A FreshBlends call request is not a service ticket. Nobody is dispatched and nothing is billed. If the call turns out to be about a machine, raise the work order separately.
⚠️ A flag is not a work order. Nobody has been dispatched. If the call turns into work, raise the work order separately.
Contact changes to enter in FreshBlends. Site contacts a tech has added or corrected in the field. The old value is kept beside the new one so you can find the record on the FreshBlends side.
⚠️ Nothing in this portal writes to FreshBlends. Somebody has to key each of these in over there by hand and then mark it done here. The tech has done half the job by design; this card is the other half.
⚠️ Address changes to enter in FreshBlends — new 2026-09-06. The same idea, for the site's street address. A tech standing at a site can now correct the street, the second line, the town and the postcode from the work order in his hand. Each row carries what it used to say beside what it says now — you need the old value to find the record over there.
Two things on those rows are worth knowing:
⚠️ The state is never changed by a tech, and there is no way for him to. It sets the minimum wage for work done at that site, so it is yours alone. If a row makes you think a site is in the wrong state, that is a real problem — raise it with Steve rather than editing around it.
⚠️ The map pin does not move with the address. Travel is measured from the pin, so a corrected address means the pin and the address may no longer agree. Rows that need it say check the pin. Until somebody does, drive times keep measuring from the old spot — which is deliberate, because clearing the pin would stop that site's travel being billable at all.
4.3 The funnel counts and the list
Under the queues: tiles with a count per stage, then the list itself.
The chips filter by stage. The search box filters by name.
Tick rows and you get Copy emails and Email selected at the bottom — that is how you mail a stage, e.g. every prospect.
The Total tile counts active customers and prospects, not everything ever created — the retired ones are not a number you want in a funnel.
4.4 Opening a customer
Tap a row. You get, in this order:
Print this customer — the internal sheet. See §7.
Billing email, phone, service agreement, lead source at a glance.
Where this company's bills go — the billing email, editable here. ⚠️ You cannot bill somebody you cannot reach, and 123 of 292 active customers had none when this was last counted on 2026-09-05. A site can override it when one person pays for one location — open the site to set that.
Account ownership — who it is assigned to, and the lead source.
Contacts — the people to ring. ⚠️ Adding a contact does not give them a login; inviting a customer is a separate thing on the People side.
Sites — their locations and machines.
Log a contact — see below.
History — everything ever logged, newest first, with who logged it.
4.5 Logging a contact, and the four audiences
Type (call / visit / email / note / other), when, who can see it, and what happened in a sentence or two.
⚠️ "Who can see this" is the field to slow down on. It defaults to Office only, which is the safe answer.
Audience
Who actually reads it
Customer-visible
The customer themselves, in their own portal, and every employee. Write only what you would say to their face.
All staff
Every employee, techs included. Site knowledge — gate codes, which door, who to ask for.
Logging a call is what moves a prospect to "contacted". It is also the only record that the call happened, so log it even when nothing came of it.
4.6 Adding a prospect
Bottom of the page. Name is the only thing required; email, phone, lead source and who it is assigned to are all optional and can be filled in later.
They start at prospect and move up on their own the moment you log a call or work gets booked.
⚠️ FreshBlends tickets do not create customers, and that is deliberate. Their customer field is free text off an automated report — "Delta Sonic", "DELTA SONIC 1940" and "Delta Sonic Car Wash" are one payer and three strings. A ticket can build the site out of the address they sent; naming the customer is always a person's decision, made here.
4a. ⚠️ ACCESS — giving it back, and taking it away (new 2026-09-06)
Both of these live on the People tab.
A customer who was withdrawn — Reactivate
Under customer invites, a withdrawn row now has a Reactivate button. Press it, type why, and their access is back.
⚠️ The withdrawal is not erased. Both stories stay on the row — when it was withdrawn and why, and when it was given back and why. The row is marked as having been round the loop.
⚠️ Reactivating does not email them and does not send a new invitation. Their old password still works. If they never set one, reactivating alone will not let them in — use Send a password-reset link (below).
Anybody who cannot get in — Send a password-reset link (new 2026-09-07)
For somebody who already has a login — employee, customer or FreshBlends — and cannot sign in: they never set a password, they forgot it, or their invite link was mangled by their mail program (Outlook and Hotmail rewrite links and can drop the part that opens the password screen — that is exactly what happened to the first customer we invited).
People → Send a password-reset link. Type the email their login uses. Press Create the reset link.
Copy the link and send it to them — by text, to keep it away from their mail program. ⚠️ But not as a bare link in iMessage (blue bubbles). iMessage opens a link itself to draw the little preview card, and that uses the link up before the person ever taps it. It happened to Sean Larkin at FreshBlends on 2026-10-01: his invite was opened 30 seconds after it was made — by the preview, not by him. If they tap it and see "link is invalid or has expired", nothing is broken: make another reset link here and send it again (a login can have as many reset links as it needs).
Tell them one thing: "Open it in Safari or Chrome, not from inside your email." It opens Choose a new password. After that it is portal.tbenterprises.co, their email, their password.
⚠️ One use, and it expires. You will not see it again — if it goes stale, make another. ⚠️ Do not send a second invitation to somebody who already has a login; the portal refuses it on purpose and tells you to use this instead. Nobody at TB ever sees or sets anybody's password, before or after.
An employee — Who can sign in
Every TB login is listed, with whether it can sign in and, if not, when it was suspended and why.
Suspend this login — stops that person signing in. Reason required.
Let them back in — undoes it. Reason required.
⚠️ This is the LOGIN and nothing else. Their pay still works out, past work orders still say who did them, and their machines stay assigned to them. Taking somebody off the roster is a separate job. Somebody leaving on a Friday is a suspension.
⚠️ You cannot suspend your own login, and the admin login can never be suspended — it is the key that lets everybody else back in. The screen says so rather than offering a button that would fail.
⚠️ Restoring does not clear the suspension. The record of it stays, with the reason somebody typed.
4b. Printing the site list — new 2026-09-11
Customers tab → Print the site list by state. Every active site, grouped by state, with customer, address, the site's phone, machine ids and the agreement tier — read live at the moment you press it. Tyler keeps this on paper for the road; the same button is on Build a Trip so he can print it himself. A site switched off in the portal is not on it.
Since 2026-09-23 every print opens on the screen first, with Print and Close at the top. This applies to work orders, customer records, the trip sheet and this list. The print window is tried at once. If it doesn't appear, press Print on the sheet. If the printer is misbehaving, the sheet stays up to read or Save as PDF.
5. The lists to check weekly
Office → PMs due (new 2026-09-07) — machines whose next PM is due within 60 days or already past, soonest first. Six months after the last PM unless the customer's signed agreement says otherwise — the line under each one says which. Tick the ones you want and put them straight on a trip — an open draft, or a new one (new 2026-09-19); Plan these on Build a Trip goes the other way, to the fuller picker. A machine already on an open work order says so instead of nagging.
Billing — finished work not yet billed.
Unbilled travel — service calls whose drive hasn't reached a bill, and which of them are only waiting on somebody saying how the tech drove.
FreshBlends — tickets from FreshBlends nobody has answered.
Customers — the office queue (calls owed) and contact changes (retyping owed).
⚠️ On 2026-09-02, $976.05 of labour that had been worked was sitting unbilled and nothing anywhere said so. It was found by chance. These lists exist so the next one isn't.
⚠️ Sites with no pin on the map — new 2026-09-10
Map tab, at the bottom: every site with no position. A trip cannot be routed through a site with no position, so a tech will be stopped by it rather than by anything he can fix himself.
Each row has a Look it up on Google Maps link. Open it, copy the coordinates out of the URL or the place card, paste them in the box, Save. About ten seconds each.
There are 49 of them as of 2026-09-10, and 31 are the machines added that night (below).
⚠️ New sites and machines from the field — new 2026-10-01
Customers tab, under the contact changes: New sites and machines from the field. Since 2026-10-01 a tech can add a site, a new customer, or a machine himself from the work order (Tyler: "I don't know how to create something from scratch"; Steve: "techs should be able to add a site; then maybe it goes to office for a quick lookover approval").
The tech has not waited for you. His work order is already on the site. This list is for you to check it, not to let him in.
For each one:
Check the details — customer, site name, address, store #, contact, the machine's id / serial. A typo is fixed on the customer's page as usual.
A "new customer" badge means he typed a company name in. If it is really one TB already has, change Belongs to to the right customer before you approve — the site moves to it and the duplicate he typed is switched off (not deleted). If it really is new, set their agreement (twice-yearly / annual / none) on their customer page — until you do they pay full price.
Looks right — approve. It drops off the list.
A known site with a new machine on it (no "new site" badge) only lists the new machine. Belongs to is not offered there: moving an established site to another customer moves its whole history, and that is a Customers-tab edit made on purpose.
Also add the new machine in Fresh Cloud / FreshBlends if it is not there — nothing here reaches them on its own.
⚠️ When a tech says the portal has never heard of a machine — new 2026-09-10
Believe him and check it. On 2026-09-10, thirty-one machines FreshBlends shows as live were missing from this portal entirely — Miles City MT, Havre MT, Lava Hot Springs ID, Rolla ND and twenty-seven more. Tyler found it by trying to plan a trip to them. They were added the same night, with their sites and customers.
The portal was first loaded from a FreshBlends export in August, and nothing keeps the two in step — every new install since is invisible here until somebody says so. Two more (ESO4, WBT102) still cannot be added because Fresh Cloud has no address for them at all.
Two machines sitting at the same address with nearly the same name are normal — Sterling CO has LEFT SIDE UNIT and RIGHT SIDE MACHINE at one store. They are two machines and two stops.
6. Recording the money when it comes in
Open the invoice on Billing and press Record a payment. Four things:
Amount
Defaults to what is still outstanding.
Arrived
⚠️ The day the money arrived, not today. A cheque banked on Monday that is dated Friday is a Friday payment — that is the date the customer will quote at you.
How
Check / bank transfer / card / other.
Reference
Cheque number, Square receipt. Optional, and worth it.
Part payments are fine. Record what came in; the invoice goes to Part paid and shows what is still outstanding. Record the rest when it arrives.
⚠️ It refuses an overpayment rather than guessing. More than is owed is a typo, a double payment, or a tip — three different answers, and the system will not pick one for you. It names both figures and stops. If somebody really has overpaid, tell Steve — what TB does with the difference is his call.
It also refuses a date in the future, and refuses money against a draft — a draft is a bill the customer has never seen, so money against one means either it was never sent or you are on the wrong invoice.
Getting one wrong
Press Undo on the payment and say why. The row stays on the record, struck through, carrying your reason — nothing here is ever deleted. The invoice goes back to where it was.
⚠️ Recording a payment here does not tell Square anything, and pressing it does not charge anybody or email anybody. It is TB's own books catching up with money Square already has.
7. Printing for the filing cabinet
Every work order and every customer has a Print button. It prints a proper sheet — site, machine, parts, visit log, charges, two signature lines — not a photo of the screen.
⚠️ The customer sheet is internal: it carries the notes and the logged interactions, office-only ones included. It says so at the bottom. Don't hand it to a customer.
The portal, for the owner
Steve. Written 2026-09-05, revised 2026-09-06.
You sign in as admin. You see everything the office sees, plus the pricing page — the one control that is yours alone.
The split is deliberate: office prices one job, the owner sets what a thing costs everywhere.
1. THE THINGS ONLY YOU CAN DO
Where
Set the rate card — what a service costs everywhere
Admin → pricing
Invite people — employees, customers, FreshBlends
People / Customers / FreshBlends
Secrets and keys
Supabase dashboard, not the portal
Push code
Terminal
Move a site into another STATE
Admin / customer setup — ⚠️ it sets the minimum wage, so it is yours alone
⚠️ Claude does not create accounts or set passwords, and does not touch the Supabase secret key or the Postgres password. Those are yours by design, not by accident.
2. Inviting somebody — and the trap you already hit
One email address = one login, forever. Supabase allows a single auth user per address. So:
If you@example.com is already an employee, that same address cannot also become a customer — the invite has nothing left to create.
Withdrawing an invite does not free the address. It sets the login inactive, which is right — nothing is destroyed — but the auth user remains.
Somebody with a login who cannot get in gets a RESET, not a second invite (new 2026-09-07): People → Send a password-reset link. It mints a one-time link through the same office gate as an invite; office texts it. Built the night Emily Voss's first invite died inside Hotmail's link rewriting — she had a login and no password, and a second invite is refused by design. ⚠️ A link pasted into iMessage dies the same way (2026-10-01): iMessage opens it to draw its preview card, which uses the one-time link up. Sean Larkin's FreshBlends invite went 30 seconds after it was made. A used-up link is fixed by another reset link, never a second invite.
⚠️ Do not link one login to both an employee and a customer record. The customer views are built on the assumption those are different people. An account that is both behaves fine until it doesn't.
The fix costs nothing: use a plus-address.
you+customer@gmail.com — Gmail delivers it to your normal inbox, Supabase sees a separate user. Nothing to delete, nothing to link.
To see the customer portal as a customer would
Make sure the test customer has something to look at — a completed work order or two, ideally with a bill. An empty Service History looks like a broken screen.
Customers → the test customer → invite you+customer@gmail.com.
Open the link, set a password, and you are looking at exactly what they see. (Done 2026-09-07: TEST — Steve's Test Site, machine TEST1, three history visits, login stevynth+customer@gmail.com. It stays; deactivate the customer when you are finished with it.)
The manuals are inside the portal now (2026-09-07)
Every header has a Manual (employees) or Help (customers, FreshBlends) button that opens the manual for that role, rendered in the page. The source is Portal Build/manuals/*.md; the PDFs in the Organized folder are exports. To change a manual: edit the .md, run python3 tools/embed_manuals.py, run the suite, push — everybody has the new words on their next load.
3. Square is not wired to the portal, and that is on purpose
Decided 2026-09-05. Your words: "lets drop the whole square thing we can manually upload to square and saves a headache."
Nothing in this portal talks to Square. No token, no button, no background job. All four Square secrets are deleted from Supabase — only ANTHROPIC_API_KEY and GOOGLE_MAPS_API_KEY are left. On 2026-09-07 the last of it went too: the square and square-webhook Edge Functions were deleted from the dashboard and migration 110 dropped the seven database functions they used to call. Your words that day: "we dropped square those functions should be gone." Three Edge Functions remain: ai, invite, travel.
What that means in practice
The portal
prices the work, raises the bill, gives it a number, shows the customer what they owe
Square
emails the invoice and takes the money
A person
carries the bill from one to the other, and the payment back
Office keys the invoice into Square using the TB number — INV-00001 onward, from invoice_number_seq, the same shape as WO-00036. That number is the only thing tying the two records together.
⚠️ The one thing the decision would have broken, and what was done about it
invoices.amount_paid moved in exactly one place: a service-role function fed by a Square webhook. Take the webhook away and every invoice TB ever sends sits at sent for ever — the customer's own portal goes on showing a bill they paid in March, and the cash position counts money already banked as still owed.
Migration 102 is that fix: a payment is a row office records by hand, and amount_paid, the status, the method and the paid date are all derived from those rows. Mistakes are voided with a reason, never deleted. Migration 103 is the numbering, because Square used to supply that too and nothing did after it left.
Dropping Square without those two would not have left the system smaller. It would have left it wrong.
If you ever want it back
It would be a rebuild, not a switch. The Edge Function source is in git history (the commit before f12331e, 2026-09-07) and the database functions are in migrations 063, 066 and 069 — but they were dropped from production by 110, the secrets are gone, and the app has no buttons for it. The diagnosis notes are in MIGRATIONS.md and the 2026-09-05 session notes, including how to read a 401 and which two credentials on Square's page get pasted into the token field by mistake. What stays: the square_* columns on old invoices (history) and the Square invoice # field on a work order, which is the manual flow.
4. The CRM, from the owner's chair
The Customers tab is the customer side of the business on one page. The office lives in it day to day; these are the parts that are yours.
The funnel cannot drift, because nobody types it
Four stages — prospect → contacted → one-time → on contract — and there is no dropdown for any of them. Each is worked out live:
contacted = somebody logged a call, a visit or an email
one-time = they have a completed work order
on contract = they have a signed service agreement
So the funnel counts on that page are not somebody's opinion of the pipeline; they are the pipeline. The way to move a prospect is to log the call.Inactive is a retired-account drawer, not a fifth stage, and it is kept out of the funnel counts on purpose.
The four things worth your attention there
⚠️ Customers with no billing email. You cannot bill somebody you cannot reach, and Square needs an address when office keys the invoice in. It was 123 of 292 active customers when last counted on 2026-09-05, and every one of those is a bill that cannot be sent.
Assignment and lead source — on each customer, under Account ownership. This is where "who owns this account" and "where did they come from" actually live.
The office queue — customers a tech has asked the office to ring. It is the one place a field problem that is not a repair goes, and it should be getting shorter.
Sales-only notes. When you log a contact you choose who can read it, and the four choices are not decorative: Customer-visible means the customer reads it in their own portal. Sales only and Office only are admin logins. The default is Office only.
Two things it deliberately does not do
A FreshBlends ticket never creates a customer. Their customer field is free text off an automated report — one payer arrives as three different strings. A ticket can build the site from the address they sent; naming the customer stays a person's decision, because getting it wrong splits one company's billing across duplicate rows silently.
Nothing here writes to FreshBlends. A tech correcting a site contact puts it on an office list to be retyped over there by hand.
5. What you should look at monthly
Ledger — money in, money out, the cash position.
Payroll — hours, commission, reimbursements.
Pricing — the rate card, and whether it still matches reality.
⚠️ Customers with no billing email — see §4.
6. How work reaches production, and the rule that protects it
Claude writes the migration and the tests, and runs the suites.
Claude loads it into the Supabase SQL editor and hashes the buffer against the repo file before pressing Run. Nothing goes to production that hasn't matched byte for byte.
Claude runs a VERIFY sheet against production and reports PASS/FAIL.
You push, in Terminal, from a copy-paste block.
⚠️ If a hash ever doesn't match, that is the system working. The answer is never to loosen the check or retry blind.
6a. ⚠️ ACCESS, AND THE ONE LOGIN THAT CANNOT BE LOCKED OUT (2026-09-06)
People → Who can sign in lists every TB login. Office and admin can suspend one and give it back, with a reason both ways.
⚠️ Your admin login can never be suspended, by anybody, including you. It is the key that lets everybody else back in, and the rule is about the ROLE — so it holds however many admins there are. Your words, 2026-09-06: "the admin is the only one we dont need to lockout."
⚠️ Nobody can suspend their own login either. It takes effect on the next request, so the person who made the mistake would be the one who could not undo it.
⚠️ Suspending is the LOGIN and nothing else. Pay, past work orders and machine assignments all stand. Offboarding a person is a separate act and is not built. If somebody leaves for good, suspend the login today and tell me what else you want to happen.
Before 2026-09-06 none of this existed. The only thing in the database that could stop a login was inside the invite-withdrawal, which refuses an invite somebody has already taken up — so a tech who had actually signed in could not be cut off by anybody, from anywhere in the portal.
6b. ⚠️ TWO THINGS A TECH STILL CANNOT TOUCH, AND WHY (2026-09-06)
Techs can now correct a site's address from the work order in their hand. Two columns on that record were deliberately kept away from them, because both are money:
Why
The state
It sets the minimum wage and SUTA for work done at that site. The correction function has no state parameter at all — not a check that could be relaxed later, but nothing to pass.
The map pin
Travel is billed from the pin, not from the typed address. A corrected address leaves the pin where it was and puts check the pin on the office queue. Clearing it would have been "honest" and would have stopped that site's travel being billable until somebody re-placed it.
Your calls, both of them, on 2026-09-06.
6c. ⚠️ A PART CAN COME OFF A WORK ORDER NOW — AND NOTHING IS DELETED (2026-09-06)
Tyler could not change a quantity; fixing that raised the bigger half — a line put on by mistake had no way off at all short of a phone call to you.
Take it off is on every part row a tech can still correct, armed, with a required reason. What matters for your money:
Nine places read part lines. Five are money and one of those feeds the commission pool. They now share one expression, written once, so eight agreeing and a ninth drifting is not something a future edit can cause.
It is a mark, not a delete. The row stays, struck through, with who and why, and Put it back on it. The removal survives the put-back.
The delete permission is gone.delete on work_order_parts had been granted since 003 and nothing ever used it — exactly how a future screen destroys something without anybody deciding to. Revoked.
Billed work orders refuse it, and say to cancel the invoice first, because the cancelled invoice stays on the record and a quiet re-price does not.
7. What is open right now — read from the live system, 2026-09-05 evening
Everything below is waiting on a person. None of it is waiting on software.
Customers who can sign in
0 — nobody outside TB has seen any of it
FreshBlends contacts who have set a password
0 of 1 invited
Imported visits sitting on customer screens nobody can open
167, across 43 customers
Invoices that can take a payment
0 — one draft, not yet sent
Active customers with no billing email
123 of 292
Work orders missing a before/after photo
23
Drives nobody has billed
14
Callback requests still open
5
The four presses that would change the most, in order
⚠️ Invite one customer. 43 customers have history sitting there and the number of people who can see it is zero. This is the highest-value press in the system.
Office sends the one draft invoice, then keys it into Square. Until that happens the whole billing path has never carried real money.
Office fills in billing emails — 123 of them.
Name the five missing machines — ZT3, ZT5, CEN33, GM87, ZINK12 — and the 13 visits still sitting out go in.
Also open
The duplicate work orders — WO-00024/32 and WO-00025/33, before billing.
Six drive answers — WO-00006, WO-00016, WO-00026, WO-00028, WO-00033, WO-00036. Until somebody says one-way or out-and-back, the drive is not on the bill and the system will not guess.
stock parts.xlsx — three versions, and it decides what a part costs.
Closed since the morning of 2026-09-05
✅ The Square token — no longer a blocker, because Square is no longer wired in. Secrets deleted.
✅ The FreshBlends call button — they can ask TB to ring them without raising a fake service ticket (migration 101).
✅ Recording payments by hand (102) and TB's own invoice numbers (103).
Your TB Enterprises portal
A short guide for our customers.
This is where you can see every visit we have made to your machines, what we found, what we did, and what you have been billed. Nothing here can be changed by you, and nothing you do here can cost you money.
Getting in
We send you an invitation link, usually by text. The link works once, and open it in Safari or Chrome, not from inside your email — on a device you will keep using.
Set a password.
After that: portal.tbenterprises.co, your email, your password.
Forgotten it, or never got as far as setting one? Ring the office on 406-208-0317. We will text you a one-time link that opens Choose a new password — open it in Safari or Chrome, not from inside your email (some mail programs break the link). Nobody at TB ever sees your password.
Want it on your phone like an app? On the sign-in screen tap Put TB on your home screen — or, once you are in, Help → Add to home screen — and follow the steps it shows. On an Android phone it is usually one tap. On an iPhone it is three taps in Safari, and the first time you open the new icon it asks you to sign in once more. After that, open the portal from the icon.
What you will see
Service history
Every visit we have made, newest first. Each one shows:
the site and the machine
what the job was, and when it was raised
where it has got to — booked in, in progress, or finished
your FreshBlends ticket number, if the job came from one of their tickets
the invoice number, once there is one
Some older visits are marked as coming from our records — those are jobs we did before this system existed, brought across from our own files so your history is complete. They were invoiced and paid at the time and are shown for reference only.
Your bills
Each invoice shows its number, what it is for, what it comes to, and whether it has been paid.
⚠️ You do not pay here, and there is nothing on this screen to press. The invoice itself reaches you by email from Square, and that email is where the pay link is. This portal is your record of the bill — what it was for, what it came to, and whether we have marked it paid.
We never handle your card or bank details, and neither does this portal. Square does, and only Square.
⚠️ We mark a bill paid by hand once the money reaches us, so there may be a short gap between you paying and this screen catching up. If it still says unpaid a day or two after you paid, ring us — that is us being slow, not you.
Your sites
The addresses we hold for you, and the machines at each one. If any of it is wrong, tell us — a wrong address is the usual reason a bill doesn't arrive.
What you will NOT see, and why
You will not see our costs, our travel, our internal notes, or anything about any other customer. The system is built so that it cannot show you those, not merely that it chooses not to.
Common questions
"A visit is missing." If our tech has been but hasn't finished writing it up, it won't be here yet. Give it a day, then ring us.
"My history looks short." We show your most recent visits. If you need older ones, ring the office and we will pull them up.
"I paid it but it still says unpaid." We mark payments by hand. Give it a day; if it hasn't changed, ring us and we will sort it. Your payment is not at risk — Square has it either way.
"The invoice is wrong." Ring us. We would rather fix a bill than have you pay one you disagree with. Every figure is added up from the work order behind it, so we can tell you exactly where each line came from.
"Can somebody else at my company have a login?" Yes. Tell us who and we will send them one.
TB Enterprises · 406-208-0317
The TB Enterprises portal, for FreshBlends
A short guide for the FreshBlends service team.
This is where you raise a service ticket with TB Enterprises and watch what happens to it — through your own ticket number, not ours.
Getting in
TB sends you an invitation link. The link works once — open it in Safari or Chrome, not from inside your email.
Set a password.
After that: portal.tbenterprises.co, your email, your password. The Help button at the top opens this guide.
Forgot the password, or never set one? Ask TB (406-208-0317) for a reset link — a one-time link that opens Choose a new password. Nobody at TB sees your password.
Each person gets their own login. Ask TB for one rather than sharing.
Want it on your phone like an app? On the sign-in screen tap Put TB on your home screen — or, once you are in, Help → Add to home screen — and follow the steps it shows. On an Android phone it is usually one tap. On an iPhone it is three taps in Safari, and the first time you open the new icon it asks you to sign in once more. After that, open the portal from the icon.
Raising a ticket
Send us a ticket
Fill in:
Field
What we need
Your ticket number
⚠️ The most important field. It is how you find this again.
The site
name, address, store number if you have one
The machine
the Fresh Cloud machine ID if you know it
What is wrong
in your own words — as much as you have
Who raised it
name, phone, email
Priority
how quickly you need somebody
Send.
Sending the same ticket number again updates that ticket rather than raising a second one, so a follow-up is safe.
⚠️ If your escalation carries two numbers — the ticket you are writing from and the original it was raised against — give us both. Searching for one of them will find the job either way. Getting only one recorded is how a ticket looks lost when it isn't.
If you need a phone call rather than a machine fixed
Use the "Ask TB to call" box on your tickets page. It is under your ticket list, and it does not raise a service ticket — it lands straight in TB's office calls-needed queue, which is a different list, cleared by somebody picking up a phone.
Say what you would like TB to call about, in a sentence.
Ask TB to call.
Nobody is dispatched and nothing is billed. Use it for an account question, a quote, something about an invoice, or a ticket you would rather talk through than type.
You can see what you have asked for, right underneath — Waiting on TB, TB called you, or You withdrew this. Never mind withdraws one, and the request stays on the record rather than disappearing.
⚠️ If it is urgent, ring us as well — 406-208-0317. A queue is still a queue.
(Before 2026-09-05 there was no such button and the only way to ask was to write it into the free text of a service ticket, where it sat looking exactly like a broken machine. If you have an old ticket sitting there that was really a request for a call, say so and TB will move it.)
Watching what happens
Your tickets shows everything you have sent us and where each one has got to:
It says
It means
New
With TB. Nobody has picked it up yet.
Accepted
TB has taken it on and it is becoming a job.
Scheduled
A tech and a date are on it.
In progress
Somebody is working on it.
Completed
Done. What was found and what was fixed are on the record.
Declined
⚠️ TB is not taking this one, and the reason is on it. Read the reason.
Completed tickets stay on the list. Nothing disappears once it is done.
Declined is an answer, not silence. It means somebody looked and decided — if you disagree, ring us; we would rather argue about it than have you wait.
What TB can see, and what they cannot
They see the ticket you raised and the work that came from it. They do not see anything else in your systems, and you do not see anything about TB's other customers.
Two things worth knowing
Nothing here writes into FreshBlends. If a TB tech corrects a site contact at the machine, it lands on a list for TB's office to key into FreshBlends by hand. So there is a gap between us knowing and it appearing your end. If something looks out of date at your end, that is usually why — tell us.
Contact details on a ticket are the person who raised it. That is often somebody at a desk rather than who a tech should ask for at the store. If there is a better person on site, say so in the ticket — it saves a phone call from a car park.
TB Enterprises · 406-208-0317
The portal manuals
Six manuals, one per role. Copied here 2026-09-05, revised the evening of the same day. Print the one that is yours.
⚠️ If you are holding a printed copy from earlier on 2026-09-05, throw it away. Square came out of the portal that afternoon and the billing pages in MANUAL 2 and MANUAL 3 changed with it — the old ones describe two buttons (Create it in Square, Publish it) that no longer exist.
The portal is portal.tbenterprises.co — same address for everyone. What you see after signing in depends on who you are, and a tab you cannot see is not a tab that is broken.
You are
Read
A tech, in the van
MANUAL 1 - Tech.md
The office
MANUAL 2 - Office.md
The owner — the pricing page, the keys, the pushes
MANUAL 3 - Admin (Steve).md
A customer — hand this out
MANUAL 4 - Customer.md
FreshBlends — hand this out
MANUAL 5 - FreshBlends.md
MANUAL 0 just says which of the others is yours. Each one is complete on its own and never tells you to go and read another.
None of them name a person except the owner's, so MANUAL 1 can be handed to the next tech on their first morning without editing.
If you hold an admin login as well as a field one, MANUAL 3 is yours too — say so and it will be rewritten generically the way MANUAL 1 was.
What is different from ../Portal Walkthroughs/
Walkthroughs are five numbered how-tos for single tasks — add a customer, file a work order, flag a part, count your van, invite somebody. They are short and they assume you already know your way around.
These manuals are the whole job for one person, start to finish, including the parts that are deliberately not yours. Read the manual once; keep the walkthroughs for the task in front of you.
⚠️ What changed in the first week of September, and why it matters
Three separate times the app answered and put the answer where the person could not see it. Every one was a real defect, and every one was found because somebody said "I pressed it and nothing happened."
A tech could not complete a work order a trip had created. The rule said "the person who filed it", and the trip builder files under its own login. Twelve work orders, no button, no explanation. Fixed — the tech a job is assigned to can now finish it, whoever filed it.
There was no cancel button anywhere, for anybody, ever. Fixed — with a reason required, and nothing is ever deleted.
Nothing said WHY a button was missing. Now the screen tells you.
Also new: Print on every work order and every customer, and 167 visits from the old spreadsheets (2024–2026, 73 machines) are now on the customers' own screens as service history.
And the biggest change of the week, made on the afternoon of 2026-09-05:Square is no longer wired to the portal. TB raises the bill here, gives it a number of its own (INV-00001 onward), sends it to the customer's screen, and then office keys it into Square by hand; Square emails the customer and takes the money; office comes back and presses Record a payment. Two systems, kept level by a person, one press each way. Steve's call, and it removes a whole class of thing that could go wrong quietly.
If you press something and nothing happens, say so — and say which button and which work order number. That report is useful. It is not a complaint and it is not you being slow.
⚠️ Two things are waiting on a person, not on the software
Two pairs of duplicate work orders, raised while the complete button was broken. Check both of a pair before billing either, then cancel the dead one with a reason:
WO-00024 ↔︎ WO-00032 — Lake IN THE Hills Shell (GM32)
WO-00025 ↔︎ WO-00033 — Delta Sonic, 1940 Oswego IL (DEL1)
Six work orders need one answer each: one way, or out and back? Read from the live system on 2026-09-05 — WO-00006, WO-00016, WO-00026, WO-00028, WO-00033, WO-00036. Until somebody says, the drive is not on the bill. The system will not guess. (An earlier draft of this note said "WO-00035 and seven others". That came from a count taken before the imported history was filtered off the list; the six above are what the system actually says today.)
⚠️ Five machines are serviced but not in the portal
Thirteen visits from the old spreadsheets could not be imported because these machine ids are not in the system:
Machine
Visits sitting out
ZT3
8
ZT5
2
CEN33
1
GM87
1
ZINK12
1
They were serviced, so they exist somewhere — either they were never on the Fresh Cloud master list, or they are filed under a different id. Name the customer and site for each and those 13 visits go in. Nothing was guessed.
Everything else that is open, read from the live system 2026-09-05
Finished work waiting to be made into a job
0 ✅
FreshBlends tickets nobody has answered
0 ✅
Invoices raised but never sent
1
Work orders still open (not completed or cancelled)
14
Real work orders missing a before/after photo
23
⚠️ Active customers with NO billing email
123 of 292 — none of them can be billed
The 123 is the biggest number on this page. Each one is a customer TB cannot bill until somebody types an email address on their record — office needs one to raise the invoice in Square. It is fixed one customer at a time on Customers → open the customer → Where this company's bills go.
⚠️ Nobody outside TB can sign in yet
Read from the live system on the evening of 2026-09-05:
Customers invited
0
Customer contacts who can sign in
0
FreshBlends contacts invited / with a password
1 / 0
167 visits are sitting on 43 customers' screens and not one of those customers has a login. Everything in these manuals is built and tested; the part that is missing is people being let in. Inviting one customer is the single highest-value press in the system right now.