Billing

Publish a quote form on your own website

Quote Engine is the carrier-admin screen for website quoting and partner API access. It controls one pricing configuration, the hosted form and embed, and scoped API credentials. Quote Manager is the separate operating queue where admins and managers work internal, RFQ, API, and website quote intake.

14 minute setup · Updated September 9, 2026

This screen is carrier-only.

Quotes opens only for a trucking workspace, and only for a tenant admin or tenant manager in it. Any other workspace type or role is redirected to /protected/unauthorized. A Conterminal platform admin reaches it too, but is first shown a Carrier quotes picker — “Select one carrier before opening quote settings or customer submissions.” — and afterwards gets a Change carrier button in the header.

Rates, rules, and profile

The page is titled Quote Engine and carries a Live or Draft badge next to your workspace name, plus the public path it will serve, shown as /quote/your-slug. Use Rates and rules for pricing, customer-facing profile settings, optional services, and truck dimensions. Use Website and API for API credentials, installation, and notification routing.

Rates and rules

Set the fallback rate per mile, minimum charge, and effective dates first. Then select the toll treatment and fuel-surcharge method. The form shows a toll markup only for Pass through with markup. It shows the fuel percentage only for Fixed percent of drayage, and shows the DOE baseline and truck MPG only for Weekly DOE diesel index. Save the complete pricing, profile, services, and routing setup with Save rates and rules. Partial saves are not possible: if any field fails validation, nothing is written and the banner reads “reason. No configuration changes were committed.”

Customer experience and branding

Open Brand, contact, and quote limits to edit identity, customer contact, the embed allowlist, and quote limits. Keep this section closed when you only need to change rates.

Display name
The carrier name shown in the widget header and in every quote email. Also used to build the iframe title in the embed snippet. 160 characters maximum.
Public slug
The last part of your public URL. Lowercase letters, digits, and interior hyphens only, 63 characters maximum. “confirm” and “embed” are reserved and rejected with “Public slug is reserved by the quote service.”
Contact email
Required. Shown to the visitor as the destination of their quote, and used as the reply-to address on the copy the visitor receives.
Logos
Optional HTTPS URLs. Provide one dark-artwork logo for light backgrounds and printed quotes, and one light-artwork logo for dark backgrounds. The existing logo remains the fallback when only one asset is configured.
Accent color
A six-digit hex color, defaulting to #E86A2A. It tints the top rule of the widget header and the primary buttons.
Quote expiration (days)
1 to 30, default 7. The visitor sees the expiry date in the quote summary and it appears in the Expires field on the review page.
Maximum segments
1 to 5, default 5. This is the number of pickup-and-delivery legs a visitor may add in one quote. The platform ceiling is 5 and cannot be raised here.
Customer disclosure
Free text printed under the quote summary and in the emails. Defaults to “This quote is an estimate and remains subject to carrier review.”

Tolls and fuel

Toll policy is Pass through, Included in base quote, or Pass through with markup. The Toll markup (%) field is only kept when you pick the markup option — in the other two modes it is forced to zero on save regardless of what you typed. Toll transponder chooses between No transponder / cash rates and All supported transponders, which changes the toll figures the routing provider returns.

Fuel surcharge has three modes: No public FSC, Flat % of base linehaul, and DOE/EIA weekly diesel index. Flat FSC (%) is, like the toll markup, zeroed unless flat-percentage mode is selected. DOE mode uses the two fields beneath it, and the screen states the formula outright: (weekly price − baseline) ÷ MPG × route miles, with a default baseline of $1.75 per gallon and 6 MPG.

DOE mode needs a live diesel index feed. If that feed is not configured on the server, saving a live engine or publishing fails with “Public quote engine is missing EIA_API_KEY for DOE-indexed fuel surcharge pricing.” You cannot fix that from this screen — either switch the mode to flat or none, or contact Conterminal Support.

Published optional services

This section does not create rates. It picks which items from your existing default accessorial card a website visitor may add to a quote. If you have not built one, the panel says “Create and activate a default accessorial card with no customer or destination scope, then return here to publish its items.” Use the Manage rates link to reach accessorial rate cards — a card scoped to a specific customer or destination is deliberately ignored here, because a public visitor has no customer identity.

An item is selectable only if it has a rate or is priced by manual quote; anything else is greyed out and shows Manual in the amount column. Manual-quote items are visible to the visitor as “Price confirmed by carrier review” rather than a dollar figure.

Truck profile

The Public truck profile is what makes the route truck-legal: the routing provider uses the complete set of dimensions and weights to keep the route off restricted roads and under low clearances. Defaults describe a day cab with a 40-foot chassis — 410 cm high, 260 cm wide, 1900 cm long, 5 axles, 28,000 kg current and 36,000 kg gross, 8,000 kg per axle, 1 trailer. Current weight above gross weight is rejected with “Current weight cannot exceed gross weight.”

The mileage fallback at the top of the page prices a lane when no exact site rate or zone rate applies. Local base / minimum covers the number in Miles included. The Additional-mile rate applies only to route miles above that allowance. The formula is local base plus additional miles multiplied by the additional-mile rate. The additional-mile rate must be greater than zero; the local base and included miles may be zero. The effective-through date is optional but cannot precede the start date.

Dispatch still confirms the route.

A general truck-restriction notice from the routing provider does not stop an otherwise complete quote. Conterminal keeps the priced route and shows Confirm truck routing before dispatchso dispatch can verify the final legal route for the assigned equipment. A missing route, unavailable toll data, an overweight profile, or another unknown critical routing notice still requires review before pricing can proceed.

Known lane multipliers

A known lane rule changes only the mileage-derived mainline amount. An exact site or zone rate takes precedence. The verified destination must fall inside the rule's match radius, and the nearest rule must lead the next-nearest rule by the configured ambiguity buffer. An ambiguous match is sent for manual review instead of changing the price.

Enter the lane name, coordinates, radius, ambiguity buffer, multiplier, and effective dates. Keep imported or analyst-pending rules at Pending review. Only active rules marked Approved affect quotes. The saved quote records the matched rule, distance, and multiplier used for pricing.

Saving while the engine is live pauses it during the write and republishes only after the database validates the complete setup. You will see “Configuration saved and the quote engine was republished.” instead of the plain “Configuration saved.” A save that fails validation leaves the previously published configuration untouched.

Publishing and unpublishing

The Publish and Unpublish button sits in the top right of the header, opposite the Live/Draft badge. It is a single toggle. Publishing flips both the enabled and published flags on; unpublishing turns both off, and the public page stops resolving immediately — anyone who loads it gets Quote page unavailable with “This carrier's quote engine is not available.”

  1. Save a complete configuration first. Publishing before there is a settings row fails with “Save configuration before publishing.”
  2. Select Publish. On success the banner reads Quote engine published. and the badge changes to Live.
  3. Load the hosted page yourself before you touch your website. The installation panel says exactly this: “Live configuration. Test the hosted page before installing the embed.”

Some publish failures are not yours to fix.

Publication also checks that the platform's own quoting services are configured — the routing provider, the address validation provider, the outbound email worker, and a request-hashing secret. When one is missing the banner names the missing keys directly, for example “Public quote engine is disabled or missing: HERE_API_KEY.” Those are server environment settings. Address validation also happens on Conterminal's server rather than in the embedded browser form. Nothing you change on this form will clear a missing provider setting; send the exact banner text to Conterminal Support.

Unpublishing is the correct move while you rework rates. It does not delete quotes already submitted, and the review queue keeps working.

Notification routing

The Quote notifications panel has two independent lists, and they do different jobs. Getting them backwards is the most common reason a carrier believes quotes are not arriving.

Approval request users
Checkboxes over your current carrier admins and managers. These people get the “Approval requested” email when a visitor submits, because they are the people who can actually open the quote and act on it. Between 1 and 20 must be selected.
Confirmation recipients
A free-text list, one address per line. These addresses receive the line-item quote after it has been approved or declined — the record copy, not the work item. Between 1 and 20 addresses.

The Save recipients button is disabled until the configuration has been saved at least once and at least one carrier admin or manager exists. With no eligible users the list reads “Add a carrier admin or manager before assigning quote approvals.” — grant someone the tenant admin or tenant manager role in this workspace first. Success is confirmed with “Quote notification recipients saved.”

The visitor always gets their own copy at the email address on the quote, regardless of these two lists. That is stated on the panel: “Customer submission receipts are always sent separately to the customer email on the quote.”

Until approval routing has been configured, the approval-request email falls back to the confirmation list plus your contact email, so submissions are not lost while you are still setting up. Removing someone's admin or manager role silently removes them from the approval recipients on the next send — the routing is re-checked against live roles every time, not frozen at save time.

API access and credentials

The API access panel lives on the same Website quotes page as the public configuration. Website publication and direct API availability are separate: you can enable API quoting while the website remains unpublished. If the website is live, unpublish it before pausing the API.

GET /api/v1/quoting/config
Returns the carrier profile, current pricing configuration, and supported optional services. The credential needs read access.
POST /api/v1/quotes
Creates an idempotent commercial quote. A create credential can retrieve the result later with GET /api/v1/quotes/{quoteId}.
Bearer credentials
Choose a name, read or create scope, and optional expiration date. The full credential is shown once; Conterminal retains only the safe prefix and hash.

Copy a new credential directly into the partner's secret store. Never place it in browser code or a URL. If it is lost, create a new credential and revoke the old one; the one-time value cannot be recovered. Revocation immediately stops integrations using it.

Embedding the widget on your site

The Website installation panel gives you two things: a Hosted quote page link you can share or link to directly, and a Responsive embed snippet for putting the form inside one of your own pages. Copy the snippet from the panel rather than retyping it — every value in it is derived from your slug and display name. For a carrier with the slug acme-trucking it looks like this:

<div id="acme-trucking-quote"></div>
<script
  async
  src="https://www.conterminal.com/quote/embed/acme-trucking"
  data-target="acme-trucking-quote"
  data-title="Freight quote from Acme Trucking"
></script>

Paste both lines into your page HTML where the form should appear. The loader script creates a full-width iframe pointing at your quote page and appends it inside the div named by data-target. The frame starts at 980 pixels tall and then resizes itself as the visitor adds segments, clamped between 480 and 3000 pixels. It has no border and no visible chrome of its own.

  1. Keep the div above the script. The tag is async, so it can run before the rest of the page has parsed. If the target div has not been parsed yet, the loader falls back to inserting the frame immediately after the script tag instead. Reordering the two lines is the usual cause of a quote form appearing in the wrong place.
  2. Do not edit the src. Only data-title is safe to change — it becomes the iframe's accessible title and is truncated to 120 characters. Changing the slug in the URL without changing it in Conterminal breaks the embed.
  3. Allow the Conterminal origin in your CSP. If your site sends a Content-Security-Policy, it must permit the Conterminal origin in both script-src (to load the loader) and frame-src (to load the quote page). A missing frame-src is silent: the script runs, the iframe is created, and nothing renders.
  4. Hook the completion event if you want analytics. When a visitor finishes, the frame dispatches a bubbling conterminal:quote event whose detail carries a status of verification_requested or submitted. Listen for it on your container div. No customer data, email address, or session token is included.

The “Allowed embed origins” field does not restrict anything today.

The field validates and saves what you type — one HTTPS origin per line, no paths, up to 20 — and the panel copy implies your site must be allowlisted before the frame will load. It does not work that way right now: the saved list is not turned into a frame-ancestors policy anywhere in the running application, so the quote page can be framed from any site. Fill it in for accuracy, but do not treat it as an access control, and do not spend time debugging a blank embed on the theory that your origin is missing from it.

The loader itself is served with no-store caching at every layer, so a Conterminal deploy reaches your visitors on their next page load without any action from you. The snippet is also safe to place on more than one page.

Managing quotes after intake

Carrier admins and managers open Back Office, then the Quoting subsection, then Quote Manager. Its queue shows Quote, Prospect / customer, Source, Lane / service, Owner, Value, Stage, and Action. Source filters distinguish internal, RFQ, partner API, and website intake.

  1. Create a priced internal draft. Select New Quote. The Move step first opens a shipment panel for import, export, or local; container quantity, size, type, chassis, cargo, weight, hazmat, references, and instructions. For an import, also set the number of delivery stops and whether the container returns empty. New imports default to one delivery and an empty return to the pickup terminal. Confirm those facts, then fill the ordered locations on the map. The shipment summary stays visible as you choose stops. Export defaults model the full empty-out and loaded-in cycle: terminal empty pickup, customer drop, customer loaded pickup, then loaded terminal return. When loading occurs at one shipper stop, the three-location route is labeled empty pickup terminal, shipper / load container, and loaded return terminal. A route ending with a terminal return uses one base linehaul group across its physical legs. Tolls and distance-based fuel remain attached to each leg; the Price step shows the sum of the persisted priced toll lines. A flat percentage fuel surcharge applies once to the group. For an early internal estimate, select a city or named place, including an export shipper stop, and calculate a price without its exact street address. Known terminals selected from the directory use their server-resolved address and map location; they do not need a suite or entrance added just to calculate an internal quote. A complete street selected through HERE can also remain priceable if Google cannot confirm it. Conterminal keeps the selected HERE location as preliminary instead of asking you to choose a different address just to get a rate. Use Recheck exact address to retry verification of the same street when ready. Conterminal marks an unverified street, city, or place stop as preliminary and keeps the warning with the quote. Before the quote can be accepted, revise it and replace every preliminary stop with a validated street address. The public quote form continues to require complete addresses. Then select a HERE truck route, choose services, and select the customer, service date, truck profile, and owner. The selected company appears immediately while saved contacts load; New contact remains available. Move, Services, Customer, and Price remain editable while you work. The Price step recalculates from the current inputs and keeps the last valid estimate visible while an update is in progress or fails. A manual customer rate does not change when the reference estimate changes. Conterminal keeps the complete calculator draft in the current browser tab, including the active step, so a reload does not discard the work. It creates or revises the durable quote only when you save the customer rate. Quote managers may then override an accessorial for that saved revision; saving the override immediately recalculates the estimate while retaining the original rate-card price and the required reason. Preview the customer quote after setting the customer-facing rate. The carrier comes from your signed-in workspace; there is no carrier field to override.
  2. Start from an RFQ. A carrier admin or manager opens the RFQ in Document Review, confirms the commercial facts, and selects Create unpriced quote draft. Conterminal opens the same New Quote wizard with those facts prefilled. Luna extraction is not connected in this release, so the reviewer must verify the fields before creating the opportunity.
  3. Start from request text or a selected email. In the Conterminal ChatGPT app, describe the request in plain language. In Gmail or Outlook Web, use the Conterminal Mail Chrome extension and choose Quote request. Conterminal creates a best-effort internal draft. The ChatGPT app returns its link; extension v1.0.18 accepts the request for background processing and emails the submitting user a draft link or a failure reason. Partial requests are allowed and show the missing facts that a user must complete. This intake does not calculate or approve pricing, queue an outbound response, or contact the original requester. Gmail requests with saved mailbox context also offer Open original in Gmail in the builder and Quote Manager, including when revising a quote. The link opens a new tab and does not grant access to another user's mailbox.
  4. Receive partner API quotes. Successful API requests create or replay the same tenant-scoped commercial quote record and can be retrieved with the quote ID. Idempotency prevents a partner retry from creating a duplicate.

The saved revision keeps the movement facts and ordered stops with the immutable priced route. When that revision is later accepted, Conterminal creates one hidden draft delivery order per container and links each draft back to the quote. Operators can complete container numbers, appointments, and other delivery-order facts without re-entering the shipment from scratch.

Reviewing website submissions

The website Review queue remains on the Website quotes screen and shows the 100 most recent submitted, under-review, approved, and declined quotes, newest first. Columns are Quote, Customer, Service, Total, State, and a Review link. A quote the engine could not price automatically shows Manual review in the Total column instead of a dollar figure. Empty state: “No submitted quotes yet.”

The detail page is headed by the reference number and status badge and shows the customer, email, phone, and expiry, then Submitted segments with the verified origin and destination, truck miles and drive time, the rate source used, and a per-leg total. Selected accessorials lists what the visitor added. An Immutable submitted snapshot section holds the exact priced payload the customer saw.

  1. Triage. While the quote is still submitted, Mark under review claims it without telling the customer anything. That button disappears once the quote is already under review.
  2. Record internal notes. The Internal notes box is for your team. It is stored with the review outcome and shown back on the completed panel.
  3. Approve or decline. Approve estimate and Decline are both terminal. Either one queues the line-item confirmation email to your confirmation recipients and the banner reads “Quote review updated and confirmation queued.” The review form is then replaced by a read-only Review complete panel.

A quote flagged for manual pricing has no Approve estimate button at all — only Mark under review and Decline. Its price breakdown is replaced with “This route requires manual pricing. Partial calculations are intentionally hidden until review is complete.” That is deliberate, not a bug: the system will not let you approve a number it never calculated. Quote that lane outside Conterminal and reply to the customer directly.

Nothing on the review page can change the price. The panel says so: “The submitted price and line items cannot be edited.” The submitted quote is the record of what the customer was shown, and it stays that way.

Verifying the embed works

Test the hosted page before the embed, and test a full submission before you announce the form. Half of all embed reports are actually an unpublished or incomplete configuration.

  1. Open the hosted page. Use the Hosted quote page link in the installation panel. You should see your carrier name, your logo or accent square, and the words Online freight quote. If this page fails, the embed cannot work — fix it here first.
  2. Price a real lane. Pick a truck profile and service date under Route details, fill in the pickup and delivery addresses, then select Calculate quote. Conterminal automatically accepts a provider result when only casing, punctuation, a standard street suffix, ZIP+4, or the country label changed. A different street number, street name, unit, city, state, or ZIP still appears as a Route-step correction that you must accept. Conterminal keeps the secondary line separate and does not duplicate it in the street address. The summary should break out base route, terminal fees, tolls, fuel surcharge, and additional services.
  3. Submit as a customer. Under Verify and send this quote, enter a real name and a mailbox you can open, then select Confirm email and send quote. Open the one-time link in the email and complete the confirmation.
  4. Confirm it landed. The quote should appear in the review queue with the reference number the widget showed you. Decline your own test quote so it does not sit in the queue.
  5. Now load your own page. The frame should be full width and grow taller when you add a second segment. The Conterminal wordmark appears in the widget footer.

Nothing reaches you until the visitor clicks the emailed link.

After the contact form the widget shows “Confirm your email to send this quote” and states plainly that “The carrier has not received the quote yet.” An unconfirmed quote never enters the review queue and never generates an approval email. The one exception is a visitor already signed in to Conterminal with a confirmed matching address, who skips the email step and sees Send quote to carrier instead.

Troubleshooting

Blank space where the widget should be

Two causes, in this order. First, the slug in the script src is malformed — the loader returns a 404 with the body “/* Invalid carrier quote slug. */” and no iframe is ever created, leaving your empty div behind. Re-copy the snippet from the Website installation panel. Second, your site's Content-Security-Policy is blocking the frame; check the browser console for a frame-src or script-src violation and add the Conterminal origin to both directives.

The frame loads but says “Quote page unavailable”

The slug is well formed, so the loader worked, but no published engine answers to it. Confirm the badge on the Quotes screen reads Live, and that the slug in your snippet matches the /quote/your-slug path shown under the workspace name. Renaming the slug does not update a snippet you already pasted onto your site.

“Online quoting is not ready”

The engine is published but has no usable truck profile — a profile only counts when an active mileage rule covers the service date. Re-open the Mileage fallback block, check the effective-from and effective-through dates against today, and save.

The widget appears in the wrong place on the page

The script tag is async and ran before your target div was parsed, so the frame was inserted immediately after the script instead. Move the div so it appears above the script tag, exactly as the generated snippet has it.

The widget looks stale after a deploy

The loader script is served with no-store at the CDN and the browser, so a Conterminal release is picked up on the next page load. If you still see old behavior, the stale layer is your own site: purge your page cache or CDN, and check that no proxy in front of your site is re-caching the loader against its no-store headers.

The frame stops growing on very long quotes

Height is clamped at 3000 pixels. A quote with the maximum five segments can exceed that; the content then scrolls inside the frame rather than pushing your page taller. Lower Maximum segments if in-page scrolling is unacceptable on your site.

Quotes are not arriving at all

Work through it in this order. Did the visitor open the confirmation email and complete the link? An unconfirmed quote never reaches the queue. Is the quote actually in the review queue but the email missing? Then it is a delivery problem, not a submission problem. Are Approval request users saved, with at least one active carrier admin or manager? Revoking someone's role removes them from routing on the next send.

The quote is in the queue but no email arrived

Outbound quote email is budgeted at 30 messages per carrier per hour. Once that is exhausted, sends are recorded as failed and retried by a recovery job that runs every 15 minutes, so a burst of test submissions can delay real ones. Check spam, wait for the next drain, and if a visitor is stuck the widget itself offers a Retry quote emails button while notifications are still pending.

“Too many quote requests. Please wait and try again.”

A rate limit was hit — per-visitor limits on calculation and verification, and a per-carrier hourly ceiling. Wait for the interval named in the response and retry. Repeated automated testing against a live slug is the usual cause.

“This carrier updated its quote settings while the route was being calculated. Recalculate to use the current pricing.”

Someone saved the configuration mid-quote. This is expected during setup and harmless — the visitor recalculates and gets current pricing. Avoid saving configuration during business hours once the form is live.

Save configuration fails and nothing changes

Read the red banner: it names the specific field, for example “Additional-mile rate must be greater than zero.” or “Embed origin "https://carrier.com/quote" must be an HTTPS origin without a path.” The save is all-or-nothing and ends with “No configuration changes were committed.”, so your previously published setup is untouched.

Save recipients is greyed out

Either the configuration has never been saved, or the workspace has no tenant admin or tenant manager to assign. Save the configuration first, then add an eligible user to the workspace.