Publish a quote form on your own website
The quote engine puts a self-service freight quote form on your own website. A visitor enters pickup and delivery addresses, Conterminal verifies them, prices a truck-legal route, and — after the visitor confirms their email — drops the quote into a review queue inside Conterminal for you to approve or decline.
10 minute setup · Updated July 27, 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.
Configuring the quote engine
The page is titled Website quotes and carries a Live or Draft badge next to your workspace name, plus the public path it will serve, shown as /quote/your-slug. Everything below the notification panel is a single form saved by one Save configuration button. Partial saves are not possible: if any field fails validation, nothing is written and the banner reads “reason. No configuration changes were committed.”
Public experience
This block controls identity, customer contact, the embed allowlist, expiration, and surcharge handling.
- 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.
- Logo URL
- Optional, and must be HTTPS — anything else fails with “Logo URL must be a valid HTTPS URL.” With no logo the widget shows a colored square with the first letter of your display name.
- 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 and mileage fallback
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.”
Mileage fallback is what prices a lane when no exact site rate or zone rate applies, and it is required before publication. Rate per mile must be greater than zero; minimum charge may be zero. The effective-through date is optional but cannot precede the start date.
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.”
- Save a complete configuration first. Publishing before there is a settings row fails with “Save configuration before publishing.”
- Select Publish. On success the banner reads Quote engine published. and the badge changes to Live.
- 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. Nothing you change on this form will clear them; 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.
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.
- 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.
- 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.
- 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.
- 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.
Reviewing incoming quotes
The Review queue sits on the same 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.
- 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.
- 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.
- 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.
- 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.
- 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. A verified address suggestion shows a Verified choice badge once you accept it. The summary should break out base route, terminal fees, tolls, fuel surcharge, and additional services.
- 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.
- 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.
- 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 “Rate per mile 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.