Price accessorials with rate cards
A rate card is a dated, scoped price list for accessorials. Operators never type a rate: they pick a line off whichever card matched the job, and one button turns it into a pending billing charge. This walks through building a card, understanding exactly which card wins when several could apply, and the guards that stop a charge from being created.
8 minute setup · Updated July 27, 2026
Exactly one card is used per job. Cards never merge.
Conterminal ranks every active card and picks a single winner. If your detention rate is on a customer card and your port surcharge is on a destination card, the operator will only ever see the items on the one card that won. Put everything an operator needs on the card that wins.
Cards, scope, and effective windows
Open Billing → Accessorial Rate Cards. The page is gated to a carrier workspace and to the tenant_admin or tenant_manager role. Any other role is redirected to the unauthorized page rather than shown an empty list, so if the link bounces you, it is a role problem, not a data problem.
Every card carries a name, a scope, an effective window, and a status. The scope is the part people get wrong, so read this pair carefully.
- Customer
- A dropdown of your billable organizations. Leaving it on “Carrier default” means the card is not customer-scoped and can serve any customer.
- Destination
- Free text. Blank means “All destinations.” A value here is matched exactly against the job's destination — it is not a substring or keyword search.
- Effective From
- Required, defaults to today. The card applies when the job's service date is on or after this date.
- Effective To
- Optional. Blank means open-ended. When set, the card applies through that date inclusive.
The summary line under each card name restates all of it: customer or Carrier default · destination or All destinations · Effective date · Updated date, with the item count on the right. Read that line before you edit anything — it is faster than re-checking the form fields.
Creating a blank or seeded card
Two forms sit at the top of the page. They behave differently in one important way, so pick deliberately.
Create Blank Card
- Name it. Required. If you submit an empty name the action returns Rate card name is required. and nothing is created.
- Set the scope. Choose a Customer, type a Destination, or leave both alone for a carrier-wide default card.
- Set Effective From. Defaults to today.
- Choose Status. This form offers only Draft and Active, and defaults to Draft. Leave it on Draft until the items are priced.
- Submit. Press Create Blank Card. The new card appears below with No accessorial items yet.
Copy Fairview-Style Card
This seeds nine priced items in one step. The form takes Name (default Fairview Accessorial Card), Customer, Destination, and Effective From, then Create Fairview Card.
A Fairview card is created Active, not Draft.
The seeded form has no status field and the card is written with status active. It is immediately live at the seeded rates for every job it matches. If those are not your rates, change the status to Draft on the card row and press Save Card before you do anything else.
- Chassis Rental
- $40.00 per day, after 2 included days
- Wait Time / Detention
- $75.00 per hour, after 2 included hours
- Pier Detention
- $50.00 per hour, after 2 included hours
- Early Pick-up
- $125.00 flat per occurrence
- Extra Stop
- $125.00 flat per occurrence
- Attempted Pick-up / Dry Run
- $100.00 flat per occurrence
- Overweight Fee
- $75.00 flat per occurrence
- Reefer Surcharge
- $125.00 flat per container
- Port Liberty / Howland Hook Surcharge
- $175.00 flat per container
None of the seeded items has the fuel-surcharge flag set. If the platform catalog is missing any of the codes these items map to, no card is created at all and you get Missing canonical charge types: followed by the missing codes — see the charge-types section below.
Adding items: charge type, unit, pricing rule, included quantity, rate, FSC
The add row sits at the bottom of every card. Fill it and press Add.
- Charge Type. Required. The dropdown opens on Select charge type and lists every active platform accessorial type as Name (CODE). You map to these; you cannot create one.
- Display Label. Optional. This is the text operators and the eventual charge description will show. Leave it blank and it falls back to the charge type's own name.
- Unit. One of container, day, hour, or occurrence. The unit is a label on the quantity — it does not change the math.
- Pricing. One of flat, per unit after included, or manual quote. This one does change the math.
- Included. Free quantity, floored at 0. Only meaningful for per unit after included.
- Rate. Dollars. Dollar signs and commas are stripped; blanks, negatives, and non-numbers are rejected.
- Sort. Defaults to 100. Items display in ascending sort order.
- FSC. A checkbox recording that this item is fuel-surchargeable. Read the warning below before you rely on it.
How each rule computes
- flat
- amount = quantity × rate. The included quantity is ignored.
- per unit after included
- amount = max(0, quantity − included) × rate. A quantity at or below the included amount prices to $0.
- manual quote
- No amount is computed at all. The rate field is allowed to be blank, and nothing downstream can bill it until someone edits an amount onto the attached accessorial.
Rate is required unless the rule is manual quote.
Submitting flat or per unit after included with an empty or invalid rate returns Rate is required for priced accessorials. and the item is not saved. The same check runs when you edit an existing item.
The FSC checkbox does not add money to the charge today.
The flag is stored and carried onto the staged accessorial, but the fuel-surcharge percentage on a staged accessorial defaults to 0 and no screen in the product sets it. The fuel surcharge on the resulting billing charge is therefore always $0. Treat FSC as intent you are recording, not as a calculation, and add fuel surcharge through your normal billing configuration.
Editing an existing item
Each saved item becomes its own inline row with a Save button. The row's label shows the charge type code and name — that is deliberate: the charge type of a saved item cannot be changed. To move an item to a different charge type, add a new item and uncheck Active on the old one. Unchecking Active hides the item from operators without deleting the history behind it.
Draft vs Active
Only cards with status active are ever considered when a job looks for pricing. Draft and archived cards are invisible to operators — they are not ranked lower, they are excluded from the query entirely.
- Draft
- The default for a blank card. Edit freely; no job will price against it.
- Active
- In play. Every edit you make is immediately live for jobs that match this card.
- Archived
- Retired. Available on the card row's status dropdown but not on the create form. Prefer this over deleting a card that has already produced charges.
Change status on the card's own row and press Save Card. If an operator somehow reaches an item on a non-active card, attaching it fails with Rate card is not active.
How a card is chosen when several match
Conterminal loads your active cards, drops the ones that cannot apply, scores the rest, and keeps the single highest score.
Step 1: elimination
A card is dropped outright if it is not active, if the job's service date falls outside its effective window, if it names a customer other than the job's customer, or if it names a destination that is not an exact match for the job's destination. A card with no customer matches every customer; a card with no destination matches every destination.
Step 2: specificity
- Customer and destination both set
- Score 4 — wins
- Customer only
- Score 3
- Destination only
- Score 2
- Neither (carrier default)
- Score 1 — last resort
Step 3: tie-breaks
Equal specificity is broken by the later Effective From date. If two equally specific cards share the same effective-from date, the winner is decided by an internal record-id comparison — deterministic, but arbitrary from your side. Do not build on it. When you re-price, give the new card a later Effective From and close out the old one with an Effective To.
Destination scope rarely matches what you would type.
On a container, the destination the card is matched against is the operation shell's route summary — the leg destination labels joined together — and only if the shell has no route does it fall back to the deliver-to BCO name, then the customer name, then the consignee name. A multi-leg route produces a joined string, so a card scoped to a single terminal name will not match it. Prefer customer-scoped cards unless you have confirmed the exact destination string a job produces.
Two smaller limits worth knowing: matching is case-insensitive and ignores leading and trailing spaces, but is otherwise literal, and only the 100 most recent active cards by Effective From are loaded for ranking. If you are carrying hundreds of active cards, archive the dead ones.
Attaching an accessorial to a job
Operators work from the Accessorials card on the container detail page, or on a cartage job's detail page. Its subtitle states the flow: Stage accessorials on the job shell, then create pending billing charges when they are ready.
The line under it is your diagnostic. Either it reads Active card: followed by the winning card's name, customer, and destination — or it reads No active card matched this shell. Manual accessorial entry is still available. A Manage Cards button links straight back to the rate-card page.
- Pick a rate item. The dropdown shows each active item as its display label, its rate, and — when the item has an included quantity — the phrase after N unit. Only items from the winning card appear, and only those still marked Active.
- Set Quantity. Defaults to 1. This is the only pricing input the operator supplies; unit, pricing rule, included quantity, rate, and the FSC flag are all copied from the card item.
- Set Service Date. Prefilled from the job's pickup date, then its gate-out date, then its scheduled date, then today.
- Choose Bill To. The options are the job's own billable parties — customer, BCO, broker, forwarder, warehouse — filtered to active tenant organizations and shown as Name · role. If there is exactly one candidate it is preselected.
- Press Attach. Add optional Notes first if the charge needs justification later.
For anything the winning card does not cover, expand Add manual accessorial. It exposes the same fields plus Charge Type, Display Label, Unit, Pricing, Included, and Rate, so an operator can price a one-off without a card. Manual rows are labeled Manual instead of Rate card in the list.
Attaching copies the price. Editing the rate card afterwards does not reprice anything already attached to a job. That is intentional — a card change cannot silently rewrite work already staged.
A staged row lands as ready only when it has a bill-to, a service date, a quantity above zero, a rate, and a computed amount. Missing any of those, it lands as planned. Row buttons are Mark Ready, Waive (which zeroes the amount), Void, and — once ready and above $0 — Create Pending Charge.
Materializing it into a billing charge
Create Pending Charge is the moment money exists. It writes a pending unbilled charge carrying the accessorial's display label as the description, its quantity, rate, amount, service date, bill-to, and charge type, then flips the accessorial to billed and locks the row.
The database re-checks everything before it writes. A charge is created only when all of these hold:
- The accessorial status is ready.
- A bill-to organization is set, active, has a party type, and is not a trucker.
- A service date is set and the quantity is above zero.
- Both the rate and the amount are set, and the amount is above $0.
- The underlying delivery order is still active and not superseded, or the underlying cartage job is not cancelled.
- You still have write access to the job shell.
If nothing qualifies, nothing is written and you get No charge was created. Confirm the accessorial is ready, active, and has an amount above $0.
Pressing the button twice is safe.
Each accessorial can own only one non-void charge. A repeat press returns the existing charge rather than creating a duplicate.
After that the row is closed to editing. Attempting to change it returns Billed or void accessorials cannot be edited., and attempting to change its status returns Billed accessorials cannot be changed. Corrections happen on the billing side, against the charge.
Charge types are platform-managed
You map to a charge type. You cannot invent one.
The Charge Type dropdown is the platform's canonical accessorial catalog. Carriers have no screen that adds to it. Only Conterminal platform administrators can create or rename a canonical code, on the Accessorial Catalog page. The count in the rate-card page header — N canonical accessorial types — is that catalog, not yours.
What you do control is the Display Label. Call the charge whatever your customer's contract calls it; the code underneath stays canonical so reporting and invoicing stay comparable across carriers. The platform's own instruction is explicit: use the OTHER charge type for a carrier label that has no canonical code yet, until that code is promoted into the catalog.
If you need a genuinely new canonical code — not a relabeled existing one — email support with the code you want, the plain-English name, and one sentence on what it bills for. Codes are normalized to uppercase with underscores, so ask for PORT_SURCHARGE, not Port Surcharge.
Troubleshooting
The card priced nothing — the operator saw no items
The card is almost certainly still Draft. Blank cards are created as Draft and only active cards are considered at all. Open the card row, set Status to Active, and press Save Card. If it is already Active, check that the items themselves still have the Active checkbox ticked — an unticked item is hidden from operators.
The wrong card won
Specificity beats recency. A customer-and-destination card outranks a customer card, which outranks a destination card, which outranks the carrier default. If the loser is the card you wanted, it is less specific, its effective window does not cover the service date, or its customer/destination does not match the job. Narrow the card you want, or archive the one that keeps winning.
The destination scope did not match
Destination matching is exact after lowercasing and trimming — not a substring or keyword match — and on a container the value being matched is the shell's joined route summary, not a single terminal name. Read the Active card line on the job's Accessorials card to see what actually matched, and prefer a customer-scoped card when the destination string is unpredictable.
No active card matched this shell
The Accessorials card says so directly. Either no active card covers this customer, destination, and service date, or the card that should have covered it is Draft. Manual accessorial entry stays available while you fix the card.
Rate is required for priced accessorials
The pricing rule is flat or per unit after included, and the Rate field was empty or not a valid non-negative number. Enter a rate, or switch the rule to manual quote — but a manual-quote item computes no amount and cannot be turned into a charge until an amount is edited onto the staged row.
No charge was created
The full message is “No charge was created. Confirm the accessorial is ready, active, and has an amount above $0.” Work down the guard list: status ready, bill-to set and an active non-trucker organization, service date set, quantity above zero, amount above $0, and the delivery order still active and not superseded.
Missing canonical charge types
The Fairview seeded card names canonical codes that are not present or not active in the platform catalog. No card is created — the error names the missing codes. Send those codes to support rather than trying to work around them.
The fuel surcharge came through as $0
Expected. The FSC checkbox records that an item is fuel-surchargeable, but the surcharge percentage on a staged accessorial is always 0 today, so the computed surcharge is always $0. Apply fuel surcharge through your billing configuration instead.
The accessorial can no longer be edited
Billed and void rows are locked: “Billed or void accessorials cannot be edited.” and “Billed accessorials cannot be changed.” Once a pending charge exists, correct it on the billing side against the charge, not on the job shell.
Operation shell not synced yet
The job has no operation shell, so there is nothing to stage accessorials against and the panel shows only that line. Wait for the shell to sync, then reload the detail page.