We are pre-launch, and this page says so rather than pretending otherwise. CostScanner has no rate source connected. It cannot currently produce a benchmark, an audit finding or a saving, so you will not find a dollar figure or a percentage anywhere on this site.
The problem
Nobody can tell you whether a freight rate is good. The quote arrives from one carrier, in one mode, on one day, in one format, with the accessorials somewhere else. The comparison that would make it meaningful — the same lane, the same volume, the same week, across the alternatives — does not exist anywhere in one piece. So it gets paid.
Then the invoice arrives, and it does not match the quote. Somebody checks the large ones.
Why an aggregator
CostScanner does not price freight. It has no carrier relationships and no rate sheet of its own, and that is the design: the mode specialists price their own mode far better than one generalist could. This app reads them over a frozen API contract, normalises what comes back into a single comparable shape, and does the arithmetic across it.
Three consequences we will not trade away:
- If a source is unavailable, the result is partial and says so. A quiet gap that looks like a complete answer is worse than an error.
- If a source has no rate for a lane, there is no row. A synthesised rate is a wrong answer with a number attached.
- Below the sample-size floor, a benchmark shows no figure. Three observations are not a market.
How we will talk about it
This app is one of a family of logistics products built from a shared template, and the template arrived with a marketing homepage full of numbers nobody had measured. All of it was removed, and the rule that replaced it is short:
- A number on a public page comes from a measurement, or it is not there. That includes the two a cost product is most tempted by: volume analysed and average saving.
- Derived counts round down, never up.
- Anything unbuilt is labelled unbuilt, in the future tense.
- The status page reports what is monitored and admits what is not. It never defaults to green.
- Every link goes somewhere. A test fetches them all and fails the build on a 404.
Where the build is
Brand, theme and layout
Accent ramp, shared design system, application shell.
Honest public surface
Home, about, status and legal — no claim without a measurement behind it.
Aggregation layer
One adapter per mode over a frozen /api/v1 contract, normalising to a single quote type. Designed before any page or endpoint is written.
Authentication
Basefyio identity over RS256 tokens verified against the realm on every request. Built and tested; deliberately not open yet — see below.
Schema and persistence
Numbered migrations for the account anchor, invoices, findings, benchmarks and lanes. The benchmark cache lives in the database, not in memory. This is what sign-up is waiting on.
Benchmarking and audit
Follows the aggregation layer. A benchmark below its sample-size floor shows no number at all.
Billing
Follows persistence and a payment provider decision.
Why you cannot sign up yet
Authentication is finished, not stubbed. Sign-in, sign-up and token refresh all talk to our identity provider, and every request verifies the token's signature against the provider's published keys before reading anything out of it.
What is missing is one database table — the row that records that an account exists in this app. Without it, signing up would create an identity we could never recognise afterwards: you would get a confirmation email, a password in your manager, and a permanent sign-in failure. So the gate stays shut until the schema lands. The status page checks that table on every load and reports exactly what it finds.
Getting in touch
There is no support desk yet, because there is no product to support. When accounts open, this section will carry a real address for a real inbox — not a form that posts into nothing.