Apply the right rate to every job without rebuilding a spreadsheet.
Bulk haulage rates do not fit parcel pricing models. This one is built for bulk.
Parcel TMS platforms charge per consignment or per stop. Bulk haulage pricing is based on weight moved, loads completed, hours worked or fixed job rates — and the same job type might carry a different rate for Client A versus Client B. A construction aggregate client on a long-term contract gets a different per-tonne rate to a one-off civils project. When you also use subcontractors, you need to track what you charge the client and what you pay the sub — on the same job record.
HaulageOps rate management is built for this. It handles four rate structures, supports individual client rate cards, allows rate changes to take effect on future dates without breaking historical records, and stores the client charge rate and subcontractor pay rate separately on every job.
The four rate structures
- Per-tonne: charge based on weight delivered — the most common bulk haulage rate type for aggregates, fill, and construction materials
- Per-load: flat rate per trip completed — useful for standard runs where load weight is consistent
- Hourly: rate based on time — used for plant movements, standby, site work or variable-duration jobs
- Fixed-fee: agreed fixed price per job regardless of weight, time or loads — used for project-based pricing or long-distance one-off movements
A single client may use different rate types across different job types — per-tonne for aggregate delivery, hourly for site preparation support, fixed-fee for a one-off long-haul move. All are managed within the same rate card for that client.
Client: "Balfour Beatty Civil Engineering"
| Rate Type | Description | Unit | Client | Sub Pay | Effective | Status |
|---|---|---|---|---|---|---|
| Per-Tonne | Type 1 Crushed Aggregate | tonne | $18.50 | $14.00 | 01 Jan 2026 | Active |
| Hourly | Plant Support | hour | $145.00 | $110.00 | 01 Jan 2026 | Active |
| Per-Load | Standard 10-tonne Run | load | $210.00 | $165.00 | 01 Mar 2026 | Scheduled |
Scheduled row shown in a different colour to indicate it is not yet active.
Different clients, different rates. Managed per client — not per job.
Maintaining different rates for different clients on a spreadsheet requires either a separate tab per client or a lookup formula that breaks whenever the structure changes. HaulageOps stores rate cards at the client level. When a job is created for a client, the applicable rates are available from the client's rate card and applied automatically — no manual lookup, no chance of applying the wrong rate.
Rate card per client
Each client company in HaulageOps has their own rate card. Rates are set per job type and rate structure for that specific client. Client A's per-tonne aggregate rate has no bearing on Client B's rate for the same service.
Rate confirmation before dispatch
Before a job is dispatched, the rate applied to that job is confirmed in the system. Dispatchers can see what rate has been attached. This prevents a job from being dispatched without a rate — which would create billing problems downstream.
Client sees their rate card
The rate card set for a client in HaulageOps is the same rate card visible to that client in their portal. There is no separate version to maintain — the rate in the system is the rate the client sees. Rate disputes caused by emailed spreadsheets going stale are eliminated.
Rate changes in future without breaking historical records.
When you negotiate a new rate with a client that takes effect from the first of next month, you do not want to edit the current rate and accidentally apply the new price to jobs already completed at the old rate. Effective dating in HaulageOps lets you set a future start date on a new rate. Until that date, the existing rate applies. From that date, the new rate activates automatically.
How effective dating works
- Create a new rate with a future effective date — old rate remains active until then
- On the effective date, the new rate becomes the active rate for new jobs
- Jobs completed at the previous rate retain the rate at which they were created
- Historical financial records are not affected by rate changes made after the job is completed
- Rate history is visible in the rate card — you can see when each rate was active
This is important for financial integrity. An invoice for a job completed in January must reflect the rate active in January — even if you are raising that invoice in March and a new rate has since been set.
Practical use cases
- Annual rate review: set new rates before the end of the current period, effective 1st of the new year
- Project-based pricing: set a specific rate for the duration of a construction project with a defined end date
- Fuel levy adjustments: create a new rate with updated per-tonne pricing from the applicable date
- Contract renewals: update rates when a contract is renewed without disturbing historical billing records
See how contracts connect to rates: Contract Management — contracts in HaulageOps can carry their own rate schedules and auto-expiry alerts.
Client charge rate and subcontractor pay rate — separated on every delegated job.
When you delegate a job to a subcontractor, two commercial transactions are happening simultaneously: you are charging your client, and you are paying your subcontractor. The difference between these two figures is your margin on that job. HaulageOps stores both rates on the same job record, keeps them completely separate, and ensures neither party sees the other's rate.
Client charge rate
The rate you charge the client for the job. Comes from the client's rate card. Applied to the invoice generated for the client. Visible to your admin and finance team. Visible to the client in their portal. Never visible to the subcontractor.
Subcontractor pay rate
The rate you pay the subcontractor for completing the job. Set in the subcontractor's rate or agreed at job delegation. Visible to the subcontractor in their portal. Used for your cost tracking and margin reporting. Never shown in the client-facing invoice or client portal.
Margin in the system
The margin between client charge and subcontractor pay is tracked within HaulageOps financial reporting. It never lives in a spreadsheet column, never requires mental arithmetic, and is never at risk of being accidentally disclosed to either party through a shared document or email.
What rate management on a spreadsheet actually costs you.
| Rate management scenario | Excel rate sheet | HaulageOps |
|---|---|---|
| Different rate per client for same service | Separate tab or lookup formula — breaks on restructure | Separate rate card per client, auto-applied at job creation |
| Rate change taking effect next month | Edit cell now, hope no one applies it to current jobs | Set new rate with effective date — old rate stays active until then |
| Subcontractor pay vs client charge | Two columns in a spreadsheet someone emails around | Dual rates on every job — isolated per portal, private by default |
| Check what rate was applied to a past invoice | Find the version of the spreadsheet from that date | Rate is stored on the job record — visible in invoice and audit trail |
| Dispatcher applies wrong rate to job | Possible — rate is looked up manually | Rate auto-applied from client rate card — requires deliberate override |
| Client queries their rate | Email them the spreadsheet — which may be outdated | Client views live rate card in their portal — always current |
| Rate feeds through to Xero invoice | Manual re-entry into Xero or export step | Rate on job record flows through to invoice, synced to Xero |
Rate management connects to these platform areas.
Billing & Invoicing
Rates set in the rate management module flow directly into invoice generation. When a job is completed, the invoice is built using the rate attached to the job record — no re-entry, no rate lookup, no manual calculation.
Xero Integration
Invoices carrying the job rate sync to Xero via OAuth2. The rate, quantity and job detail go across with the invoice. Payment events from Xero update the job record back in HaulageOps. No double-entry of rate information.
Contract Management
Contracts in HaulageOps can carry rate schedules. When a contract is set up with a client, the rates in that contract can be linked to the client rate card. Contract expiry alerts ensure rate cards are reviewed when contracts come up for renewal.
Also see: Rate & Contract Management — the operational case for keeping rates in the system rather than on a spreadsheet.
Frequently asked about HaulageOps rate management.
Can I have different rates for the same service type across different clients?
Yes — this is the core design of the rate management module. Each client has their own rate card. You set the rate for each service type (per-tonne aggregate delivery, hourly plant support, etc.) independently for each client. There is no global rate that all clients share — every rate card is client-specific. This means Client A's per-tonne aggregate rate has no effect on Client B's rate for the same service.
What happens if a rate changes halfway through a long project?
Use effective dating to handle this. Create a new rate with an effective start date matching the point at which the new rate applies. Jobs created before that date use the original rate. Jobs created on or after the effective date use the new rate. Historical jobs and their invoices retain the rate that was active when they were created — no retroactive changes occur. This is important for invoices already raised and for financial record integrity.
How does Xero see the rate on an invoice?
When an invoice is generated from a completed job in HaulageOps, it carries the rate, quantity and calculated value from the job record. This invoice is then pushed to Xero via the OAuth2 integration. The rate type, unit and amount appear as line items on the Xero invoice — no manual re-entry required. If a job is per-tonne, the tonnage and per-tonne rate appear as the invoice line. If hourly, the hours and hourly rate appear. The Xero invoice is built from the job record, not manually constructed.
Can a dispatcher change the rate on a job before dispatch?
Rates are applied automatically from the client rate card when a job is created, but the system allows the rate to be reviewed and adjusted before dispatch confirmation if a job requires a different rate. Any rate override is logged in the audit trail with the user identity and timestamp. This creates an auditable record if a rate is ever queried — you can see whether the rate on a completed job matches the client rate card or was overridden at dispatch.
Does the subcontractor see the rate I charge the client?
No. The client charge rate and the subcontractor pay rate are stored separately on the job record, and each portal shows only the relevant rate. The subcontractor portal shows the subcontractor pay rate only — the client charge rate and your margin are never visible to the subcontractor. The client portal shows the client charge rate only — the subcontractor pay rate is never visible to the client. Both rates are visible internally to your admin, dispatch and management users.
What rate types does HaulageOps support?
HaulageOps supports four rate structures: per-tonne (charge per unit of weight), per-load (flat rate per completed trip regardless of weight), hourly (rate multiplied by time worked), and fixed-fee (an agreed price for the job regardless of weight, loads or time). A single client rate card can include multiple rate types for different service categories — per-tonne for aggregate delivery, hourly for plant support, fixed-fee for a specific one-off project movement.