Bill work that is not a delivery order
Not every move starts as a delivery order. A yard shuttle, an hourly crew, a repositioning run, a one-off favor for a customer — Conterminal bills those as a cartage job or a custom job. Both build the same underlying operation shell, so both can carry stops, accessorials, and a Motive-backed trip receipt.
9 minute read · Updated July 27, 2026
Both screens are tenant-admin only.
Admin → Cartage and Admin → Jobs are gated to the tenant_admin role in a carrier workspace. A tenant manager or tenant user cannot open either list or either detail page — see why a page shows Access Denied.
Cartage jobs vs custom job shells
These are two separate records with two separate lists, two separate detail pages, and two different sets of field names. They are not interchangeable, and there is no way to convert one into the other. What they share is the operation shell underneath: both write an operation job, and it is that shell — not the cartage or custom record — that carries the route, the accessorials, and the trip receipt.
- Cartage job
- Lives on the Cartage tab. The Add dialog describes it as “Hourly or non-container drayage work.” Requires a Customer Name. Its route is a list of Stops typed Pickup, Delivery, or Other. Detail page at /protected/admin/cartage/<id>.
- Custom job
- Lives on the Jobs tab. The Add dialog describes it as “Create a non-DO operation shell.” Requires a Job Summary. Its route is a list of Legs typed Pickup, Delivery, Return, Transfer, or Other, plus a Route Shape. Detail page at /protected/admin/jobs/<id>.
A cartage stop and a custom-job leg are the same thing in storage — an operation leg. That is why the two screens behave identically when you reorder them: each stop or leg takes its origin from the previous one's destination, and the first one starts from Current position. Delete one in the middle and the rest renumber and rechain automatically.
Status vocabulary
The two pages spell status differently, which matters when you are reading a screenshot from a coworker. A cartage job shows Start Job and then Mark Completed, and its status pill in the dark page header is the raw status with underscores swapped for spaces — so an in-progress job reads in progress, lowercase. A custom job shows Start and then Complete, and its planning status renders as Intake, Ready, In Progress, Completed, or Cancelled. On a custom job, Add Leg and the per-leg delete button disappear once the job is Completed or Cancelled.
Creating one
A cartage job
- Open the Cartage tab and select Add Cartage Job. The dialog asks for a Customer Organization (optional), Customer Name (required), Customer Reference, Container, Description, Scheduled Date, and Billing Rate. Picking a Customer Organization fills the Customer Name for you. Submitting with the name blank returns “Customer name is required”.
- Set the Billing Rate here, not later. The creation dialog is the only place the cartage Billing Rate field is editable. See the warning below.
- Open the job and add stops. Add Stop asks for Stop Type (Pickup, Delivery, Other), Location Name, and Address. The Add button stays disabled until Location Name has a value.
- Work the stops. Each incomplete stop offers Mark Stop Complete; completed stops get a Completed chip and the card header counts them as 2/3 completed.
Adding stops rewrites two derived fields on the shell without telling you: the route shape becomes Direct 2-leg at exactly two stops and Multi-stop above two, and the shell summary becomes first stop -> last stop. That is expected, not corruption.
The cartage detail page hides the Billing Rate.
The cartage detail page always renders in its split layout, and the Billing Rate field only exists in the non-split layout. So the rate you entered at creation is not shown on the detail page and cannot be edited there. To read it, go back to the Cartage list and look at the Rate column. There is currently no supported way to change it from the UI after creation.
A custom job
- Open the Jobs tab and select Add Job. The dialog is headed Add Custom Job and asks for Job Summary (required), Customer, Route Shape, External Reference, Container, Notes, Scheduled Date, and Billing Rate. An empty summary returns “Job summary is required.” and a non-numeric rate returns “Billing rate must be a valid number.”
- Land on the new job. Unlike the cartage dialog, this one navigates you straight to the new job's detail page.
- Add legs. Add Leg asks for a phase, a Destination label (required — the button stays disabled without it), an address, a requested service date, and notes. A leg with no date inherits the job's scheduled date.
- Edit the rest inline. Edit exposes Summary, Customer, Reference, Freight Customer, Accessorial Customer, Scheduled, Billing Rate, Route Shape, Container, and Notes. Standard 3-leg is offered here even though the creation dialog does not offer it.
Adding the first leg moves a custom job from Intake to Ready; deleting the last one drops it back. Once you have pressed Start, that automatic movement stops.
Attaching accessorials
Custom jobs have no accessorials panel.
The Accessorials card is rendered on the cartage detail page only. The custom-job detail page shows the trip-evidence panel and the job itself, and nothing else — there is no way to stage an accessorial on a custom job from that screen, even though the Edit form still lets you set an Accessorial Customer. If the charge has to be billed, raise it as a cartage job instead.
On a cartage job the panel sits under Motive Trip Evidence and reads “Stage accessorials on the job shell, then create pending billing charges when they are ready.” It works in two halves.
- Attach from the rate card. Choose a Rate Card Item, a Quantity, a Service Date, a Bill To, and optional Notes, then select Attach. This row only appears when an active card resolved for this job; otherwise the header reads “No active card matched this shell. Manual accessorial entry is still available.”
- Or add one by hand. Expand Add manual accessorial for Charge Type, Display Label, Unit (container, day, hour, occurrence), Pricing (flat, per unit after included, manual quote), Qty, Included, Rate, Service Date, Bill To, and an FSC checkbox.
- Move each row to ready. Staged rows carry a status of planned, ready, waived, billed, or void, and a source of Rate card or Manual. Use Mark Ready, Waive, or Void.
- Push it to billing. Create Pending Charge only appears once the row is ready and its amount is above $0. It hands the row to billing as a pending charge.
Which rate card resolves is decided by the customer organization, the service date, and a destination scope taken from the job description with the customer name stripped off the front. If you expected a card and got none, that description text is the first thing to check — see accessorial rate cards.
The Bill To dropdown on a cartage job is built from exactly two sources: the job's linked Customer Org and its Accessorial Customer. If neither is set, the list is empty and the only option is Select bill-to — no error explains why. Edit the job, link a customer organization, and come back.
Once a row reaches billed or void its edit form disappears. Attempting the write anyway returns “Billed or void accessorials cannot be edited.” or “Billed accessorials cannot be changed.”
Reading a Motive trip-evidence receipt
A trip receipt is a one-page PDF that ties a driver's Motive telemetry to this job so you can attach proof to an invoice dispute. On a cartage job the panel is headed Motive Trip Evidence; on a custom job it is headed Trip Evidence and reads “Generate a Motive-backed trip receipt for this custom job.”
- Pick the driver. Every option is suffixed · Motive linked or · No Motive link. Choosing an unlinked driver shows “Name is not linked to Motive yet. Link the driver before generating a trip receipt.” and no trip list loads.
- Pick the trip. The Motive Trip dropdown groups candidates under Matched to operation legs and Other candidate trips. Under the field you get the route, the match reason, and a monospace metrics line such as 42.6 mi | 1h 18m drive | 45m dwell. If exactly one trip comes back it is selected for you.
- Generate. The button reads Generate Trip Receipt the first time and Regenerate Trip Receipt afterwards. Regenerating replaces the stored artifact.
The trip day is not a field you set. It is derived from the requested service dates on the job's legs, falling back to the job's scheduled date, and it is what the panel means by “No Motive trips found for March 4, 2026”. If the day is wrong, fix the leg dates or the scheduled date and reopen the panel.
What the PDF contains
The document is titled Trip Evidence with an ELD Verified badge. Its meta grid carries Job Reference, Driver / Vehicle, Motive ID, Trip Date, Total Distance, Total Duration, Destination Dwell, Operation Shell, Container, Photo Evidence, and Generated. Operation Shell reads Cartage or Custom Job, which is how you tell at a glance which screen the receipt came from. Job Reference falls back through the cartage customer reference, then the shell's external reference, then the raw shell ID — a bare UUID there means neither reference was filled in.
Below that, Evidence Timeline lays out three phases — Trip Start, Arrival, and Departure — with a Transit card between the first two and a Dwell card after arrival. The dwell card's second line tells you where the number came from: Exited geofence when a mapped terminal geofence supplied it, Departed when it came from the gap to the driver's next trip, and No geofence exit detected or No downstream departure detected when neither was available. A phase with no known address prints Location unavailable. Finally, Evidence Notes records the queried date window, the selected trip, and the geofence timestamps behind the dwell.
The naming is inconsistent and it is the same file throughout. The panel calls it a Motive trip receipt, the artifact card on the cartage page calls it an ELD Trip Receipt, and the viewer sidebar lists the Document Type as ELD Trip Receipt. Do not go looking for a second document.
On a cartage job, Open Receipt Viewer splits the page into the rendered PDF beside its fields, with Close Viewer and Download PDF controls and a Fields / Document toggle on narrow screens. A custom job has no split viewer — only View Receipt and Download PDF, which open the document route directly.
Telemetry-only vs receipts with photos
Telemetry and photos come from two different Motive credentials. Distance, duration, dwell, and the timeline need only the Motive API key. Dashcam breadcrumb photos need a stored Motive web session as well, configured separately under carrier integrations. With the API key alone, every receipt you generate is telemetry only — and that is a normal, complete receipt, not a failure.
- Photos attached
- At least one breadcrumb image was found and embedded. The panel appends the count, and the PDF's Photo Evidence field reads “3 attached.”
- Telemetry only
- No photos. Either no web session was stored, or the stored one was rejected, or the fetch returned nothing usable for that vehicle and day. The receipt is still generated and still valid.
- Photo capture failed
- The photo fetch itself errored for a reason other than authentication. The PDF prints “Attempt failed.” Regenerate before escalating.
- Unknown
- No receipt has been generated for this job yet, so no photo attempt has been made. The PDF equivalent is “Not attempted.”
At most three photos land on a receipt — one for each timeline phase, labeled Start of trip, Arrival at destination, and Departure from destination. Conterminal picks the capture closest to each phase's timestamp inside the trip window, so a trip with dozens of breadcrumb images still produces three. A phase with no usable capture simply has no photo card.
“Telemetry only” hides two different causes.
A Motive web session that was never configured and one that has been rejected both land on Telemetry only. The panel gives you no way to tell them apart. If you expected photos and repeated regeneration keeps producing a telemetry-only receipt, treat it as a credential problem and check the Motive web session under carrier integrations rather than blaming the driver or the trip.
When a receipt is produced with no photos the panel says so explicitly: “Trip receipt generated without photos. Telemetry evidence is attached.” A normal success says “Trip receipt generated and attached to this operation job.”
Where these jobs do and do not appear
- Where they do appear
- Cartage jobs on the Admin → Cartage tab and their own detail page; custom jobs on the Admin → Jobs tab and their own detail page. A generated receipt is stored as a job document on the shared operation shell and is reachable from either detail page.
- Where they do not appear
- Neither is a delivery order. They are not containers on the container dashboard, they carry no Last Free Day or per-diem watch, they do not pass through document review, and they have no electronic proof of delivery.
The lists themselves are deliberately thin. The Cartage table shows Job, Customer, Scheduled, Rate, and Status — the Job column shows the container number, or No container in italics when there is none. The Jobs table shows Job, Customer, Shape, Scheduled, and Status. Neither list is searchable or filterable, so keep the Customer Reference or External Reference field populated; it is the only per-row identifier you get.
Older cartage rows created before the operation shell existed show a red Shell missing badge and the note “Open detail to rebuild the shell.” Their detail page hides the Stops card entirely and offers a Rebuild Shell button instead. Rebuild before you try to edit anything about the route.
Both delete paths are immediate and confirm only with a browser dialog — “Are you sure you want to delete this cartage job?” and “Are you sure you want to delete this custom job?”. There is no undo and no archive, and a deleted cartage job takes its stops with it.
Troubleshooting
The receipt has no photos
The Photo Evidence field reads “Telemetry only” whenever no Motive web session is stored, the stored one was rejected, or no breadcrumb image was usable for that vehicle and day. The API key alone never produces photos. Confirm a Motive web session exists under carrier integrations, then regenerate. If the field reads “Photo capture failed” instead, the fetch errored rather than being refused — regenerate once before escalating.
The charge type I need is not in the list
The manual accessorial Charge Type dropdown lists only charge types that are active and carry the accessorial billing role. A charge type that exists for freight or for another billing role will never appear here. Ask a platform administrator to add or reactivate an accessorial charge type; you cannot create one from the job page.
There are no rate card items to attach
The Attach row only renders when an active rate card resolved for this shell, which needs a matching customer organization, a service date inside the card's effective window, and a destination scope that matches. When nothing resolves, the panel says “No active card matched this shell. Manual accessorial entry is still available.” Use the manual form, or fix the linkage and reload.
The Bill To dropdown is empty
On a cartage job the Bill To list is built only from the job's linked Customer Org and its Accessorial Customer. With neither set you get just “Select bill-to” and no explanation. Edit the job, set Customer Org or Accessorial Customer to an active organization, then reopen the panel.
“Operation shell not synced yet.”
The Accessorials card is showing its empty state because the cartage job has no operation shell. This is the same condition as the Shell missing badge in the list. Use Rebuild Shell at the top of the detail page, then reload.
“Shell missing for this cartage job”
A legacy cartage row exists without an operation shell, so stops, accessorials, and trip evidence are all unavailable. The page explains it as “This legacy cartage row does not currently have an operation shell. Rebuild the shell before editing stops or route state.” Select Rebuild Shell.
“No Motive trips were found for [date].”
The driver returned no trips for the derived trip day. That day comes from the requested service dates on the job's legs, falling back to the job's scheduled date — it is not something you pick in the panel. Correct the leg dates or the scheduled date, reload the page, and reselect the driver.
“Select the Motive trip you want to attach.”
More than one candidate came back and none is selected. Choose one from the Motive Trip dropdown — prefer an entry under “Matched to operation legs” over one under “Other candidate trips” — then generate.
“The selected driver is not linked to Motive.”
The driver record has no Motive driver ID, so no trips can be listed. Link the driver in driver management first; nothing on the job page can fix it.
“Motive API key is not configured for this tenant.” / “Platform access has not been enabled for Motive on this tenant.”
Neither is a job problem. The first means your workspace has no stored Motive API key; the second means Motive has not been enabled for the workspace at all. Both messages link to Open carrier integrations. Telemetry cannot be fetched until both are in place.
“Create Pending Charge” is missing on a staged row
That button only renders when the accessorial's status is ready and its amount is above $0. Mark the row ready, and check that its rate and quantity actually produce an amount — a manual_quote row with no rate stays at no amount. If the action does run and nothing is created, you will see “No charge was created. Confirm the accessorial is ready, active, and has an amount above $0.”
I cannot find the cartage billing rate on the job page
It is not there. The cartage detail page renders in its split layout, which omits the Billing Rate field, so the rate is visible only in the Rate column of the Cartage list and settable only in the Add Cartage Job dialog. Accessorials are the supported way to add money to an existing cartage job.