Connect with Zapier
Use Zapier's built-in Webhooks by Zapier app to trigger Zaps from Upper events or send data to Upper from any Zapier-connected app.
Upper does not have a dedicated app in the Zapier marketplace. Instead, you connect using Webhooks by Zapier — a built-in Zapier app that every Zapier account can access for free. It lets you send and receive raw HTTP requests, which is exactly what the Upper API and webhook system use.
There are two directions of integration:
- Receive data from Upper (trigger) — Upper calls a Zapier webhook URL each time an event occurs in your account. The Zap starts and passes the event payload to the next step.
- Send data to Upper (action) — A Zap calls an Upper
ext-*endpoint using your API token to create or update records in Upper.
Before you start, read Authentication to understand how API tokens work and where to find yours. For the list of ext-* endpoints you can call from Zapier, see Stops and Routes.
Receive data from Upper (trigger)
Zapier can listen for events that Upper fires — for example, when a stop status changes — by providing a URL that Upper calls. You register this URL in the Upper app under Settings → Webhooks.
Create a Catch Hook trigger in Zapier
- In Zapier, create a new Zap.
- For the trigger app, search for and select Webhooks by Zapier.
- Choose the event Catch Hook and click Continue.
- Zapier generates a unique webhook URL — something like
https://hooks.zapier.com/hooks/catch/123456/abcdef/. Copy this URL.
Register the URL in Upper
- Sign in to the Upper web app at crew.upperinc.com.
- Open Settings from the left sidebar, then navigate to Webhooks.
- Paste the Zapier Catch Hook URL into the webhook receiver URL field and save.
Upper will now call this URL whenever a webhook event fires in your account. For a full explanation of what Upper sends and how to review delivery history, see Webhooks.
Test the trigger
Back in Zapier, click Test trigger. Zapier listens on the URL for a short window. To trigger a test event, make a relevant change in Upper (for example, update a stop) so Upper fires the webhook. Zapier picks up the payload and shows you the data structure, which you can then map to subsequent action steps.
Build your action steps
Once Zapier has received a sample payload, add action steps to your Zap — for example, adding a row to Google Sheets, creating a record in your CRM, or posting a message to Slack — using the fields from the Upper event payload.
Turn on the Zap
When all steps are configured and tested, turn the Zap on. From this point, every qualifying Upper event delivers the payload to Zapier and triggers the downstream actions.
Send data to Upper (action)
You can POST to any Upper ext-* endpoint from a Zap step using Webhooks by Zapier → Custom Request. This lets you create or update records in Upper whenever something happens in another app — for example, adding a new stop every time a job is booked in your scheduling tool.
Set up your trigger
Create a new Zap and configure whatever trigger fits your workflow — for example, a new row in Google Sheets, a new form submission, or a new order in your e-commerce platform.
Add a Webhooks by Zapier action
- Add an action step and search for Webhooks by Zapier.
- Choose the event Custom Request and click Continue.
Configure the request
Fill in the Webhooks by Zapier fields as follows:
| Field | Value |
|---|---|
| Method | POST |
| URL | The full endpoint URL, e.g. https://teamapi.upperinc.com/api/v1/ext-create-stop |
| Data Pass-Through | False |
| Data | Your JSON body (use Zapier's field-mapping to insert dynamic values from earlier steps) |
| Unflatten | yes (lets you write nested keys like custom_fields__order_id using double underscores) |
| Headers | Add one header: Key x-api-token, Value your API token |
| Content-Type | application/json |
Never paste your API token into a public Zap description or a shared template. Use Zapier's Stored Credentials or keep the token in a private step field. See Authentication for guidance on keeping your token safe.
Map the request body fields
In the Data field, construct the JSON body by mapping values from your trigger step. For a worked example creating a stop — using POST /api/v1/ext-create-stop — a minimal body looks like this:
{
"address": "742 Evergreen Terrace, Springfield, IL",
"contact_name": "Homer Simpson",
"phone": "+1 555-636-4444",
"email": "homer@springfield.gov",
"note": "Ring the bell",
"company_name": "Nuclear Plant",
"start_time": "09:00",
"end_time": "17:00",
"stop_duration": 300,
"parcel_count": 1,
"customer_system_id": "JOB-9001"
}In practice, replace the static values with Zapier's field references from the trigger data — for example, map address to the Delivery Address field from your order trigger.
The key parameters for ext-create-stop are:
| Parameter | Type | Required | Notes |
|---|---|---|---|
address | string | Yes | Street address; Upper geocodes it automatically. |
route_id | integer | No | Attach the stop to a route. Omit to create an unscheduled stop. |
contact_name | string | No | Name of the recipient. |
phone | string | No | Phone number; non-digit characters are stripped by Upper. |
email | string | No | Contact email address. |
note | string | No | Free-text note shown to the driver. |
company_name | string | No | Company name for the stop. |
start_time | string | No | Earliest service time (HH:MM or HH:MM:SS). |
end_time | string | No | Latest service time (HH:MM or HH:MM:SS). |
stop_duration | integer | No | Service duration in seconds. |
parcel_count | integer | No | Number of parcels. |
customer_system_id | string | No | Your external identifier for cross-referencing. |
For the full parameter list and all available endpoints, see Stops and Routes.
Test the action
Click Test action in Zapier. Zapier sends the configured request to Upper and shows you the response. A successful response looks like:
{
"code": 200,
"message": "Stop created successfully.",
"data": {
"stop_id": 84213,
"address": "742 Evergreen Terrace, Springfield, IL 62701, USA",
"route_id": null,
"latitude": 39.7817,
"longitude": -89.6502
}
}If Upper returns an error, check:
- The
x-api-tokenheader is present and matches the token in Settings → Webhooks. - The
addressfield is included (it is the only required field). - The
Content-Type: application/jsonheader is set.
Turn on the Zap
Once the test succeeds, turn the Zap on. Every future trigger event will POST to the Upper endpoint and create or update the record.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
Upper returns { "code": 400, "message": "Token is required." } | The x-api-token header is missing | Add the header in the Webhooks by Zapier Headers section with key x-api-token. |
Upper returns { "message": "User not found." } | The token value is wrong or belongs to a different account | Re-copy the token from Settings → Webhooks in Upper and paste it into the Zap header value. |
| Zapier's Catch Hook never receives a test payload | Upper has not fired a webhook to the URL | Make sure you saved the Zapier URL in Upper's Settings → Webhooks, then trigger an event in Upper (e.g. update a stop) while the Zapier test window is open. |
| Stop is created but not attached to a route | route_id was omitted or is null | Map the route_id field from your trigger data, or hard-code it if stops always go to the same route. |