> For the complete documentation index, see [llms.txt](https://docs.shortcutco.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.shortcutco.com/readme/snow-removal.md).

# Snow removal

Sell snow services that wait for snow, send out everyone who is due when it falls, offer salting on call, and bill each push by the depth.

Each customer's snow service is a **snow line**: a job that waits for snow instead of repeating on a schedule. When it snows, you tell Dispatch how much fell, and it lists every customer whose trigger was reached so you can send them all to your crews at once. Each visit remembers the depth it was dispatched at, so the invoice prices the push from your depth ladder and says why.

{% embed url="<https://www.youtube.com/watch?v=0AmrH83LzfA>" %}
Video: one 3-inch storm, from the Snow filter to the invoice (2:13).
{% endembed %}

Snow setup and snow dispatch are for admins. Crews see snow stops on their **Today** screen like any other stop.

## Set up a snow service

A snow service is what you sell: driveway plowing, walks, salting, loader work. Its settings are copied onto each customer's line when you sell it, and you can change them per customer there.

{% stepper %}
{% step %}

### Create the service

Open **Settings → Services** and click **Create service**. [Open Services →](https://shortcutco.com/settings/services)

At the top, choose **Snow** (*Fires on accumulation*). You can't change a service's type after you save it.
{% endstep %}

{% step %}

### Name and price it

Enter a **Name** (for example *Driveway plowing*), an optional **Description**, a **Rate**, and a **Price structure**:

* **Flat fee**: a price per push. Only Flat fee services can have a depth ladder.
* **Man Hour** or **Per hour**: for truck or loader time. Man Hour bills the crew time on site, like any [Man Hour service](/readme/configuration/services-pricing-structures.md#per-man-hour-services-bill-by-crew-time).
* **Per sq ft**: priced by area. On an estimate, the quantity starts at the property's measured driveway plus sidewalk area, if the property has been measured.
  {% endstep %}

{% step %}

### Choose the trigger

The **Trigger** decides when a customer's line comes up on a snow day. See [Triggers](#triggers) below. New snow services start on **Depth** at **2 in.**
{% endstep %}

{% step %}

### Add a depth ladder (optional)

On a **Flat fee** service, click **+ Add depth ladder** under the rate to price each push by how much snow fell. See [Depth ladder](#depth-ladder) below.
{% endstep %}

{% step %}

### Save

Click **Save**. The service appears in the list with a snowflake, and its trigger shows under the name (for example *Trigger 2 in.*). A service with a ladder shows its price range and how many brackets it has.
{% endstep %}
{% endstepper %}

<figure><img src="https://2299783971-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOhi7KtJ4vY1pDKwWu5SV%2Fuploads%2Fgit-blob-43757241ce56902aae603b9828c253e0a34d0b1a%2Fsnow-service-editor.png?alt=media" alt="Create a new service window with the Snow type selected, a Depth trigger of 2 inches, and a depth ladder with three brackets priced per push"><figcaption><p>A snow service: the trigger decides when the line comes up, and the depth ladder prices each push.</p></figcaption></figure>

### Triggers

| Trigger                      | When the line comes up on a snow day                                                                                                                 |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Depth** (enter the inches) | When the accumulation you pick in Dispatch is at least this deep. A 2 in. trigger is due at 2 in. or more.                                           |
| **Any accumulation**         | Every time you go out for snow, whatever fell.                                                                                                       |
| **Manual**                   | Never on its own. It's listed separately so you pick it by hand. Use it for hauling and loader work.                                                 |
| **On call**                  | Offered to the customer each time; they accept from a link. Salting is the usual example. See [On-call customers](#on-call-customers-send-an-offer). |

Choosing **On call** adds **Offers close after \[3] hours**. That's how long a customer has to accept each offer (1 to 24 hours). You set it once on the service, and you can still change it for a single send.

### Depth ladder

Each row of the ladder is a bracket: an upper limit under **Accumulation** and a **Price per push**. Click **+ Add tier** for another bracket. The last bracket has no upper limit (*8 in. and up*). You can have up to 10 brackets.

A push is priced at the bracket its dispatched-at depth falls in. A limit includes its own number: with brackets of 0–4 in. and 4–8 in., a push at exactly 4 in. uses the first one. Removing every bracket takes you back to a single **Rate**.

{% hint style="info" %}
Changing a snow service later doesn't change lines you've already sold. To change one customer's terms, edit their line (see [Change a customer's snow terms](#change-a-customers-snow-terms)).
{% endhint %}

## Sell snow on an estimate or a job

Add a snow service like any other service: in **Base services** on an [estimate](/readme/proposals/how-to-create-and-send-a-proposal.md), or with **New job** on a customer's profile when you don't need their approval (see [Create a job for an existing customer](/readme/jobs-and-scheduling/create-a-job-for-an-existing-customer.md)).

A snow line has three differences from other lines:

* **Repeating** says **On demand**, with *Waiting for snow · no visits are generated* beside it. Snow lines never create visits on their own. You create each visit from Dispatch on a snow day.
* A **Trigger** row, filled in from the service. Change it for this customer if you need to: **Depth** (with the inches), **Any**, **Manual**, or **On call**. On-call lines show the service's offer window, for example *Offers close after 3 hours*.
* On **Flat fee** lines, a **Depth ladder** row, filled in from the service and editable for this customer. If the service has no ladder, **+ Add depth ladder** adds one.

Snow lines can't have alternatives.

**What the customer sees.** On the estimate, the terms appear under the line's description as one line of text, for example:

* *Up to 4 in. $50 · 4–8 in. $75 · 8 in. and above $110 · Dispatched when accumulation reaches 2 in.*
* *Offered each time we salt. You accept from a text or email. $35 per application.* (an on-call line)

Under the price it says *per push · on demand* for Flat fee lines, *per application · on call* for on-call lines, and *on demand* for the rest.

When the customer approves (or you click **Create jobs**), the line becomes an active job. On the **Jobs** page and the customer's **Jobs** tab it shows **Waiting for snow** where the next visit date usually goes. It never shows as needing scheduling.

### Change a customer's snow terms

On the **Jobs** page, open the line's **⋯** menu and choose **Edit**. On the customer's **Jobs** tab, click the line (or choose **Edit job…** from its menu). The **Edit \[line name]** window has **Price**, **Quantity**, **Price structure**, the trigger, and the ladder.

Changes apply to pushes that aren't completed yet. Completed visits keep the price they were billed at. [Bulk price changes](/readme/jobs-and-scheduling/bulk-price-changes.md) skip snow lines, so change snow prices here.

## On a snow day: dispatch from the Snow filter

The **Snow** filter appears in Dispatch once you have at least one active snow line. Run snow days from Dispatch on a computer.

{% stepper %}
{% step %}

### Tell Dispatch how much fell

Open **Dispatch → All filters → Snow** and pick the accumulation: **Any accumulation**, **1 in.**, **2 in.**, **3 in.**, **4 in.**, **6 in.**, or type a depth in **Other** and press Enter (tenths work, like *2.5*). [Open Dispatch →](https://shortcutco.com/dispatch)

The board is replaced by the **Snow panel**, and a **Snow · 3 in.** chip appears in the filter row. The header count switches to your snow lines, for example *49 snow lines • 4 on call • 5 below trigger*. Click ✕ on the chip to go back to the normal board.
{% endstep %}

{% step %}

### Check the date

**Service date** at the top of the panel starts on today. Change it to dispatch for a later day. Past dates aren't allowed.
{% endstep %}

{% step %}

### Read the lanes

The panel lists your snow lines in lanes (see [The Snow panel](#the-snow-panel) below). Each row shows **Client**, **Service**, **Trigger**, **Crew**, and the price that line would bill at this depth.
{% endstep %}

{% step %}

### Tick and dispatch

Tick the rows you want. The black bar at the bottom says *Each visit is recorded as dispatched at 3 in.*

* **Dispatch 12 to today** (or to the date you picked) creates the visits, each on its line's own crew. Lines with no crew land in the **Unassigned** lane on the board.
* **Crew** sends the whole selection to one crew instead. Pick the crew and the visits are created right away.

A green line confirms it, for example *12 visits dispatched to today at 3 in.* Click **View board** to see the stops.
{% endstep %}
{% endstepper %}

<figure><img src="https://2299783971-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOhi7KtJ4vY1pDKwWu5SV%2Fuploads%2Fgit-blob-6ad71d725d2155c7ef6cdd4e36c1b6f5adc519b0%2Fsnow-dispatch-panel.png?alt=media" alt="Dispatch with the Snow filter at 3 inches, showing the Due, On call, and Manual trigger lanes and the black bar with Dispatch 2 to today"><figcaption><p>The Snow panel at 3 in.: tick the lines that are due and dispatch them in one click.</p></figcaption></figure>

### The Snow panel

| Lane                                  | What's in it                                                                                                                                         |
| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Due at 3 in.**                      | Lines whose trigger is at or below the depth you picked, plus every **Any accumulation** line. At **Any accumulation**, every Depth line is due too. |
| *2 snow lines below 3 in. not shown.* | Lines whose trigger is higher than the depth you picked. Click **Show them** to list them. You can still tick and dispatch them.                     |
| **On call**                           | Every on-call line, whatever the depth. Dispatch them directly, or send an offer.                                                                    |
| **Manual trigger**                    | Every Manual line, whatever the depth. Pick the ones you need.                                                                                       |

The price column is **Price at 3 in.**: the bracket for that depth on ladder lines. At **Any accumulation** it's **Price · lowest bracket**. Hourly lines show their hourly rate.

A line that already has an open visit on that date is left out of every lane, and the header counts it as *already dispatched*, so nobody gets sent twice. Once that visit is completed, the line comes back. Dispatch it again for a second push; it's billed as another push.

The board's **Team**, **Services**, **Tags**, **Map area**, and search filters also apply to the panel, so a map area or a tag lets you dispatch one neighborhood at a time. When filters hide lines, the panel says so, for example *Board filters hide 3 snow lines*. The panel refreshes itself every 30 seconds.

### Crews and route order

Each visit goes to its line's crew. If you run one crew, every snow line is already on it. If you run more than one, new snow lines don't have a crew and show **Unassigned** in the **Crew** column. Use **Crew** on the black bar to send each batch to the crew that's driving it.

New stops go on the end of the crew's route for that day, in the order that crew ran them on its last snow day. Customers the crew hasn't done before follow, in address order. Reorder the stops on the board as usual (see [Assign crews and set the route order](/readme/dispatch/assigning-and-ordering-routes.md)). The next snow day starts from the order you leave.

### What the crew sees

On the crew's **Today** screen, a snow stop shows *Dispatched at 3 in.* under the service (or *Dispatched · any accumulation*), so the driver knows why the stop is on the list. Everything else works like any stop: **Start**, photos, notes, **Finish**. See [Worker app overview](/readme/worker-app/worker-app-overview.md).

### End of the day: close out what didn't happen

Some snow visits never get done: the customer cleared it themselves, or a truck broke down. Close them the same day so they don't pile up in [Needs attention](/readme/dispatch/needs-attention.md).

1. Set the board's date chip to the snow day.
2. Open **All filters → Snow** and choose **Dispatched** under **Status**. The Snow panel closes and the board shows that day's visits for your snow lines (the **Services** filter is set to them).
3. Tick the visits that won't happen, click **Mark handled** on the black bar, and confirm. It closes them with no invoice and no customer message. **Cancel Jobs** also works. See [Closing out a stop that won't be rescheduled](/readme/dispatch/needs-attention.md#closing-out-a-stop-that-wont-be-rescheduled).

## On-call customers: send an offer

For **On call** lines, the customer decides each time. You send an offer, they tap a link and accept, and the visit lands on the crew's route right then.

{% stepper %}
{% step %}

### Select the lines

In the Snow panel, tick rows in the **On call** lane (on-call lines show at any depth). Click **Offer** on the black bar. If your selection mixes on-call and other lines, the button reads **Offer 4 on call**, and only the on-call lines are offered.
{% endstep %}

{% step %}

### Write the message

The **Send update to customers** window opens with the **Snow offer · salting** template:

`{{COMPANYNAME}}: we're salting today from {{STARTTIME}}. Accept by {{CLOSESAT}}: {{APPROVELINK}}`

Set **Crews start** to fill in the start time. If you leave it empty (and haven't edited the text), the template drops "from …". Edit the text if you like, and click a field to add it. The message must keep `{{APPROVELINK}}`, which becomes each customer's own link.

The line under the message is the offer window, which comes from the service. Click **Change for this send** to use a different number of hours (1 to 12). If the lines you picked have different windows, the shortest one applies.
{% endstep %}

{% step %}

### Review recipients

Click **Review recipients**. The close line now shows the time, for example *Closes at 10am · 3 hours after send, from the service*. The right side shows a rendered example and **Preflight · 42 ready**, for example *40 by SMS · 2 by email (1 no mobile on file, 1 opted out of texts)*. It also counts anyone skipped (*No phone or email on file*), lines **Already offered and still open**, and lines **Already on today's board**. Those aren't offered again.
{% endstep %}

{% step %}

### Send

Tick **This is a service update, not a marketing message.** Between 8:00 pm and 8:00 am you also need to tick **Send now anyway**; an early-morning salting offer falls inside those quiet hours. For 50 or more customers, type the number to confirm. Click **Continue with 42**. A message confirms *Offer sent to 42 customers*.
{% endstep %}
{% endstepper %}

<figure><img src="https://2299783971-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOhi7KtJ4vY1pDKwWu5SV%2Fuploads%2Fgit-blob-ff8a3d113432a34e71a0843bc10fa4b6eb137a49%2Fsnow-offer-dialog.png?alt=media" alt="Send update to customers window with the Snow offer salting template, a crews start time, the close time line, and the preflight showing who gets SMS and who gets email"><figcaption><p>An offer: one message per customer with their own approve link, and a close time from the service.</p></figcaption></figure>

Each customer gets one message, however many of their properties you offered. It goes by text when they have a mobile number and haven't opted out, and by email otherwise. Emails have the subject *Dispatch update from \[your company name]*.

### What the customer sees

The link opens a page with your company name, logo, and contact details, a title such as **Salting today**, and the start time if you set one. It lists each property offered with its price, the total, and *Per application. Billed after the visit.* (Hourly lines say *Billed by the man-hour after the visit.*)

* **Yes, salt today** accepts. Services that aren't salting say **Yes, come today**. With several properties, each one has a tick box, and any they untick count as declined.
* **No thanks** declines.
* Underneath: *Offer closes at 10:00am.*

### What happens next

| The customer…      | They see                                                                                                                                                                               | You see                                                                                                                                                                                                    |
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Accepts**        | *You're on the route.* with the time they accepted. If they have a mobile number and haven't opted out, they also get a text: *\[Your company]: you're on the route for 412 Birch Ln.* | A visit for today on the line's crew (or in **Unassigned** if the line has no crew), on the end of that crew's route. The crew card says *Customer approved 7:42am*. The line leaves the **On call** lane. |
| **Declines**       | *Thanks for letting us know. We'll offer again next time.*                                                                                                                             | **Declined** and the time, in the lane.                                                                                                                                                                    |
| **Doesn't answer** | After the close time: *This offer closed at 10:00am. We'll offer again next time.* Nothing is created.                                                                                 | **No response** in the lane. You can still dispatch the line by hand.                                                                                                                                      |

While offers are out, the **On call** lane header counts them, for example *Offered 42 · 18 accepted · 3 declined · 21 waiting · closes 10:00am*. The counts cover offers from the last 24 hours. Each row shows **Waiting**, **Declined** (with the time), or **No response** in place of its trigger, and a note says when waiting turns into no response.

{% hint style="info" %}
If you run more than one crew, accepted visits for lines with no crew land in **Unassigned**. Watch that lane during the offer window and move each stop to the crew that's out salting.
{% endhint %}

Each line can have one open offer at a time. Once it closes, you can offer it again. The confirmation texts also appear in your [Messaging inbox](/readme/messaging-inbox.md).

## Billing

### How the price is set

The price is set when the visit is completed:

* **Flat fee with a depth ladder**: the bracket the visit's dispatched-at depth falls in, times the quantity. A visit dispatched at **Any accumulation**, or accepted from an offer, uses the lowest bracket.
* **Flat fee without a ladder**, **Per hour**, and **Per sq ft**: the line's price, as usual.
* **Man Hour**: the crew time on site, like any other Man Hour visit.

The depth stamped on a visit never changes. Picking a different depth in the Snow filter later doesn't touch visits you've already dispatched. Editing a line's price or ladder changes visits that aren't completed yet.

### The invoice line

The invoice line's description names the line, the date, and the depth, for example:

*Plowing · Jan 15 · dispatched at 3 in. · up to 4 in. bracket*

The bracket only appears on ladder lines. Visits dispatched at **Any accumulation**, and visits accepted from an offer, read *dispatched · any accumulation*. If the line has its own description, this goes on the line below it. On Man Hour lines, the hours breakdown follows. Invoices are created and sent the same way as for any other visit (see [How invoices are created](/readme/finances-invoices-and-payments/how-invoices-are-created-job-driven.md)).

### What Shortcut keeps on record

When the crew taps **Start** at a snow visit, Shortcut records the snowfall and snow depth at that spot from a weather service. If the phone didn't share a location, it uses the property's. Shortcut also logs every snow dispatch (the date, the depth, who sent it, which lines went out, and which were below their trigger at the time) and every offer sent, accepted, declined, and closed. Neither record shows on a screen. They're kept with your account so a visit can be explained later.

## FAQ

<details>

<summary>It snowed less than a customer's trigger. What happens?</summary>

Nothing goes out for that customer. Their line is counted under the Due lane (*2 snow lines below 3 in. not shown.*). To go anyway, click **Show them**, tick the line, and dispatch it. It's billed at the bracket for the depth you picked.

</details>

<details>

<summary>Can I dispatch a snow line by hand?</summary>

Yes. Every row in the Snow panel can be ticked and dispatched, whatever its lane: Manual lines, on-call lines without an offer, and lines below their trigger. Snow lines don't go through the normal scheduling windows. If you try, Shortcut says *Snow lines wait for snow. Dispatch them from the Snow filter in Dispatch.*

</details>

<details>

<summary>Do offers respect opt-outs?</summary>

Yes. A customer who opted out of texts (replied STOP), or whose number is blocked, gets the offer by email if you have one. If not, they're skipped and counted in the review. They don't get the "you're on the route" text either. A customer who can't get a text and whose email was suppressed after a spam complaint is skipped too. If a customer texts back instead of tapping the link, the reply lands in your [Messaging inbox](/readme/messaging-inbox.md); it doesn't accept the offer.

</details>

<details>

<summary>What about quiet hours?</summary>

Offers follow the same quiet hours as other Dispatch messages: 8:00 pm to 8:00 am in your company's time zone. To send in that window, tick **Send now anyway**. Most morning salting offers go out inside quiet hours, so expect to tick it. See [Quiet hours](/readme/dispatch/messaging-from-dispatch.md#quiet-hours).

</details>

<details>

<summary>Will my automations send for snow visits?</summary>

Yes. Snow visits are ordinary visits, so [automations](/readme/automations.md) such as **Visit scheduled** and **Visit completed** send for them. A customer who accepts an offer may get your Visit scheduled message a few seconds after the "on the route" text.

</details>

<details>

<summary>I don't see the Snow filter.</summary>

It appears once you have at least one active snow line: a snow service on an approved estimate or a job you created. Creating the service alone isn't enough. Dispatch on a phone doesn't have it, so use a computer.

</details>

## Related pages

* [Services (pricing structures)](/readme/configuration/services-pricing-structures.md)
* [Messaging from Dispatch](/readme/dispatch/messaging-from-dispatch.md)
* [Assign crews and set the route order](/readme/dispatch/assigning-and-ordering-routes.md)
* [Closing out the day](/readme/dispatch/closing-out-the-day.md)
* [How invoices are created](/readme/finances-invoices-and-payments/how-invoices-are-created-job-driven.md)

<details>

<summary>Still stuck?</summary>

Email **<hello@shortcutco.com>** with the customer name, the snow line, and a screenshot of the Snow panel.

</details>
