Delivered remotely for a business based in Miami, United States. Names withheld by agreement.
Project Overview
Industry: Automotive — wholesale dealer trading and retail trade-in appraisal.
Type of solution: A B2B marketplace and workflow platform: a REST API with a documented interface and administrative back office, plus a feature-rich cross-platform mobile application with real-time messaging.
Business context: A dealership runs two businesses that touch the same vehicles. It sells to consumers, and it trades with other dealers — sourcing stock, moving vehicles that do not suit its market, and buying wholesale. Both have historically depended on relationships, phone calls and auctions, with very little visibility into what other dealers are holding right now. Meanwhile, the appraisal of a customer's trade-in is a decision made under time pressure, involving a salesperson, a manager, market data and often bids from other dealers — conducted verbally while the customer sits in the showroom deciding whether to buy at all.
General users: Dealer salespeople, used-vehicle managers, buyers and bidders across the dealer network, organisation administrators, and platform administrators. A limited customer-facing path exists for vehicle submission.
General purpose: To give dealers visibility of each other's inventory, structure the negotiation between them, and turn trade-in appraisal from a set of parallel phone calls into a managed workflow with a clear decision at the end of it.
The Business Challenge
Dealers cannot see each other's stock. Wholesale trading depends on knowing what is available. Without a shared view, dealers rely on auctions, brokers and personal relationships — all of which add cost, delay or both.
Vehicle data is inconsistent everywhere it comes from. Makes, models, trims, options and specifications arrive in different forms from different sources. Without normalisation into a single taxonomy, search and filtering — the entire basis of a marketplace — cannot be relied upon.
Inventory changes constantly. Dealer stock turns over daily. Manual listing entry cannot keep pace, so inventory must arrive automatically from dealer systems and stay current.
Trade-in appraisal is a race against the customer's patience. The dealer needs a defensible number quickly. That means market valuation data, a manager's judgement, and ideally competing bids from other dealers — in the time the customer is willing to wait.
Two negotiations happen simultaneously. Internally, a salesperson and a manager agree what the dealership will offer. Externally, other dealers bid on the same vehicle. The manager has to see both and understand the relationship between them, and the system must keep them distinct without losing the connection.
Trust boundaries between competitors. Dealers are competitors as well as trading partners. Who can see whose inventory, and whose customer vehicles, has to be governed explicitly rather than being open by default.
Deals need conversation. Structured offers are not sufficient — vehicle trading involves questions, conditions and negotiation, which means real-time messaging alongside the formal workflow.
Everything happens on a phone. Salespeople are on a forecourt, buyers are between meetings. The mobile application had to be the primary product, not a companion to a web platform.
Our Approach
Normalise vehicle data before building anything on top of it. We built a dedicated specification normalisation service reconciling decoded vehicle data into the platform's own taxonomy of makes, models, trims, bodies, engines, fuels, colours and options — with decoding attempts logged and status-tracked so that a disputed specification can be traced back to its source. Every filter, every search and every valuation depends on this being right.
Automate inventory ingestion. Rather than asking dealers to list manually, the platform ingests inventory directly from dealer feeds on a schedule, with import runs and individual import errors recorded as structured data so failures are visible and diagnosable rather than silently dropped.
Model the appraisal workflow as an explicit state machine, in one place. The internal salesperson↔manager negotiation — offer, counter-offer, accept, reject on either side — and the external dealer bidding were built into a single dedicated workflow service that owns the state transitions, resolves how internal and external positions relate, and dispatches the resulting notifications. This is the most valuable logic in the product, and it lives in one service rather than scattered across controllers.
Give the manager the number the decision turns on. Rather than presenting raw bids and offers side by side, the platform computes the relationship between the external bid and the internal position directly, so the manager is making a decision rather than doing arithmetic under time pressure.
Govern visibility with data. An explicit connection graph defines which dealers trade with which, complemented by blacklisting including at brand level, so what a dealer can see is a deliberate configuration rather than a default.
Delegate real-time infrastructure. Messaging is delivered through a hosted websocket service rather than self-operated socket infrastructure, keeping real-time delivery reliable without adding an operational burden the business would have to staff.
Build the mobile app as the product. Role-specific screen sets for salespeople, managers, bidders and buyers within one codebase, with camera-based vehicle capture, rich filtering, image handling and integrated chat.
Instrument and document. API documentation is generated from the codebase so a large interface stays documented as it changes, with error monitoring in production and deep introspection tooling in development.
The Solution
Structured vehicle catalogue. A complete taxonomy — makes, models, years, trims and trim groups, bodies, engines, fuel types, colours, doors, seats and options — underpinning every listing, filter and valuation.
Vehicle identification decoding with audit trail. Vehicle identification numbers are decoded through a data provider, normalised into the platform's taxonomy, and logged with status so specification provenance is traceable.
Market valuation integration. Market value data is retrieved per vehicle, giving both sides of a negotiation a shared, independent reference point.
Automated inventory ingestion. Dealer inventory arrives from scheduled feed imports, with import runs and errors recorded so problems surface as data rather than as missing stock.
Wholesale marketplace. Listings with imagery, full specification and status lifecycle, discoverable through structured search with extensive simultaneous filters, saved filters and a personalised feed.
In-app vehicle capture. Vehicles can be photographed and listed directly from the mobile application using the device camera, with cropping and image management.
Trade-in requests. A salesperson raises an appraisal request against a customer vehicle, with specification and market valuation attached automatically.
Two-tier negotiation. Internally, the salesperson and manager exchange offers and counter-offers with explicit accept and reject outcomes. Externally, the manager shares the vehicle with selected dealers who submit competing bids. Both run against the same request, and the manager sees the relationship between them.
Negotiation history and decision trail. Every offer, counter-offer, acceptance, rejection and declined bid is recorded, so an appraisal decision can be reviewed afterwards rather than reconstructed.
Dealer network management. Organisations, dealer accounts and user roles, with an explicit connection graph defining trading relationships and blacklisting — including brand-level exclusions — governing visibility.
Real-time messaging. Group and direct messaging delivered over websockets, so negotiation conversation happens inside the platform alongside the formal offers.
Notifications. Push notification delivery with device registration and notification records, keeping time-sensitive offers and bids in front of the people who need to act on them.
Contract generation and reporting. Contract documents generated as PDFs, and spreadsheet export for reporting outside the platform.
Administrative platform. Full management of the vehicle taxonomy, listings, dealers and organisations, imports, content and settings — with permission changes recorded in an audit log.
Key Features
Vehicle specification normalisation Decoded vehicle data is reconciled into a single internal taxonomy through a dedicated service, so search, filtering and valuation operate on consistent data regardless of source.
Vehicle identification decoding with audit history Decoding attempts, results and statuses are logged, making specification provenance traceable when a listing is questioned.
Automated dealer inventory feed ingestion Scheduled imports from dealer feed endpoints with structured import run and error records, so inventory stays current and failures are visible rather than silent.
Two-tier trade-in negotiation workflow Internal salesperson–manager offers and counter-offers run in parallel with external dealer bidding on the same vehicle, managed by a single workflow service owning all state transitions.
Decision support for managers The platform computes the relationship between external bids and the internal position directly, presenting a decision rather than raw numbers to compare under time pressure.
Market valuation integration Independent market value data attached per vehicle, giving both sides of a negotiation a shared reference point.
Explicit dealer connection graph with blacklisting Trading relationships are configured data, complemented by blacklisting including at brand level, so inventory visibility between competitors is deliberate.
Real-time in-app messaging Websocket-delivered group and direct messaging, so negotiation conversation happens alongside the structured offer workflow.
Advanced structured search with saved filters Extensive simultaneous filtering across the vehicle taxonomy, with user-saved filters and a personalised feed turning complex search into a returning-user feature.
Permission audit logging Changes to access rights are recorded — a meaningful control on a platform where competitors can see each other's inventory.
Technical Architecture
Mobile client. A large cross-platform application with role-specific screen sets — salesperson, manager, bidder, buyer — composed through stack, tab, drawer and swipeable navigators. Device capabilities include camera-based vehicle capture, image cropping and zoomable viewing, location and address autocomplete, currency and masked input, and range sliders for filtering. Real-time messaging runs over a websocket client, with push notification handling and error monitoring integrated.
API layer. A token-authenticated REST API with controllers partitioned into consumer, manager and administrative trees, over shared base classes and a dedicated access-helper trait governing trade-in visibility. The API surface is documented through generated specifications.
Business services layer. The platform's most valuable logic is extracted into services: a workflow service owning the negotiation state machine, transition rules, decision computation and notification dispatch; a specification normaliser reconciling decoded vehicle data; and a market valuation service.
Data ingestion layer. Scheduled console commands pull dealer inventory from remote feed endpoints, recording import runs and individual errors as structured data, with additional maintenance commands for status updates and data repair.
Real-time layer. Messaging delivered through a hosted websocket service, consumed directly by the mobile client.
Data layer. A relational database with an extensive vehicle taxonomy, listings, trade-in requests, offers and history, dealer relationships, and audit logs — evolved through a long migration history reflecting years of continuous development.
Supporting services. Cloud object storage for vehicle imagery, PDF generation for contracts, spreadsheet export, dual email providers, error monitoring in production and introspection tooling in development.
Flow: Mobile app (role-specific) → Token-authenticated API → Workflow, normalisation and valuation services → Relational database → Scheduled feed ingestion from dealer systems → External vehicle data and valuation provider → Websocket messaging + push notifications
Technology Stack
| Category | Technology |
|---|---|
| Backend language | PHP |
| Backend framework | Laravel |
| Database | MySQL with Doctrine DBAL, extensive migration history |
| API authentication | Laravel Passport (OAuth2) and Sanctum |
| API documentation | Generated OpenAPI/Swagger specifications |
| Query caching | Model-level caching layer |
| Real-time messaging | Hosted websocket service (Pusher) |
| External data | Vehicle identification decoding and market valuation provider |
| Feed ingestion | Scheduled commands over SFTP/FTP via Flysystem |
| Object storage | Google Cloud Storage |
| Email delivery | SendGrid and Postmark |
| Documents & export | DomPDF for contracts, Maatwebsite Excel for reporting |
| Image processing | Intervention Image |
| Monitoring | Sentry in production, Telescope in development, log viewer |
| Web delivery | Progressive Web App support |
| Mobile framework | React Native with React 19 |
| Mobile navigation | React Navigation (stack, bottom tabs, drawer, material top tabs) |
| Mobile real-time | Websocket client with Gifted Chat messaging UI |
| Mobile device features | Vision Camera, image cropping and zoom, fast image loading, geolocation, Places autocomplete, orientation locking |
| Mobile inputs | Currency and masked inputs, range sliders, pickers, date/time pickers |
| Push & auth services | Firebase (app, auth, messaging) with native iOS push handling |
Technical Challenges & Solutions
| Challenge | Our Approach |
|---|---|
| Vehicle data arriving in inconsistent forms from every source | A dedicated specification normalisation service reconciling decoded data into a single internal taxonomy, with decoding attempts and statuses logged so specification provenance is traceable when disputed. |
| Inventory changing daily across many dealers | Scheduled automated ingestion from dealer feed endpoints, with import runs and individual errors captured as structured records so failures surface as data rather than as missing stock. |
| Internal approval and external bidding running simultaneously on the same vehicle | A single workflow service owning both: internal offer and counter-offer transitions with explicit accept/reject on both sides, external bid resolution, and the relationship between them — all state changes in one place rather than distributed across controllers. |
| Managers making time-pressured decisions from raw numbers | The platform computes the relationship between external bids and the internal position directly, presenting the manager with a decision rather than a comparison to perform while a customer waits. |
| Competitors needing to trade without unrestricted visibility | An explicit dealer connection graph defining trading relationships, complemented by blacklisting including at brand level, so visibility is configured rather than assumed, with permission changes recorded in an audit log. |
| Negotiation needing conversation as well as structured offers | Real-time messaging delivered over a hosted websocket service, integrated alongside the formal offer workflow so discussion and decisions stay in one place. |
| Search across a large, heavily structured dataset | An explicit vehicle taxonomy supporting many simultaneous filters, with model-level caching on catalogue reads and saved user filters turning repeated complex searches into a single tap. |
| One mobile application serving four distinct roles | Role-specific screen sets composed through multiple navigator types within a single codebase, sharing networking, state and components while keeping each role's experience focused. |
| Keeping a large API documented through years of change | API documentation generated from the codebase rather than maintained separately, so the specification does not drift from the implementation. |
Security & Reliability
Authentication. Token-based OAuth2 authentication with registration, verification and password recovery flows.
Layered authorisation. Controllers partitioned by audience — consumer, manager and administrative — with a dedicated access-helper trait governing trade-in visibility, the most sensitive access decision in the platform.
Governed inter-dealer visibility. An explicit connection graph and blacklisting, including at brand level, determine which dealers can see which inventory and which customer vehicles. Visibility is a deliberate configuration rather than an open default.
Permission audit logging. Changes to access rights are recorded, providing accountability on a platform where access determines commercial advantage.
Data provenance. Vehicle decoding attempts and statuses are logged, and import errors are captured as structured records, so both specification and inventory data can be traced to their source.
Decision trail. Offers, counter-offers, acceptances, rejections and declined bids are all retained, so an appraisal outcome can be reviewed after the fact.
Production monitoring. Error and performance monitoring in production with log inspection tooling, alongside deeper introspection tooling used in development.
Cross-origin controls. Explicit policy over which clients may call the API.
Scalability & Performance
Cached catalogue reads. The vehicle taxonomy is read on nearly every search and listing operation and changes rarely, making it an ideal candidate for model-level caching.
Scheduled batch ingestion. Inventory imports run as scheduled commands rather than synchronously, so feed volume and remote endpoint latency never affect user-facing requests.
Delegated real-time infrastructure. Websocket delivery through a hosted service scales with message volume without the business operating socket infrastructure.
Filtered, paginated search. Search endpoints operate over an explicitly structured taxonomy with database-level filtering, keeping result sets bounded and query paths indexable.
Efficient image handling. Vehicle imagery is processed server-side, stored in cloud object storage and rendered through a caching-optimised image component on the client — significant in a product where every listing carries multiple photographs.
Stateless application tier. Token authentication and externalised storage keep application instances free of local state.
Push over polling. Time-sensitive offers and bids are delivered by push notification and websocket rather than by client polling.
Business Outcomes
- Dealers can see and search each other's inventory, replacing relationship-dependent sourcing with a structured, filterable network.
- Inventory stays current without manual entry, because it arrives automatically from dealer systems on a schedule.
- Specification data is consistent and traceable, so search and valuation can be relied upon and disputes resolved from logged provenance.
- Trade-in appraisal became a managed workflow, with internal approval and external bidding running in parallel instead of as competing phone calls.
- Managers make faster, better-informed decisions, because the platform computes the relationship the decision turns on rather than presenting raw numbers.
- Every appraisal has a decision trail, with all offers and outcomes retained for later review.
- Visibility between competitors is governed deliberately, through connection and blacklist configuration with permission changes audited.
- Negotiation happens in one place, with real-time messaging integrated alongside the formal offer process.
Why it worked
Marketplace platforms in established industries are hard for a reason that is easy to miss: the industry already has a process, and it works. The software does not get to invent a new one. It has to model what people actually do — including the parts that are political, time-pressured and negotiated — and be faster than the phone call it replaces, or it will simply not be used.
Our team builds for that reality. We modelled a negotiation that genuinely happens on two levels at once, and put its entire state machine in one service so the rules stay coherent as the product grows. We treated messy external data as its own problem, with a dedicated normalisation layer and logged provenance, because a marketplace built on inconsistent specifications cannot be trusted by the people using it. We made inventory arrive automatically, because a marketplace that depends on manual entry is stale within a week. And we made visibility between competitors an explicit, audited configuration, because in a network of rivals that question is commercially serious.
Our teams work across Laravel and modern PHP, large-scale API design and documentation, third-party data integration, scheduled ingestion pipelines, real-time messaging and complex multi-role cross-platform mobile applications — with the domain judgement to know which parts of a business process must be modelled faithfully and which can be simplified.
Final Summary
A dealership trades with other dealers and appraises customer vehicles, and until recently both processes ran on phone calls. Wholesale sourcing depended on who you knew and what you could find at auction. Appraisal depended on a salesperson, a manager and a handful of calls to other dealers, conducted at speed while a customer waited in the showroom deciding whether to buy at all.
Our team built a platform that digitises both. Dealer inventory arrives automatically from scheduled feed ingestion, is decoded and normalised into a consistent vehicle taxonomy with logged provenance, and becomes searchable across the network with extensive filtering and saved searches. Trade-in appraisal became a structured workflow where the internal salesperson–manager negotiation and external bidding from other dealers run in parallel on the same vehicle — with the entire state machine owned by a single service, market valuation data attached automatically, and the manager presented with the relationship the decision turns on rather than a set of numbers to reconcile.
Around that sit the things a network of competitors requires: an explicit connection graph and blacklisting governing who sees what, permission changes recorded in an audit log, a full decision trail on every appraisal, and real-time messaging so negotiation happens alongside the formal offers rather than in a separate conversation. Delivered as a multi-role cross-platform mobile application over a documented Laravel API, it replaces two decades-old manual processes with something faster than the phone call — which, in this industry, is the only test that matters.