Acquisition systems Plate I

Dealer Acquisition System

Dealer acquisition pipeline for a commercial equipment marketplace. It qualifies dealers, normalizes listings, preserves each run, and rechecks availability.

Stack
TypeScript TypeScript PostgreSQL PostgreSQL
Scope 12 industry groups · 75 NAICS subindustries · 5 dealer scrapers · 4 marketplace adapters
Measured 3 increasing-scale scraper runs
Acquisition pipeline, system map
Acquisition pipeline, system map
Dealer Acquisition System system architecture diagram
Discovery, qualification, extraction, ingest, and the separate listing-liveness cadence.
Engineering notes

Architecture and decisions

The acquisition problem

Dealer inventory was spread across inconsistent websites and third-party marketplaces. Search results repeated the same businesses. Storefronts changed without notice, and published listings disappeared. The marketplace needed a repeatable path from discovery to a dealer call and from inventory extraction to a current catalog.

01

Discover

Expand industry and geography plans into dealer candidates. Normalize identity by source key and website origin, then preserve first-seen history.

02

Qualify

Check site access, inventory fit, storefront signals, financing context, and extraction viability in a fixed order.

03

Extract

Run dealer-site scrapers and marketplace adapters. Convert each source into one listing contract with source provenance intact.

04

Publish and recheck

Ingest an exact run into the marketplace. Revisit known listing URLs on a separate cadence and record availability changes.

Qualification ends in a business action

The qualifier returns call partner, call low priority, manual review, or drop. Reasons travel with the decision. Human corrections are stored as inputs, so the next run does not repeat a known mistake.

Three runs at increasing scale

I increased the scraper input across three runs and watched category distribution instead of treating a successful process exit as proof. A taxonomy correction held as volume increased: industrial categories gained share and the catch-all Other bucket declined.

The contract failure

Four applicant-risk fields disappeared at a repository boundary because three services carried separate copies of the same type. Every repository compiled. The payload was incomplete.

I replaced the duplicated boundary types with an explicit wire DTO and added contract assertions at the handoff. Local type safety stops at the repository edge. The shared payload now has an owner and an executable contract.

What is public

The system map and counts reflect the implementation. Dealer records, credentials, endpoints, and qualification thresholds stay private. The example records are fictional.