Changelog

Recent releases, newest first.

Verification dates are the register’s own again

  • Re-verification rounds are switched off. They marked the longest-unchecked listings as "verified today" without checking them, so those dates were not true.
  • Every listing now shows the verification date its source register gives, or none. Dates written by the earlier rounds are no longer shown.
  • Re-verification will return only when there is a real check behind it.

UK coverage, and 21 listings that were never companies

  • Added the BIFA member directory: 2,907 more forwarders, and the United Kingdom is now the third best-covered country.
  • Removed 21 listings that came from a failed import — they were menu items from a website ("Downloads", "User Terms"), not businesses.
  • An image filename was being read as a contact email address on those listings. Addresses that are really file paths are now rejected, so the contact counts mean what they say.
  • Every listing in the directory now names the register or association it came from. Previously some carried no source at all.

Five national association directories, and two listing defects fixed

  • Added the FORWARD Belgium, SPEDLOGSWISS, UTIKAD, IGMD and Turkmen Logistics member lists: 2,539 more forwarders, and Turkey is now the third best-covered country.
  • Members of those associations are credited with the membership and are not marked as licence-holders — the same treatment FIATA members get, because an association admits members rather than licensing them.
  • Fixed ten listings whose company name had absorbed a column header from the source document, among them Crane Worldwide, DHL Global Forwarding and Savino Del Bene. They were displayed under an unreadable name.
  • Fixed a fault that gave several listings the same web address, which left all but one of them unreachable even though they appeared in the totals.
  • Exported CSV files no longer let a company name be interpreted as a spreadsheet formula when the file is opened.

Global coverage, and a much lighter directory

  • Added the FIATA members directory: coverage goes from 5 countries to 157, and association members are credited as such — not presented as licence-holders.
  • Opening a company profile no longer loads its entire country into memory, so the directory now runs in less than half the memory it did on a larger dataset.

Account security hardening

  • Sessions now expire server-side. Previously a copied session value stayed valid indefinitely, because only the browser was told when to forget it.
  • The app refuses to run in production with a missing, placeholder or weak signing key, rather than falling back to one published in the source.
  • Claiming a listing now records whether your email domain matches the company on file, and approving an unverified claim takes a deliberate override.
  • Scheduled maintenance tasks authenticate with their own secret instead of needing an admin session.
  • Contact-unlock allowance is enforced at the moment it is spent, so simultaneous requests cannot exceed it.

The real directory: 152,720 forwarders from public registers

  • The directory now runs on real data from public licensing registers — FMCSA, the FMC OTI database, CIFFA, HMRC, IIFA and the Turkish shipowners register.
  • 91.6% of listings carry a regulator-issued licence, and profiles now show the identifier so you can check it against the register yourself.
  • Company and city names arriving in ALL CAPS from the registers are now properly cased, which also merged duplicate city pages.
  • Removed invented verification dates: a listing no longer claims it was checked on a date nobody checked it.
  • Corrected our own claims: the homepage now states the countries and cities actually covered, and reports the share of listings carrying a regulator-issued licence, instead of asserting a reach we could not back up.

Sitemaps for the whole directory

  • Every forwarder profile, country page, city page, guide and lane is now listed in a segmented sitemap, split into files a search engine will accept.
  • Profile entries carry their verification date, so crawlers can tell which listings changed.
  • Sitemaps read the live dataset — a removed record disappears from them as soon as the pipeline drops it, rather than lingering until the next deploy.
  • Fixed: a pipeline run now takes effect on the running site without a restart, instead of continuing to serve the previous dataset.

Search engines and social previews

  • Every directory, profile, guide and lane page now declares a canonical URL and structured data, so search engines can read what each page is about.
  • Filter combinations fold back to a canonical URL and are marked no-index, which keeps duplicate views out of search results while still letting crawlers follow the listings.
  • Link previews on social platforms and chat apps now show a branded card with the page title and description.
  • Added robots.txt, and completed the web app manifest with installable icons.

Data removal that actually removes

  • An approved removal request is now suppressed from every dataset build — re-importing the same source file cannot bring the record back.
  • The removal form on /contact/remove-my-data submits straight into the review queue instead of opening an email draft.
  • An approval can be revoked, which returns the record on the next build.
  • Duplicate review queue is built from the pipeline’s own near-miss detection; a verdict of "same company" or "keep separate" is honoured on the next run.
  • Re-verification rounds were added. (Withdrawn on 2026-09-28: they marked listings verified without checking them.)
  • Bounced addresses can be flagged and cleared, and support can reply to threads from the admin console.
  • Pipeline gained an incremental mode that skips a rebuild when nothing relevant changed.

Admin console: real numbers and working controls

  • Platform metrics are now counted from stored records; figures that would need an analytics provider are listed as not measured rather than estimated.
  • User management: change a role or plan, mark an address verified, or delete an account — with guards so the last root account cannot be removed.
  • Editable platform limits: free unlock allowance, hourly export budget, and per-plan export row caps now apply without a deploy.
  • Role permissions are an editable capability matrix instead of a static description.
  • Audit log gained filters by area, actor, date and free text, plus paging; API quota, GEO coverage, fault codes and the email log all show real data.
  • Bookings and RFQs can be moved through their statuses from the console, and bookings export to CSV.

Account, analytics & billing

  • Account settings: edit your profile, change your password, verify email and phone, and choose which notifications you get.
  • Forwarder business profile: company details, services, and IATA/FMC licence numbers, ready for your listing claim.
  • Analytics rebuilt: activity over four time ranges, a directory funnel with conversion rates, country and mode breakdowns, plus a table view.
  • Billing: plan comparison and switching, six-month usage history, export budget, and invoice details.
  • Support threads can now be opened, replied to, and closed from the workspace.

Workspace depth: bookings, shipments & tracking

  • Booking detail rebuilt: status timeline, editable details, cancellation, document register, and a note thread.
  • Create a booking without leaving the register; filter bookings and shipments by status.
  • New /app/track overview — status counters, tracked consignments, latest events, and quick lookup.
  • Shipment detail now shows milestone progress, ETA slippage, event history, and the carrier trace.
  • Dashboard KPIs render with the page instead of appearing after a client fetch, with a merged activity feed.
  • Fixed: workspace pages returned a server error to signed-out visitors instead of redirecting to sign-in.

Export watermarking & tiered rate limits

  • Every CSV export carries a watermark trailer: export id, licensed account, plan, row count, and applied filters.
  • Exports are logged to the audit trail with their real row count, so a leaked file traces back to the pull.
  • CSV export has its own hourly budget, separate from the contact-unlock allowance.
  • Export the exact segment you are looking at, straight from the directory filters (Data plan).
  • Unlock quota, remaining exports, and plan row limits are now visible in /app/leads.

Directory search at full scale

  • Directory search rebuilt on inverted indexes — verified at 167,970 records with worst-case p95 of 22 ms.
  • Filter facets cached per scope; unfiltered listings serve straight from a prebuilt sort order.
  • Crawlable country and city hub links added to the directory index.
  • Pipeline now ingests production-scale files (a 200k-row import previously failed outright).

Enrichment & verification

  • Pipeline enrichment pass: geo-coding, domain inference, membership-based mode/service tagging.
  • Verification ladder on profiles: unverified → email verified → claimed → licensed.
  • Global coverage map on homepage; data-quality score and "updated X days ago" on profiles.
  • Admin staleness tracking and demo re-verification email drip.

Admin suite & data ops

  • Full /app/admin console: users, KYC claims, inquiries, bookings, pricing, audit, API quota.
  • Data-quality dashboard with fill rates, dedupe queue, bounced-email flags.
  • GDPR removals queue feeds pipeline exclusion list (data/demo/exclusions.json).

Auth & shipper/forwarder workspace

  • Forgot/reset password, email verify, signup shipper vs forwarder account type.
  • Full /app workspace: dashboard, quotes, bookings, shipments, track, analytics, billing, account, feedback, claim profile.
  • Profile claim flow creates pending KYC requests in demo store.

Quotes, docs, tracking & tools

  • /quotes multi-forwarder RFQ with directory matching and demo inquiry store.
  • /docs hub (SLI, B/L, AWB, certificates) plus 4 interactive tools.
  • /tracking, /rates, and /freight lane + country SEO pages.

Contact gating & lead monetization

  • Free / Pro / Data pricing tiers with monthly unlock limits and CSV export.
  • Demo auth with tiered demo accounts; /app/leads workspace for unlocked contacts.
  • Anti-scrape: contacts loaded via API, honeypot fields, per-account rate limits.

Forwarder directory

  • /forwarders search with country, city, mode, service, and network filters.
  • Profile pages with gated contacts, verification badges, and claim-profile CTA.
  • Country and city SEO landing pages powered by dataset shards.

Data pipeline foundation

  • Ingest → normalize → dedupe → validate pipeline for ~200k forwarder contacts.
  • Canonical Forwarder type in scanner-config; per-country JSON shards.
  • DATA_AUDIT.md with fill rates, duplicate stats, and country distribution.

Homepage & brand shell

  • Coordination Magenta theme; live dataset stats on homepage.
  • Hero forwarder search, feature grid, and network marquee.