Caravan Cargo
Bilingual corporate site for an international shipping company. Quote request flow, branch locator, Laravel CMS that handles English and Arabic editing in one panel.
About the project.
Caravan Cargo is an international shipping company that handles freight across several countries and needed a corporate site that could carry the full operation: services, branches, and a real quote-request flow. The build runs on Laravel with a single editing panel where the team writes English and Arabic side by side. The branch locator and quote form push directly into the sales inbox so leads stop falling through the cracks between marketing and operations.
What we walked into.
An international shipping company needed a corporate site that could carry the full operation: services, branches, a real quote-request flow — and accept bilingual ar/en editing in one panel.
What we did.
Laravel CMS with paired ar/en fields, Tailwind front, a quote form that pushes directly into the sales inbox with structured fields (origin, destination, weight, type). Branch locator with map integration.
What it became.
Bilingual content under one panel. Lead form routes to sales without spreadsheet middleman.
My role on this project.
Solo · end-to-end. Laravel back end, Tailwind front, branch-locator map, quote-form pipeline. The client supplied content and branch data; everything else is mine.
Full-stack engineer
Laravel + Blade + Alpine. Bilingual content model with Spatie/translatable.
Quote pipeline designer
Structured quote form (origin → destination → weight → service type) that routes into the sales inbox with parsed fields, not free text.
Map + locator engineer
Branch locator with OpenStreetMap tiles (no Google Maps bill), KSA-aware search.
The numbers that matter.
- <1.5s4G load timeHome + services + locator pages. Mobile-tested in KSA.
- 12+Branches on locatorEach with hours, contact, services, map pin.
- BilingualSingle panelEditors write ar/en in one form, no parallel posts.
- 0Manual lead handoffQuote form pushes structured payload straight to sales inbox.
What was actually broken.
Shipping is a high-touch sales process — the quote-request form is the front door to the entire business. The previous site treated it as an afterthought (a contact form that dumped free text into a shared mailbox). Sales team had to read the message, ask for missing fields by email, then enter the lead into their system. The brief: a quote form that captures every field sales needs to price the job, in the language the customer is comfortable in.
The hard surface area.
- 01Quote form must capture 8+ structured fields without feeling like a tax return.
- 02Branch locator that loads fast on mobile without paying Google Maps API fees per visit.
- 03Bilingual editing flow that does not create two sets of branches to drift apart.
- 04Sales inbox routing that respects which branch is closest to the origin (KSA Eastern vs Western).
Engineering wins worth naming.
Quote form completion rate
Progressive disclosure: 3 fields at first (origin, destination, weight), more revealed as user fills the previous. Completion rate held above 40% in early review.
OpenStreetMap over Google
Leaflet + OSM tiles. Saves $500-$1k/month at scale. Geocoding via Nominatim with a Redis cache to respect their rate limit.
How the system is wired.
Edge tier
Application tier
Data tier
The decisions behind each choice.
Laravel + Spatie/translatable
- Single bilingual editing surface in Filament. Branches, services, pages — all share the same translation pattern.
- Lead routing logic (closest branch by origin region) sits naturally in a service class, not in JavaScript on the form.
OpenStreetMap over Google Maps
- No per-call pricing means no surprise bill if the locator becomes popular.
- Tiles look honest, not over-polished — fits a shipping company that ships actual physical things.
What the build taught us.
- Structured forms beat free-text contact forms by an order of magnitude in conversion-to-quote.
- OSM is the right default for any business map that does not need turn-by-turn navigation. Switch to Google when you need their data — not when you assume you need their data.
