Browse the docs

Agent setup guide

NEMT Dispatch Planner

Builds tomorrow's run sheets from your trip sheet and driver roster; a dispatcher approves before drivers see them.

Available About 30 min to set up

What it does

Builds tomorrow's run sheets from your trip sheet and driver roster; a dispatcher approves before drivers see them.

  • Every afternoon, reads your trip-request sheet (one row per trip leg) and your driver roster (one row per driver) in Google Sheets.
  • Tomorrow's trips are picked in code, never by the AI: only rows dated tomorrow in the trigger's time zone reach the planner.
  • AI matches each of those trips to an available driver whose vehicle fits the rider: ambulatory, wheelchair (WAV) or stretcher, within shift hours and capacity. Drivers marked Off or On hold in the roster get no trips.
  • Orders each driver's stops so riders arrive before their appointment with your buffer, groups nearby trips and lists will-call returns separately.
  • Lists every trip it couldn't place, with the reason, and flags tight timings.
  • A dispatcher reviews and edits the plan in Reviews. Once approved, the run sheets are posted to your drivers' Slack channel and emailed to your dispatch list.

What it needs

  • A paid plan (agents run live on paid plans).
  • An AI provider key (Settings → AI Providers).
  • Google Sheets and Slack, connected in Settings → Integrations.
  • A Google Sheet of trip requests (you can paste or export broker-portal trips into it) and a driver roster tab kept current.

What it doesn't do

  • It has no live GPS, traffic or routing engine: travel times are estimates from your sheet or the addresses, and a dispatcher checks them.
  • It doesn't connect to broker portals (ModivCare, MTM and others); trips come from your Google Sheet.
  • It doesn't re-dispatch during the day or track drivers in real time.
  • It doesn't text riders or drivers by SMS (Twilio is waiting for approval); run sheets go out by Slack and email.
  • Nothing reaches drivers until a dispatcher approves the plan.

Availability and plans

Available

Its workflow is built and tested, and every app it needs is live. You can get it and set it up now.

Included free on the Enterprise plan; on other paid plans it's a one-time purchase per workspace (the price is on the Agents page). The Agents page in the app always shows its current status.

Before you start

  • A paid plan: agents run live, and the Free plan only runs Dry Runs.
  • An AI provider key (OpenAI, Anthropic, Google and more) in Settings → AI Providers. AI usage is billed by your provider.
  • These apps, connected in Settings → Integrations: Google Sheets and Slack.
  • Nothing to send: the agent runs on a schedule.
  • About 30 minutes.

Set it up step by step

Get the agent first (buy it, or it's already yours when your plan includes it), then in Agents → My agents press “Set up this agent”. That creates the agent's workflow in your workspace (it counts towards your plan's workflow limit) and opens the canvas with a setup checklist above it. Each item links to the exact place to go and ticks itself off when it's done.

1. Connect your AI provider

The AI steps run on your own key (OpenAI, Anthropic, Google and more). Add one in Settings → AI Providers.

2. Connect Google Sheets

Connect the Google account that can open your trip sheet (Settings → Integrations → Google Sheets).

3. Connect Slack

Connect the Slack workspace your drivers use (Settings → Integrations → Slack).

4. Pick your trip sheet

Open “Read the trip sheet”, pick your Google account, paste the spreadsheet link and pick the tab. Keep one row per trip leg with a header row.

SettingWhat to enterIn step
Google account (trip sheet)The Google account that can open your trip sheet. Pick your connected Google Sheets account.“Read the trip sheet”
Trip sheetLink to the spreadsheet with one row per trip leg (date, trip id, rider, mobility, pickup and drop-off address, pickup or appointment time, status).“Read the trip sheet”
Trip sheet tabThe tab that holds the trips, e.g. Trips.“Read the trip sheet”

5. Pick your driver roster

Open “Read the driver roster”, pick your Google account, paste the spreadsheet link and pick the tab with one row per driver (vehicle, type, seats, shift, certifications, status). Keep Status current: drivers marked Off or On hold get no trips.

SettingWhat to enterIn step
Google account (driver roster)The Google account that can open your driver roster. Pick your connected Google Sheets account.“Read the driver roster”
Driver roster spreadsheetLink to the spreadsheet with one row per driver: Driver, Vehicle, Vehicle type (ambulatory / WAV / stretcher), Seats, Shift start, Shift end, Base, Certifications, Status (Active, Off, On hold). It can be the same spreadsheet as the trip sheet.“Read the driver roster”
Driver roster tabThe tab that holds the roster, e.g. Drivers.“Read the driver roster”

6. Write your dispatch rules

Open “Build tomorrow's run sheets” and replace the placeholder with your time zone, arrival buffer and shared-ride rules.

SettingWhat to enterIn step
Your dispatch rulesReplace the placeholder with your time zone, operating days, arrival buffer before appointments, whether shared rides are allowed and for whom, and any certification a trip type needs. Drivers and vehicles come from the roster tab. It starts as “[DESCRIBE YOUR DISPATCH RULES HERE]” until you replace it.“Build tomorrow's run sheets”

7. Pick the drivers' Slack channel

Open “Post run sheets to drivers in Slack” and pick your account and channel. Invite the app to private channels first (/invite @Fluxo Flow).

SettingWhat to enterIn step
Slack accountThe Slack workspace your drivers use. Pick your connected Slack account.“Post run sheets to drivers in Slack”
Drivers' Slack channelThe channel the approved run sheets are posted to, e.g. #drivers.“Post run sheets to drivers in Slack”

8. Add your dispatch email addresses

Open “Email run sheets to your dispatch list” and enter the list that gets the run sheets and the dispatch address replies go to.

SettingWhat to enterIn step
Drivers' or dispatch email listOne address (a group or distribution list works best) that receives the run sheets by email. It starts as “drivers@your-company.example” until you replace it.“Email run sheets to your dispatch list”
Dispatch office emailDrivers' replies to the run-sheet email come back to this address (Reply-to).“Email run sheets to your dispatch list”

9. Test it with Dry Run

Press Dry Run: the agent runs on sample data with no messages sent and nothing written to your apps.

10. Switch the trigger on

Open the trigger, check the time and time zone, and switch the schedule on. Assign the review step to your dispatcher.

How it works

The agent is a normal workflow with 9 steps (1 AI step, with a person approving in Reviews). You can open, edit and monitor it like any other workflow.

  • Every afternoon at 3 pm — Runs on a schedule (cron 0 15 * * *, America/New_York — change it in the trigger's settings). Runs each afternoon to plan the next service day. Change the time and time zone on the trigger.
  • Read the trip sheet — Google Sheets: Read rows. Reads every row of your trip-request sheet in Google Sheets (one row per trip leg, with a header row).
  • Read the driver roster — Google Sheets: Read rows. Reads your driver roster tab: each driver's vehicle and type, seats, shift, base, certifications and status (e.g. Off or On hold), so the plan uses who is really available.
  • Pick tomorrow's trips — Step. In code, not AI: keeps only the trip rows dated tomorrow in the trigger's time zone (America/New_York unless you change it). Rows for other days, or with a date the check can't read, are left out. Change the day here (within.min / within.max: 1 = tomorrow).
  • Build tomorrow's run sheets — AI step (runs on your AI provider key). AI matches each of tomorrow's trips (picked in code) to an available driver whose vehicle fits, orders each driver's stops around appointment times and lists anything it couldn't assign.
  • Dispatcher approves the run sheets — A person approves or rejects it in Reviews (the run waits). A dispatcher checks the plan in Reviews, fixes any assignment or time (edit manifest_text), then approves it to send to drivers, or rejects it to dispatch by hand.
  • Post run sheets to drivers in Slack — Slack: Post a message. Branch: Approved. Posts the approved run sheets to your drivers' Slack channel.
  • Email run sheets to your dispatch list — Sends an email from your workspace's sender. Branch: Approved. Emails the same run sheets to your drivers' or dispatch distribution address, with replies going to your dispatch office.
  • Dispatched by hand — Kept in the run history. Branch: Rejected. Rejected plans stay in the run history only; nothing is sent.

Test it with Dry Run

Press Dry Run in the canvas. The agent runs on the sample data stored on its trigger (the “Sample data for Dry Run” box), so you can check every step's output before anything is live.

  • Nothing is sent or written: app actions, emails and Slack posts are simulated, and AI steps don't call your AI provider.
  • Approval steps use the Dry Run decision you pick in the step's settings (approved, rejected or timeout), so you can try each branch.

Go live

  • Open the trigger, check the time and time zone, and switch the schedule on. Assign the review step to your dispatcher.
  • Scheduled runs start only once the schedule is activated, and can't repeat faster than your plan's minimum interval.
  • The setup checklist adds a “paid plan” item before activation: live runs need a paid plan (the Free plan only runs Dry Runs).
  • When every checklist item is done and the trigger is on, the checklist says “Live — this agent is running”. Follow its runs in the workflow's History tab and in Analytics → Agents.

Questions

Does it use live GPS or traffic?

No. It plans from the times and estimates in your trip sheet; a dispatcher checks every plan before drivers see it.

Which trips does it plan?

The rows whose trip date is tomorrow, picked in code in the trigger's time zone (dates like 2026-10-14, 10/14/2026 or October 14, 2026 work). Because it runs every afternoon, Monday's trips are planned on Sunday afternoon. Rows with a date it can't read are left out and listed in the run history.

How do I take a driver off tomorrow's plan?

Set their Status in the roster tab to Off or On hold (or edit their shift). The roster is read fresh on every run, so the next plan leaves them out.

Can it pull trips from my broker portal?

Not directly. Export or copy broker trips into the Google Sheet (many portals export CSV), and the agent plans from there.

Troubleshooting

  • “No AI provider connected” or a rejected key: connect or fix the key in Settings → AI Providers, then press Test there.
  • A checklist item stays unticked: the setting is still empty or still contains its placeholder text. Open the step from the checklist and fill it in.
  • An app step fails with “Needs reconnect”: the account's access was revoked or expired. Reconnect it in Settings → Integrations.
  • Slack says the app isn't in the channel: in Slack, type /invite @Fluxo Flow in that channel (always needed for private channels).
  • It didn't run at the expected time: the schedule must be activated, and its time is in the trigger's timezone.
  • A run shows as paused: it's waiting for someone in Reviews to approve or reject it.
  • A step failed: open the run in History and check that step in the Trace tab for the error and what it received.

Generated from the agent's own workflow, so it always matches what the agent does. Last updated .