Menu
E-commerce

Multi-category local marketplace with map discovery and tiered seller billing

A multi-sided classifieds marketplace with a category-driven dynamic attribute system, map-based discovery, a tiered seller subscription model billed across web and both mobile app stores, and an automated sync layer keeping a CRM in step with every commercially meaningful product event.

Client — an online classifieds marketplace
Concept visuals — not actual screenshots
01 — Challenge

General classifieds sites fail in predictable ways. A flat keyword search across wildly different categories — vehicles, property, services, general goods — returns poor results because every category needs its own structured attributes, and hard-coding those per category doesn't scale past the tenth one. Treating every seller identically is just as broken: a private individual selling one item and a business running a permanent storefront have completely different needs and willingness to pay, so a flat listing fee either under-serves the business or paywalls the individual.

Billing then had to work in three places at once — a card gateway on web and native in-app purchases on both app stores — with each rail having its own transaction identifiers, renewal semantics and notification formats, all converging on one account tier and surviving duplicated, delayed or out-of-order provider notifications. And the commercial side of the business — upgrades, renewals, advertising sales — lived in a CRM that nobody kept in sync with what was actually happening in the product.

02 — Approach

Built the category system as data rather than code: each category defines its own structured fields across thirteen input types with independent validation, so adding a vertical is a configuration task and search filters derive from the same definitions automatically. Seller accounts sit in a tiered model with listing allowances, media limits and map visibility all driven by settings rather than constants, with tier transitions automated from subscription state including the reconciliation a downgrade requires.

Every mobile purchase is verified server-side against the store's own servers — including hand-implemented JWT signing for the Apple path — rather than trusted from the client, and every provider notification is persisted raw before it's interpreted and deduplicated on a key derived from the payload itself, so duplicate deliveries can't double-apply. Map discovery reads from a purpose-built, denormalised pin projection rather than the listings table, with a dedicated geocoding cache in front of the metered address-lookup provider. For the CRM, the integration is decoupled behind a database-backed outbox — product code marks a row pending and a bank of scheduled sweepers performs the sync out of band, so a CRM outage degrades to a backlog instead of a failed user request, with automatic relinking when the CRM reports a conflicting record.

03 — Impact

A general marketplace became a set of properly structured, filterable verticals, and adding a new one is now a configuration task rather than a release. Subscriptions behave identically no matter where they were bought, duplicate provider notifications can't double-grant entitlement, and map browsing — the single most repeated interaction in a local marketplace — never touches the main listing tables. The commercial pipeline now stays in step with the product automatically instead of drifting out of date in a spreadsheet.

Stack
LaravelMySQLReact NativeLaravelMySQLRedisReact NativeReduxGoogle MapsStripeFirebase
More work
VEDUMI — storefront, commissions and admin platform for a resin art studio→Four-sided e-commerce marketplace: admin, agent, seller and buyer→Peer-to-peer marketplace with offer negotiation and object-scoped chat→

Something holding you back?

New build, rebuild, or adding AI to what you already have — I'll take a look and give you an honest perspective.

Get in touch ↗