Discovery & requirements
Buyer journey mapping (procurement-by-phone baseline), seller workflow survey, multi-tenant data model, US and EU commerce-privacy review, VIN-catalog vendor evaluation.
Case study · Automotive · E-commerce
How we shipped a production two-sided auto-parts marketplace — Flutter buyer apps on iOS and Android, a web buyer surface, and a multi-tenant seller CRM — built on Symfony with Laximo-backed VIN search, per-location inventory across many branches, integrated delivery handoff, and an audit-ready posture that holds up to GDPR and CCPA expectations for buyers and sellers across the United States and the European Union.
A car rental operator kept struggling to source spare parts from scattered, disconnected suppliers. Every purchase required hunting across vendors, price-checking by phone, and reconciling deliveries that arrived from different addresses on different days. The team needed a single procurement layer — a buyer-facing marketplace that consolidated parts catalogs from multiple sellers, with VIN-based search so a mechanic could find compatible parts without flipping through paper microfiches, and a seller-facing CRM that gave parts retailers a credible reason to migrate their inventory off spreadsheets. The platform also had to hold up under buyer and seller expectations in the United States and the European Union: GDPR for European users, CCPA for California users, and audit-ready records for operators serving fleets across multiple jurisdictions. We built the platform as a Flutter buyer app on iOS and Android, a React web buyer surface, and a multi-tenant seller CRM on a shared Symfony backend, with Laximo-backed VIN search and integrated delivery handoff. The result is a production marketplace that closes the loop from VIN lookup to part delivery, and is positioned for compliant operation across the US and EU.
A snapshot of what the ZipIt build delivered across Flutter buyer apps, a React web surface, and a multi-tenant Symfony seller CRM.

The platform decision dominates the iteration speed of a two-sided marketplace. We chose Flutter on the buyer side over a native iOS + Android pair and over a Magento storefront wrapper because the trade-offs line up cleanly with what an auto-parts marketplace actually needs. Magento is a solid e-commerce platform for single-seller catalogs but pays a steep tax when you try to multi-tenant it, and a "Magento + mobile wrapper" stack adds a WebView layer that buyers and the App Store reviewer can both spot immediately. Native iOS + Android would deliver fractional value for a forms-and-catalog product, at twice the engineering cost of a Flutter codebase.
The build leans on Flutter's official documentation patterns for state management and platform channels, the Symfony framework on the backend, and PostgreSQL row-level security for tenant isolation in the multi-tenant seller CRM — open, citable primitives that give us a maintainable cross-platform marketplace without locking the operator into a vendor SaaS.
| Dimension | Flutter (ZipIt) | Native iOS + Android | Magento + mobile wrapper |
|---|---|---|---|
| Multi-tenant CRM fit | Backend-agnostic; Symfony multi-tenant native | Same backend; identical fit | Magento multi-tenant is bolt-on, fragile |
| VIN search latency | Dart HTTP + Redis-cached Laximo adapter | Native HTTP; same backend latency | Magento plugin or WebView round-trip — visibly slower |
| Delivery-integration ergonomics | Single Dart client; shared with web | Two clients to maintain in parallel | Magento extensions, fragile upgrades |
| Seller-side analytics | Backend-owned, Symfony-rendered dashboards | Same backend; identical posture | Magento Business Intelligence add-on — costly |
| Iteration speed | One Dart codebase, hot-reload UX | Two codebases, double the QA | Extension compatibility risk per release |
| App Store review fit | First-class — buyer app is native binary | First-class | Often flagged as "web wrapper" |
| Data residency control | Operator-owned infra in US or EU regions | Identical posture | Magento Commerce Cloud region map only |
References: Flutter documentation, Symfony framework documentation, PostgreSQL row-level security reference.

The seller CRM is a React single-page application backed by a Symfony multi-tenant backend. Each seller is a top-level tenant; each branch — physical store, regional warehouse — is a child entity inside that tenant. PostgreSQL row-level security enforces tenant isolation so a seller in one tenant cannot read another's inventory, and the buyer-facing search index is tenant-aware so a buyer sees a unified result set without ever seeing the underlying tenant boundary. Goods receipt, per-location inventory, pricing, counterparty verification, and order workflows all live per-branch and roll up to a tenant-wide dashboard so a seller running stores in multiple cities sees one cohesive view.
Counterparty verification gives the operator a defensible posture on who can sell on the marketplace. The CRM ingests business documents during seller onboarding, runs them through a verification queue (document liveness, expiry parsing, OCR confidence) with a human review stage, and writes an immutable audit trail per seller. Records are retained per local commerce-regulation requirements — different in California versus the Netherlands versus the United Kingdom — and encrypted at rest with key rotation. The end-to-end seller surface is delivered as part of our custom software development practice.

The buyer client is built in Flutter with a single Dart codebase serving iOS and Android. Passwordless authentication keeps the signup friction low — a buyer enters a phone number or email, receives a one-time code, and is into the catalog within seconds. VIN search is the first-class entry point: the buyer enters a VIN or selects a make and model, and the app hits the VIN adapter service, which calls the Laximo-style catalog and reconciles results against the seller-side inventory across every tenant. The result is a unified list of parts with cross-location availability, per-seller pricing, and a one-tap add-to-cart that respects tenant isolation behind the scenes.
The order flow closes the loop. A buyer reviews the cart, picks a delivery option from the integrated delivery providers, and confirms — the order writes to the immutable audit log, the seller CRM picks up the order across the affected branches, and the buyer gets a push notification when each branch ships. Cross-Atlantic operators can route a buyer in California to a US seller and a buyer in Germany to a Netherlands seller without the buyer ever choosing a region; the data model handles it. The same engineering team delivers the buyer app and the seller CRM in lockstep as part of our mobile app development practice.

The delivery integration turns a single-seller order into a multi-leg fulfillment without forcing the buyer to think about it. Each branch hands off to its preferred delivery provider through a thin adapter layer; the backend tracks every leg through the order workflow engine and writes status updates to the immutable audit log. Buyers see a single tracking timeline that aggregates the per-leg status, and sellers see a per-branch fulfillment view inside the CRM. Seller analytics live in the same Symfony backend and surface in the CRM as near-real-time dashboards — units sold per branch, average fulfillment time, top-search-terms by region, and counterparty-verification status across the tenant's branches.
The data-handling posture aligns with GDPR obligations for buyers and sellers in the European Union and CCPA / CPRA obligations for users in California and the broader United States. Buyer data, seller data, and the order audit log can all be pinned to either US or EU regions for future data-residency commitments, and the multi-tenant model keeps tenant isolation enforced at the database layer rather than at the application layer.
Compliance posture: GDPR-aligned · ISO 27001 ready · SOC 2 Type II in progress · HIPAA-capable · CCPA-acknowledged.
A five-phase build that took ZipIt from a fragmented procurement story to a production two-sided marketplace across iOS, Android, web, and a multi-tenant seller CRM.
Buyer journey mapping (procurement-by-phone baseline), seller workflow survey, multi-tenant data model, US and EU commerce-privacy review, VIN-catalog vendor evaluation.
Symfony multi-tenant backend, PostgreSQL row-level security, tenant-aware search index, VIN adapter service, delivery-provider adapter spec, immutable order audit log.
Flutter buyer app for iOS and Android, React web buyer surface, React seller CRM, VIN search end-to-end, cart and order flow, seller dashboards.
Counterparty verification pipeline, encrypted-at-rest data, tenant-isolation testing, delivery-integration QA, multi-tenant load test at projected catalog size, store-review choreography.
App Store + Google Play submission across US and EU storefronts, per-tenant rollout, seller onboarding choreography, on-call runbooks for the VIN and delivery adapters.
ZipIt's seller-side analytics turn the CRM into something a seller will keep open all day, not just a place to upload inventory once a week. Symfony-backed dashboards aggregate units sold per branch, average fulfillment time per delivery provider, top search terms per region, and counterparty-verification status across the tenant's branches. The same data backs a per-tenant export so a seller running stores in the Netherlands and Germany can reconcile against their existing accounting workflow without paying for a Magento Business Intelligence add-on. Tenant migration was built in from day one — a new seller can onboard, import inventory from a structured upload, get verified, and be live on the marketplace within hours rather than weeks, and an existing seller can move branches between tenants if their corporate structure changes without losing the per-branch audit trail. Cross-tenant operators can scope their view by region, which is how a single back-office team covers operations across the US and EU during quiet shifts without losing the per-tenant compliance boundary.
The ZipIt platform was architected for automotive marketplace operators serving buyers and sellers across the United States and the European Union. The English-language build serves users in California, New York, Texas, Florida, and Washington in the US, and users in the Netherlands, Germany, France, Ireland, and Sweden in the EU, without a separate codebase per region. Consent flows are region-aware at the client layer: users in the EU and EEA receive a GDPR-style granular consent screen with separate toggles for marketing channels and optional product analytics; users in California receive a CCPA-style "Do Not Sell or Share My Personal Information" disclosure in the same flow. Data-handling practices are aligned with GDPR for European users and with the US state-privacy patchwork — CCPA / CPRA (California), VCDPA (Virginia), CPA (Colorado), CTDPA (Connecticut), UCPA (Utah), TDPSA (Texas), and Oregon CPA. Seller counterparty-verification records are retained per local commerce-regulation requirements, and audit-ready order records make regional compliance an honest-disclosure exercise rather than a per-jurisdiction data segregation problem.
Backend deployment runs across EU and US regions in parallel — Netherlands, Germany, France, Sweden, and Ireland for EU coverage; US East and US West for North America — with Symfony services and PostgreSQL instances provisioned identically through Terraform. The tenant store and the order audit log can be pinned to either US or EU regions for future data-residency commitments, and the VIN and delivery adapters are stateless so they can be scaled independently per region. Both the App Store age rating and the Google Play content rating were calibrated for a marketplace app, and the in-app privacy policy was drafted to document exactly the architecture above, citing GDPR obligations and California CCPA obligations directly. The engineering team behind the build runs a CET workday with East-Coast US overlap (9 AM–1 PM ET) for stand-ups, store-review choreography, and on-call response across cross-Atlantic seller onboarding flows.
The active custom software development roadmap for ZipIt includes a B2B-tier with bring-your-own-domain and SSO for corporate fleet buyers, deeper integration with US and EU accounting and ERP systems, an internal continuous-verification harness for tenant-isolation invariants, and a second-source VIN catalog adapter for redundancy across regions. Infrastructure plans include further per-tenant sharding for projected multi-tenant throughput, and a future independent readiness assessment scaffolded into the cloud & DevOps roadmap.
If you are planning an auto-parts marketplace, a multi-tenant B2B commerce platform, or any two-sided product where the seller-side CRM has to hold up under a regulator review for audiences in the US and EU, we have shipped this stack end-to-end and can compress the build timeline meaningfully. The engineering team behind it sits inside YuSMP Group. We work fixed-price for well-scoped MVPs and on dedicated development teams for ongoing delivery, with a CET workday and a guaranteed East-Coast US overlap (9 AM–1 PM ET) window for stand-ups, demos, and incident response.
A focused MVP covering a Flutter buyer app on iOS and Android, a web buyer surface, and a multi-tenant seller CRM with goods receipt and per-location inventory typically costs $180k–$340k. Adding VIN-based parts search via a Laximo-style catalog integration, integrated delivery handoff, seller-side analytics, counterparty verification, and audit-ready posture for US and EU operators brings a full platform to $360k–$700k. The dominant cost drivers are the VIN-catalog integration, the multi-tenant data model, and the seller-side analytics that the CRM has to maintain in near real time.
Auto-parts buyer apps are forms-and-catalog products with relatively shallow platform integration, exactly where Flutter is strongest. A single Dart codebase delivers the buyer iOS and Android apps with one engineering pass, shared design tokens with the web buyer surface, and faster iteration on catalog UI than two native teams. Native iOS and Android would add cost without delivering proportional value for VIN search, cart, and order flow. We reserve native builds for cases where continuous location, push reliability, or kernel-level integration dominate the spec.
A multi-tenant CRM treats each seller as a top-level tenant and each branch as a child entity inside that tenant. Inventory, goods receipts, pricing, and order workflows live per-branch but roll up to a tenant-wide dashboard, so a seller running stores in multiple cities sees one cohesive view. Symfony backs the tenant store; PostgreSQL row-level filtering enforces tenant isolation, and the buyer app reads cross-location availability through a tenant-aware search index so a buyer never sees a part from a seller they cannot transact with.
VIN search is implemented as a dedicated adapter service that calls a Laximo-style automotive catalog and reconciles results against the seller-side inventory. The adapter translates a VIN into a structured list of part references, fans those references out to the seller inventory index, and returns a unified result set with cross-location availability and per-seller pricing. The adapter caches frequent VIN lookups in Redis with TTLs sized to the catalog's update cadence, and it writes every lookup to an audit log so the operator can attribute search traffic per buyer for US and EU analytics.
A Flutter buyer app on iOS and Android, a web buyer surface, and a multi-tenant Symfony seller CRM with goods receipt and per-location inventory typically takes 14–22 weeks for the MVP. Adding VIN-based parts search via a Laximo-style catalog, integrated delivery handoff, seller analytics, counterparty verification, and audit-ready posture for US and EU operators adds 8–14 weeks. The VIN-catalog integration is frequently the long pole because real-world catalog APIs return inconsistent part references that need server-side reconciliation.
Related cases
Three-app taxi platform — driver, passenger, dispatcher — with real-time GPS streaming and document verification.
View case → Retail · FashionRetail consultant app for boutique inventory across stores — ElasticSearch search, 1C integration, multi-store reach.
View case → Retail · E-commerceLocal marketplace mobile app for an offline children's-goods chain — flexible catalog, online stock sync.
View case →