Sign in with your admin account.
No password set yet for this account. We'll email you a code to verify it's you, then you can set a password.
Sent to . Expires in 10 minutes.
Set a password for next time. This is optional. Google sign-in and the emailed code both keep working without one.
Counted from each address's Current Service Labels. An address with no label is not counted as a customer.
| Service | Addresses | Share | |
|---|---|---|---|
| Loading… | |||
⚠ QuickBooks is connected to its sandbox environment. The figures below are test data, not real invoices.
From QuickBooks' own Aged Receivables report.
| Age | Amount |
|---|
Oldest due date first, up to 50 shown.
| Invoice # | Customer | Due date | Balance |
|---|
How many customers this service has, and how many of them take each add-on. The share is of this service's own customers, so it reads as a conversion rate.
Closes one service's season. Scan is read-only. Completing rewrites labels and needs the season typed to confirm.
Bought this service this season, on a won deal with at least one of its line items: label stays, flagged Ready for Renewal. Did not: this one label moves to past, no renewal. Nothing else on the address is touched.
Every completion is recorded with what it changed. Undo puts that whole run back.
Scan is read-only. Create queues real deals and needs confirmation.
Pick one or more products, then create a deal (one line item per product, priced by its Pricing Rule) for a group of addresses. Leave the group as "flagged for custom offer" to use the addresses tagged on this service, or pick a HubSpot list to run a promotion.
Scan is read-only. Renewals are tracked on the address itself; offers are tracked here, because a promo run must never mark anyone renewed.
Not announced yet. Enrol these in the workflow in HubSpot, then mark them sent so the next scan skips them.
| Address |
|---|
Already announced.
| Address | Marked sent |
|---|
One workflow does every batch send. Swapping the email here rewrites that workflow's send step in HubSpot, so the workflow itself never has to be re-picked.
Edits the real Product record's price. Every future deal reads this directly.
| SKU | Product | Price (CAD) |
|---|
Write the terms once and link to them from everywhere. Each document says what it is for, and the eProposal or the website asks for that job rather than for a document name, so renaming or replacing one never breaks what points at it. The addresses are shown under the editor. Published documents are live the moment you save; a draft is only visible here.
| Document | Address | Status | Updated | |
|---|---|---|---|---|
| Loading… | ||||
Plain paragraphs are fine. HTML tags are kept, so pasted formatting survives — anything that could run code (scripts, event handlers, embedded frames) is stripped on save.
Address to use everywhere
This address asks for whichever document is doing this job, so it keeps working if you rename this one or replace it with a new version.
Paste this into a website page or an eProposal block:
This exact document, whatever its job:
Not configured yet. No properties or SKUs are set up for this service in the admin console.
Addresses with this phase still pending, from each deal's service breakdown (not the deal's own status, since a deal can have more than one phase pending at once). Nothing here writes to HubSpot until you mark a job complete.
| # | Address | Zone | Deal | |
|---|---|---|---|---|
| Pick a phase and load jobs. | ||||
Every active route for one date, with the stops in the order the crew drives them. Roll a day forward to copy it onto the next working day, then adjust — finished jobs are left behind, everything else carries over.
A route is the named run a crew drives, the thing the paper schedule called "WEED CONTROL - 1". Name is all that's required; the rest are defaults a day board can override.
A crew is a standing group: "Lawn Cutting 1", "IRR Crew 3". Routes point at one. This is the default membership, not a rule — the day board can swap people for a single date without you editing the crew, because the history says the core holds and the edges move constantly.
| Crew | Description | Members | |
|---|---|---|---|
| Loading… | |||
The shop, the yard, anywhere a truck starts or ends its day. These are routing endpoints, never stops, so they never appear on a crew's job list or in the stop count. Coordinates are required, since routing is the only thing they're used for.
| Name | Address | Coordinates | |
|---|---|---|---|
| Loading… | |||
| Name | Category | Crew | Truck | Trailer | Start | |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Off means no template mails a customer, whatever its own setting says. Completions still record, services still close in HubSpot, and the mail still renders — it goes to the office queue instead. Nothing is lost while this is off, so turning it on later needs nothing replayed.
On completion, each part a crew recorded becomes a line item with its quantity, and the time on the job becomes a labour line in hours. Every line carries HST 13, which QuickBooks requires. Time rounds up to the increment, since a short callback still costs a trip. Turning this on needs a labour product — without one the hours would be silently dropped while the parts went through.
One template per outcome. The active templates for a service are exactly the outcome buttons a crew sees, so writing the "nobody answered" mail is what puts that button on their screen. Personalise with , {{deal.dealname}}, , , or . Anything after the dot is a raw HubSpot property name, so a new property works here the day it exists. A token that resolves to nothing renders empty rather than leaking braces into a customer's inbox.
"Finishes the work" closes the service in HubSpot when a crew picks this outcome. Leave it off for anything that needs another visit, like nobody answering the door, or the job gets billed and never revisited. "Send automatically" mails the customer as soon as the crew reports it; off routes it to the office queue for a person to read first.
Mail a crew's report generated that is waiting for a person. Each row shows the message exactly as it would go out, and why it stopped here. Sending is a real send.
| Name | Outcome | Sends to | Auto | |
|---|---|---|---|---|
| Loading… | ||||
Name is the only thing required. A work email is what the portal signs them in with, so leave it blank for anyone who doesn't need the app.
Decides which training, toolbox items and forms they are shown. They can also set it themselves in the app; whatever is saved here wins.
What this role can do is set on the Access manager tab.
Location-tracking rules differ between the two, so the record has to say which it is.
If something happens on site. This is the only part of the record that leaves the console in an emergency, so keep it to what an ambulance crew or a supervisor at the roadside actually needs. It is never sent to anyone else's phone — the employee can see and edit their own contact in the app, and nobody can see anybody else's.
Office only — the employee cannot edit this from the app, and it is never shown to anyone else. Keep it to the minimum that could matter.
Optional. Everyone signs in with Google, or an emailed code if their work address is not a Google account. Set a password only for someone those two do not suit — it works on its own, with no code behind it. Remove it and they are back to the other two.
—
| Name | Role | Department | Crew | Reports to | Portal login | Time clock | |
|---|---|---|---|---|---|---|---|
| Loading… | |||||||
What each portal role is allowed to do. Everyone always sees their own day, their own timesheet and their own HR forms, and those need no permission, so they are not listed.
| Permission |
|---|
| Loading… |
Documents, training videos and toolbox talks all land on the crew's HR tab. Anything marked for sign-off stays on their list until they confirm it.
Paste whatever the browser gave you. YouTube and Vimeo links are converted to an embed automatically; anything else plays as a file.
Used to decide how long the app makes them sit with it before the sign-off unlocks.
Tick none to show it to everybody. That is the right answer for most policies.
—
| Title | Type | Version | Signed off | Live | |
|---|---|---|---|---|---|
| Loading… | |||||
—
| Name | Department | Crew | Signed off |
|---|
The 360 walk-around check and the incident report are built in and cannot be deleted, only switched off. Anything else here is yours to add and change.
| Form | Fields | Photo | Live | |
|---|---|---|---|---|
| Loading… | ||||
Fields are shown to the crew in this order. A "heading" is a divider with no answer.
Tick none to offer it to everybody.
| Label | Key | Type | Req | Options / shown when |
|---|
—
| When | Form | Who | Summary | |
|---|---|---|---|---|
| Loading… | ||||
—
—
The allowed areas are the sites below — the ones ticked "clock in allowed" and given a pin. Clocking IN outside them is refused; clocking OUT is always allowed and recorded as off site, because refusing it would mean working unpaid or walking back to a car park to stop the clock.
Leave that last one on. A denied or broken GPS is not evidence of anything, and blocking on it strands whoever is least able to fix it at 5am — the punch is recorded as unverified instead.
Added to each site's radius. A phone in a truck cab reads 50–100 m out on a bad morning.
A place the company works at repeatedly. The pin and radius are only used to record how far from it somebody was when they signed in — being outside it is noted, never refused.
Both or neither. Right-click a spot in Google Maps and the first menu item is the pair.
Click the map to place it, or drag the pin. The circle is the radius above. Other sites are shown faintly so overlaps are obvious.
Someone without one is warned and it is recorded against their sign-in.
An HR or toolbox item they have to have signed off before they sign in here.
Off by default and worth leaving off in most places: a hard gate on a bad night does not produce a compliant crew, it produces one that does not sign in at all, and then nobody knows who is there. Turn it on where an expired ticket genuinely is not survivable.
—
| Name | Where | Requires | In use | |
|---|---|---|---|---|
| Loading… | ||||
Newest first. A row is written when somebody signs in, not when they sign out — the ones who never signed out are exactly the ones worth seeing.
| Who | Site | In | Out | On site | Notes |
|---|---|---|---|---|---|
| Loading… | |||||
—
| Who | Ticket | Status | Expires | |
|---|---|---|---|---|
| Loading… | ||||
Enter the issue date and the expiry is worked out from how long that type is valid. Type an expiry yourself and it wins — some tickets are reissued with a date of their own.
Leave blank for a ticket that does not expire.
A link, not an upload — the file belongs in HubSpot Files or Drive, not in this console's key-value store.
—
| Name | Department | Tickets |
|---|---|---|
| Loading… | ||
How long each one is valid, how much notice you want, and which departments must hold it. A type marked required for a department shows as missing on anyone in it who has not got one.
| Ticket | Valid for | Warn | Required for | Live | |
|---|---|---|---|---|---|
| Loading… | |||||
0 for a ticket that never expires.
Tick none if it is useful to record but not demanded of anybody.
One pay period at a time. A correction never edits a punch — it adds a signed row saying what the clock read, what it should read, and why.
—
| Name | Department | Crew | Days | Break | Paid | Approved | |
|---|---|---|---|---|---|---|---|
| Loading… | |||||||
A paper sheet, or a supervisor's note. Each line is filed as the same signed, appended row a single correction produces — it is not a weaker kind of record.
| Name | Department | Already on file | Hours worked |
|---|---|---|---|
| Loading… | |||
—
| Day | In | Out | On the clock | Break | Paid |
|---|
—
This is the sentence that gets read back in a dispute. Say what the evidence was.
| Event | Server time | Where | Origin | Chain |
|---|
What the crew's Hours screen slices their punches by. Nothing about a period is stored — change these and every period, past and future, recomputes.
Any pay day you can name. Everything rolls forward and back from it.
Decides which day an overnight shift is filed against.
| Period | Closes | Pays |
|---|---|---|
| Loading… | ||
If these dates look wrong, the anchor or the lag is wrong. It is far easier to see it here than to reason about it.
Ontario counts overtime per week, not per pay period — a 50-hour week followed by a 30-hour one is six hours of overtime, and a fortnight total of 80 shows none of it. So weeks are counted separately and deliberately do not line up with the period.
44 is the ESA minimum. 0 switches it off.
Pick it once. Changing it later moves people's overtime retroactively.
Long enough for a real storm shift, short enough to be useful next morning.
This produces a split, not a rate — nothing here knows what anybody is paid. Payroll applies the premium to a number it can check.
The dropdown a crew member picks from in the app, and what training, toolbox items and forms are targeted at. An id is frozen the first time it is saved, because employee records point at it — rename freely, the id stays.
| Name | Id | Offered in the app | |
|---|---|---|---|
| Loading… | |||
A name that already exists keeps its id, so pasting a corrected list does not orphan anyone. Anything missing from the paste is dropped from the dropdown.
What a crew books their hours against. A code tied to a service rolls up into that service's costing; the rest (shop, travel, training, callbacks) are the buckets no service covers. The code is frozen on first save because time entries point at it.
| Code | Name | Rolls up to | Offered in the app | |
|---|---|---|---|---|
| Loading… | ||||
What the crew is asked to agree to before the app records where they are, and who has answered. Changing the wording bumps the version and asks everybody again — that is deliberate.
Say what is recorded, when, why, how long it is kept, who sees it, and what happens if they say no. The exact text is stored with each answer, so a record always shows the wording that person actually saw.
| Name | Department | Phone belongs to | Answer | When |
|---|---|---|---|---|
| Loading… | ||||
—
Leave the password blank to let them set their own on first login.
| Role | Password set | Added |
|---|
Most recent 200 actions, newest first.
| When | Who | Action | Details |
|---|
The address workflow the Batch Send page drives for this service. Only Address workflows can send one proposal link per address.
How deal-creator resolves each SKU's sale price at deal-creation time. Only editable and only visible here, not on any service's own page.
Which SKUs go on a seasonal renewal deal, and under what condition. Pricing itself still comes from each product's Pricing Rule above. This only decides whether a SKU is included at all. Only editable and only visible here.
Products with a sub-service split, or classified as Bundle / Multi-Application. Each split must total 100%. Only editable and only visible here, not on any service's own page.
Opt in per event. Nobody is emailed unless they've turned an event on.