This article covers PortaPro's "driver is on the way" customer text messages: the SMS that tells a customer their driver is heading over, with a live GPS-derived ETA and an optional real-time tracking link so they can watch the truck approach. It covers the three org-level modes, the driver experience, per-customer opt-outs, the customer's tracking page, template customization, and troubleshooting.
If you're looking for two-way conversations with customers over text, see Two-Way Text Messaging. For the day-of dispatch text that goes out when the whole route is dispatched, see Route Plan Dispatch (no dedicated help-center article yet). For general SMS setup (getting a number, A2P registration), see SMS Setup in Settings (no dedicated help-center article yet).
---
ETA-1: Why This Feature Exists
Portable-toilet and septic customers routinely want a heads-up before a driver shows up, for gate access, dog containment, to move a car, or just to be present. Without proactive communication, drivers get calls asking "when are you coming?" all day long, and customers get surprised by trucks in their driveway.
The Driver On-the-Way text sends a customer one message per stop, timed to when the driver is actually en route, with a real ETA. It's the digital equivalent of "we're 20 minutes out."
PortaPro's implementation:
Requirements: SMS must be active for your organization (Settings → SMS wizard complete, A2P 10DLC carrier approval received), and the feature is available on the Growth plan and up.
---
ETA-2: The Three Modes
The org-wide behavior is set in Settings → SMS → "Driver on-the-way texts" and applies to every driver in your organization.
Mode 1: Don't text customers (off), default
No on-the-way text is ever sent, from any trigger. Drivers see no button; office staff see no chip. Use this if you handle customer heads-up outside of PortaPro (phone calls, another dispatcher tool) or don't want to text at all.
Mode 2: Text automatically (auto)
The text fires the first time any of these happens for a given stop:
Whichever fires first sends the text; the other triggers become no-ops (single-send guard).
Best for: operations that want zero friction, drivers just drive, customers get texted automatically, office doesn't have to think about it.
Mode 3: Drivers tap a button (manual)
Every stop card on the driver app shows a "Text customer" button. Drivers decide when (or whether) to send. Nothing goes out on its own, the GPS threshold engine is disabled in this mode.
Best for: operations that want driver discretion, some customers shouldn't be texted (they've asked to be called instead), or drivers want to send only when they're genuinely close.
In auto mode, the driver button still appears as long as the text hasn't been sent yet, a driver can beat the automatic triggers to it. Once sent (by any path), the button is replaced with a green "Texted 2:41 PM" chip.
---
ETA-3: Setting It Up
One-time setup (org-wide):
That's it, no per-customer or per-driver setup required. The feature is live for every driver on every stop from that point on.
The template placeholders
"Reply STOP to opt out" is appended automatically to any template that doesn't already contain the word STOP, CTIA compliance is enforced at send time, so operator-edited templates can't accidentally omit it.
---
ETA-4: What the Customer Sees
The text. With the default template and tracking on, a customer receives something like:
Hi Jordan, Alex is on the way, about 18 minutes out (arriving around 2:45 PM). Track live: yourdomain.com/track/abc123 - Northern Shores Portables Reply STOP to opt out.
The tracking page. Tapping the link opens a browser page that shows:
The tracking page requires no login, it works from a text on a phone that's never opened your portal. The URL contains the job UUID, which isn't guessable; when the job is completed or cancelled the page shows a done state and stops showing the driver's location.
Opt-out. Customers can reply STOP to any text (or START to re-subscribe). STOP replies are recorded for your org, and every subsequent send checks that list.
---
ETA-5: The Driver Experience
Route-plan stops (the "Today's Route" list on the driver's home screen):
Ad-hoc jobs (jobs on the driver's dashboard that aren't part of today's dispatched route plan):
Navigation handoff. The address on every stop card is tappable. In auto mode, tapping it and picking a maps app also advances the stop to en_route (which fires the text), so drivers don't have to remember to tap two things. See Driver App: GPS Navigation Handoffs.
---
ETA-6: Per-Customer Preferences
Every customer has SMS preferences that override the org-level mode. Even in auto mode, a customer who's opted out won't get a text.
Two per-customer switches live on the customer's Notification Preferences tab (Customer profile → Communications):
Quiet hours (start/end time per customer) suppress the send during those hours, the text is skipped, not queued, so a later trigger outside the window can still send. Set quiet hours per customer or leave them empty to always allow.
Customer self-serve. Customers can flip both switches themselves from the customer portal (Portal → Settings → Text Messages). Handy for accounts where your ops team doesn't want to manage per-customer prefs by hand.
STOP replies. If a customer replies STOP to any of your texts, that phone number is opted out for your org (per phone, not per customer, so a landlord opting out affects every tenant sharing that number). No further texts of any kind go to that number until they reply START.
---
ETA-7: Office Visibility
Office staff see the same "on-the-way" state that drivers see, in three places:
---
ETA-8: How the ETA Is Calculated
The ETA quoted in the text is not a static estimate, it's computed from live driver GPS.
In auto mode's GPS-threshold path:
In status-transition and driver-manual paths:
The sender uses the freshest live ETA if it's under 20 minutes old; otherwise it recomputes on the spot from the driver's latest GPS. If neither is available, the text is sent without a time quote ("your driver is on the way now"), better than delaying.
When drivers have a bolted vehicle tracker (e.g. Samsara), that GPS feed is used as a fallback when the phone hasn't pinged recently. Bolted trackers are strictly a better ETA origin than phones anyway; this fallback quietly kicks in whenever available.
Not-yet-dispatched routes and future dates. The engine only runs against today's dispatched plan, a plan you're still editing doesn't generate ETAs or texts. Cancel a plan and no more texts will fire for it.
---
ETA-9: The Single-Send Guard
Every on-the-way text stamps a sent timestamp on the stop (or on the job, for ad-hoc). This is checked atomically before every send, the same stop can never text a customer twice, from any combination of triggers, even under a race.
Consequences:
To resend intentionally (rare): this requires a database-level reset and isn't exposed in the UI, resending unpredictably is exactly the failure mode the guard prevents. Contact support if you have a legitimate need.
---
ETA-10: Feature Gating and Cost
Plan requirement: Growth plan and up. On Starter or Core the Settings card shows an upgrade prompt.
Twilio cost: every text costs your org whatever your Twilio pricing is (roughly $0.008 per US SMS as of 2026, plus your carrier fees). PortaPro doesn't mark it up. The tracking link doesn't cost anything on its own, it's just a URL to your PortaPro app.
Number and A2P registration are one-time setup costs handled through Settings → SMS. A2P 10DLC carrier registration typically takes days (up to two weeks); the on-the-way feature won't send anything until your org's SMS status is active and your campaign is approved, this fail-closed behavior prevents accidental sends during setup.
---
ETA-11: Troubleshooting
"The customer says they didn't get the text."
- Your org's mode is set to auto or manual (not off)
- The stop is on today's dispatched plan (not a draft)
- The driver actually did something (marked en route, tapped navigate, or tapped the button), auto mode still requires a trigger
- SMS status is active and the A2P campaign is approved (check Settings → SMS)
"The text quoted the wrong ETA, driver was 5 minutes away, text said 25 minutes."
The ETA is snapped at send time from the most recent GPS ping. If the driver's phone hadn't reported location for 15+ minutes when the trigger fired, the ETA falls back to the optimizer's calculated arrival, which can be stale. Verify:
"Customer got two 'on the way' texts."
Under normal operation this can't happen, the single-send guard is atomic. If it did, the most likely cause is that the guard was manually reset. Contact support if you see this.
"I turned on 'text automatically' but nothing's happening."
Check, in order:
"The tracking link the customer clicked shows 'Tracking not enabled.'"
Your org's driver location tracking setting is off. Enable it in Settings → Routing → Driver Location Tracking. Without it, the public tracking page returns a not-found state by design, a privacy safeguard for orgs that don't want customer-facing GPS at all.
"Driver marked en route but the customer got no text and no chip appeared."
The most common cause is a missing phone number:
The sender skips silently in this case, nothing to do until the customer's phone number is filled in.
"Manual mode: the driver taps 'Text customer' and nothing happens."
Common reasons nothing sends:
"Customer replied STOP but they're still getting on-the-way texts."
STOP replies are recorded immediately and every send path checks that list. If texts still send after a confirmed STOP reply, that's a bug, report it to support with the message details from your Twilio console.
"The message template preview looks right but the actual text is missing 'Reply STOP.'"
It's appended automatically on the server. If a delivered message somehow lacks STOP language, check the actual delivered body in the customer's Inbox thread, the preview and the send both run the same normalization.
"Where does the tracking link go if the customer clicks it after service is complete?"
The tracking page transitions to a "Completed" state with the completion time, it doesn't show the driver's current location anymore. Terminal state.
---
