Postcard Perfect

Postcard Admin Console

Sign in with your admin account.

or

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.

Change password

Postcard AdminConsole
Dashboard Deals manager
Batch Proposal creator
Dispatch Zones Crews
HR & Training Employee Manager Timesheets Sites
Service Emails
User Manager Payroll & Departments eProposal Settings Activity Log Developer

Addresses we cover

Counted from each address's Current Service Labels. An address with no label is not counted as a customer.

—
Addresses with a service
—
Address records in total
—
No service on file
ServiceAddressesShare
Loading…

⚠ QuickBooks is connected to its sandbox environment. The figures below are test data, not real invoices.

Receivables

YYYY-MM-DD YYYY-MM-DD
Open balance
—
Not yet due
—
Past due
—
Invoices in QuickBooks
—
Open right now
—
Made by this system
—

Where the money sits

Open balance by service.

How late it is

Past due only.

By invoice size

Where the count and the money disagree.

Residential and commercial

Open balance and how much of it is past due.

Who owes you

Customer Open invoices Service type Customer type Oldest due Days late Balance

Batch Proposal creator

Scan is read-only. Create queues real deals and needs confirmation.

The campaign name is how a re-run knows what it already did: any address that already has a deal from this campaign is skipped. Reuse the exact same name to resume a run, or use a new one to deliberately send again.

Only a super admin or a developer can change these.

Found 0 Processing 0 Created 0 Failed 0

Service info

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.

—
Customers
—
Share of all customers

Deal creation metrics

Every deal this service made, by what made it. The share is of that column's own created count.

Season completion

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.

Renewing 0 Lapsing 0 Signed, unlabelled 0 Qualifying deals 0

Previous runs

Every completion is recorded with what it changed. Undo puts that whole run back.

Renewal logic

Which services go on this pipeline's renewal deal, and what decides each one. The price comes from the product's own pricing rule, never from here.

Only a super admin or a developer can change these rules.

Ready to send

Deals in eProposal Ready, by how they were created. Scan is read-only. Send enrols each in the proposal workflow, and asks first.

0 ready to send
DealAddressRenewsSent

The email this sends

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.

Loading…

Open workflow in HubSpot

Pricing

Edits the real Product record's price. Every future deal reads this directly.

SKUProductPrice (CAD)

Payments for this service

What this service offers a customer. The eProposal reads these, and a new deal is created with them.

New deals for this service are created with this term. Not set leaves the deal blank, and a blank deal invoices as Due upon receipt.

Across every service

These apply to all five services at once. Changing one here changes it on every service tab.

Terms & policies

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.

DocumentAddressStatusUpdated
Loading…

New document

Plain paragraphs are fine. Pasted formatting survives. Anything that could run code 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:

The data address returns the same text as JSON, for a page that styles it itself.

This exact document, whatever its job:

—
Shows the document exactly as the public address renders it.

Not configured yet. No properties or SKUs are set up for this service in the admin console.

Add a route

A route is the named run a crew drives, the thing the paper schedule called "WEED CONTROL - 1". Name is all that's required.

Routes

NameCategoryCrewTruckTrailerStart
Loading…

Crews

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.

Nobody added yet.
CrewDescriptionMembers
Loading…
Checking…

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.

Checking…

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.

Add a service email

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.


                

Office queue

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.

Templates

NameOutcomeSends toAuto
Loading…

Add an employee

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.

People

—

NameRoleDepartmentCrewReports toPortal loginTime clock
Loading…

Access manager

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…

Share something with the crew

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.

The library

—

TitleTypeVersionSigned offLive
Loading…

Who has signed off

—

NameDepartmentCrewSigned off

Forms the crew can file

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.

FormFieldsPhotoLive
Loading…

Edit form

Fields are shown to the crew in this order. A "heading" is a divider with no answer.

Tick none to offer it to everybody.

LabelKeyTypeReqOptions / shown when

What the crew has filed

—

WhenFormWhoSummary
Loading…

Submission

—

On site now

—

—
People on site
—
Sites in use
—
Probably forgot to sign out

Where the clock may be started

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 punch with no location is recorded as unverified, not refused.

Added to each site's radius. A phone in a truck cab reads 50–100 m out on a bad morning.

Add a site

A place the company works at repeatedly. The pin and radius only record how far away somebody was at sign-in. Being outside is noted, never refused.

Both or neither. Right-click a spot in Google Maps and the first menu item is the pair.

Sites

—

NameWhereRequiresIn use
Loading…

Recent sign-ins

Newest first. A row is written on sign-in, not on sign-out, so the ones who never signed out still show.

WhoSiteInOutOn siteNotes
Loading…

Click the map to place it, or drag the pin. The circle is the radius. Other sites are shown faintly so overlaps are obvious.

Zones

One map per pipeline. Draw a zone, drag its corners to reshape it, and give it the name the office uses for it. Nothing here reads or writes HubSpot yet, so a change on this screen moves no customer record.

A .kmz is a zipped .kml. Unzip it first and pick the doc.kml inside. An import adds what is not already on the map by name, and changes nothing that is.

—

Removed zones

Nothing is deleted. A removed zone keeps its shape and comes back exactly as it was.

The maps in the drop-down

One map per pipeline to begin with. Add a map to cover several pipelines at once, for example one snow map for both the residential and the commercial pipeline. A map that still holds zones cannot be taken off the list.

Click a zone to select it.

Timesheets

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.

—
Hours this period
—
People with hours
—
Not yet approved

—

NameDepartmentCrewDaysBreakPaidApproved
Loading…

Enter hours for people without a phone

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.

NameDepartmentAlready on fileHours worked
Loading…
Blank rows are skipped. Entering a figure for somebody who already has hours replaces the day, and says who did it.

—

—

DayInOutOn the clockBreakPaid

—

This is the sentence that gets read back in a dispute. Say what the evidence was.

Every punch behind these numbers
EventServer timeWhereOriginChain

eProposal settings

What every proposal and contract reads. Nothing here lives in code.

Loading…

Pay calendar

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.

PeriodClosesPays
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. Weeks are counted separately and 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. Payroll applies the premium to it.

Departments

The dropdown a crew member picks from in the app, and what training, toolbox items and forms are targeted at. Rename freely. The id is frozen on first save, so nobody is orphaned.

NameIdOffered in the app
Loading…
Paste a whole list instead

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.

Nothing is saved until you press Save departments.

Cost codes

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.

CodeNameRolls up toWhereOffered in the app
Loading…

Where

The crew only see this code when they are inside the radius.

Location consent

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.

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.

NameDepartmentPhone belongs toAnswerWhen
Loading…

—

Add a user

Leave the password blank to let them set their own on first login.

All users

EmailRolePassword setAdded

What each role may do

Tick what a role may reach. Everyone signed in can still see the dashboard and the service pages; this table only covers people, payroll and the admin screens.

What it covers
Loading…

Activity log

Most recent 200 actions, newest first.

WhenWhoActionDetails

Deals manager

Find a deal by name, by deal number, or by its record id.

DealNumberAmountInvoice status

Deal

Batch email workflow

The address workflow the Batch Send page drives for this service. Only Address workflows can send one proposal link per address.

Loading…

General Settings

Pricing rules

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.

Seasonal picking formula

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.

Needs Review list

The list the Batch renewal page links to. Build it in HubSpot on the status below, then pick it here.

Loading…

Sub-service breakdown

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.

QuickBooks

Stops everything this business sends to or reads from QuickBooks. Use it when something is going out wrong and you need it to stop now.

Loading…

While it is stopped, no invoice and no customer is created, changed or read. The QuickBooks cards on a deal show an error and the invoice figures on the dashboard stop loading. The per-service auto invoice setting is a different thing: it only decides whether a signature invoices by itself, and it never stops the button.

Notification preferences

Opt in per event. Nobody is emailed unless they've turned an event on.