Field Operations Industry, chapter 15 of 26
Door-to-Door Sales
Selling field service at the door: seasons, territories split into canvass areas, pins and their signals, knocks and dispositions, passes, do-not-knock lists.
Most field-service companies sell the way you'd expect: a website, a phone number, a referral, a truck wrap. Some of the largest recurring-service businesses (pest control above all, but also solar, security systems, lawn care and roofing) grow mainly at the front door. A rep walks a neighborhood, knocks on every house, and signs agreements on a tablet in the driveway. It works because the product is cheap to explain, recurring, and cheaper to deliver when the neighbors buy it too: every house signed on a street makes that street's route denser. The software behind it is a geospatial system first and a sales system second. It decides who knocks where, records every door, keeps reps out of homes they must not knock, and turns a summer of knocks into data the next summer can plan from.
The Seasonal Model#
Door-to-door selling in this industry is seasonal. Reps (often college students) are recruited over the winter, arrive in a market in spring, knock from late spring until the end of summer, and go home. Some come back as veterans the next year, some become team leaders, and the company rebuilds most of the sales force every year. Sales Teams & Commissions covers the people side of that: recruiting, onboarding, housing and pay.
The season shapes the data model. A season has a start and end date and an onboarding window before it; a sub-season is a slice of it (early, peak, late) that lets rosters change mid-summer. Almost everything about a rep's assignment (their team, their area, their goals, their housing) is scoped to a season, so last year's assignments stay intact as history while this year's are built fresh. Treat the season as a first-class key, not a date filter: "which team was this rep on when they sold this house" has to be answerable two years later, when commissions are disputed or a cancellation is investigated.
The other consequence is volume. A season compresses most of a year's new business into a few months, and every rep logs a knock at every door, all day. The platform's busiest write path is not payments or scheduling; it's knocks, from thousands of tablets, many on weak cellular signal.
Territories, Teams and Canvass Areas#
The map is a hierarchy of polygons, each owned by a different level of the organization:
| Level | Owned by | What it decides |
|---|---|---|
| Territory | The company | A market: the service centers that can deliver service there, and the sales operation behind them |
| Team area | A team for a season | The slice of a territory one team works, drawn by sales operations before the season |
| Canvass area | One or more reps | The streets a rep (or pair) works this week, drawn by the team leader |
| Pin | Nobody | One address, with its knock history and signals |
A territory is not a sales construct alone. It has to match where the company can actually service a customer, which is decided by service-center boundaries and Territories & Capacity. Selling a house no truck will ever reach is the most expensive mistake in this model: the customer is promised service, the rep is promised commission, and both get unwound. So a team's boundary is drawn inside territories that are open for sale, and an address that falls outside every serviceable area is flagged before the rep reaches the door.
Drawing Canvass Areas
Team leaders draw canvass areas by hand on a map, usually a few dozen to a few hundred homes each, and assign them to reps. Hand-drawn polygons are messy, so the system enforces two rules when one is saved:
- Clip to the parent. The new polygon is intersected with the team's boundary, so a canvass area can never leak into another team's area. Intersection can produce more than one piece (a polygon that crosses a boundary twice comes back as a multipolygon), so decide what happens then: keep the largest piece, or reject the drawing and ask again. Keeping the largest piece is friendlier on a tablet; just tell the user what was dropped.
- Resolve overlaps explicitly. If the new area overlaps existing ones, show the overlap and ask before saving. On confirmation, subtract the overlap from the older areas so every address belongs to exactly one active canvass area at a time. An older area that ends up empty is deactivated, not deleted, because its knocks still reference it.
Both are a few lines of PostGIS (ST_Intersection, ST_Difference, ST_Area to pick the largest part), and both run in the same transaction as the save. Doing them in the client is tempting and wrong: two leaders drawing at once will both see a clean map.
Exclusions
Some places must not be knocked at all, regardless of team or area: a gated community that has banned solicitation, a military base, a city that's revoked permits, a neighborhood where the company has a complaint history. An exclusion is a polygon with a reason, owned by the company, that cuts through every level below it. Exclusions are evaluated at read time (pins inside one render as do-not-knock and refuse knocks), so adding one takes effect on every tablet at its next sync without redrawing anyone's areas.
Pins and Their Signals#
Every address in a territory is a pin. The address list comes from a data vendor or public records, standardized and validated by an address verification service (Smarty is one) that returns a normalized address and coordinates, and loaded before the season. A pin carries signals that tell a rep where to spend time:
- Qualification. Whether the home fits the product: a single-family home rather than an apartment complex, owner-occupied rather than rented, the right size and age. Unqualified pins aren't hidden, they're deprioritized; reps still pass them.
- Movers. Households that recently moved in are the best prospects in home services: no existing provider, a new house, and a fresh list of things to sort out.
- Refinances and sales. A recent refinance or sale is a similar signal of a household making decisions about the house.
- Relationship. Active customers (don't sell them again, but a rep can ask for a referral), previous customers (a win-back, with their cancellation reason in hand), and open leads from other channels.
- Product fit. Some signals belong to one product: termite pressure in a region, a pool for a pool service, a lawn size.
- Score. A model score that combines the above with historical close rates nearby.
The signals become map styling. A pin's icon encodes its most important fact (sold, do-not-knock, mover, previous customer, knocked twice), and the order matters: when a pin is both a mover and do-not-knock, do-not-knock wins. Keep that priority as data on the label definitions, not as a chain of if statements in three clients.
Reps also report problems with the address list itself: a pin with no house, a vacant lot, a duplicate, the wrong address. An address issue goes through a small workflow (open, in progress, resolved or dismissed) owned by whoever maintains the address data. It's tedious work and it matters: a wrong pin is a wasted walk for every rep who ever passes it.
Knocks and Dispositions#
A knock is the record of one rep at one door: the address, the rep, the canvass area, the time, the location, and the disposition (what happened). It's the core fact of the whole system, and everything else (rep stats, map styling, next year's planning) is derived from knocks.
Dispositions are configuration, not code, because sales leadership changes them every season. Each one carries attributes that drive behavior:
| Attribute | What it does |
|---|---|
| Final | Ends the conversation at this address for the pass: sold, not interested, don't knock |
| Decision maker | The rep spoke to someone who could have bought; feeds conversion stats |
| Note required | The rep must explain (a "don't knock" request, a safety concern) |
| Allow duplicate | Whether the same disposition can be recorded twice in a pass |
| Admin only | Only managers can set it (a permanent do-not-knock after a complaint) |
| Resettable | Whether a new pass clears it, or it persists forever |
| Style and priority | How the pin renders, and which disposition wins the icon |
A typical set: not home and come back later (not final); go back (a decision maker, not ready); sold (final, decision maker); a family of final not-sold reasons (not interested, already has a provider, under contract with a competitor, price, safety concern, doesn't see bugs, does it themselves, renter, not serviceable, no access); and don't knock (final, note required, not resettable). The not-sold reasons are worth the extra tap. "Under contract with a competitor" is a date to come back; "not serviceable" is a data problem; "safety concern" is a marketing problem. In aggregate, they're the best market research the company has.
Two dispositions deserve special handling:
- Don't knock. When a resident asks not to be visited again, that request has to outlive the season, the pass, the rep and the team. It isn't resettable, it renders on every tablet, and the knock API refuses new knocks there except by a manager. Some municipalities go further and run their own do-not-knock registries: Jersey City, for example, maintains a list that solicitors must obtain and avoid, with fines for knocking a registered home. Load those registries as exclusions per address, refresh them on the city's schedule, and record which version of the list was in force when a knock happened. See Licenses & Permits for the permits the same cities require.
- Sold. A sold knock is the start of an agreement, not the agreement itself, and the two have to stay linked: Signing the Agreement covers what happens after. If the agreement is cancelled or rescinded, the pin should say so, or the next rep will knock a house that just said no in writing.
Writing a Knock
The knock endpoint is the busiest in the system, and it has to tolerate the field. Make it idempotent with a client-generated ID (a rep's tablet will retry on a dropped connection; see Idempotency), accept a client timestamp alongside the server's, and record the device's location so a manager can see when knocks were logged from a parked car. Return the pin's new state in the response, so the tablet doesn't have to refetch the area to redraw one icon.
Passes: Resetting the Map Without Losing It#
A canvass area gets worked more than once. After a few weeks, every pin is marked, and the area looks finished, but most of those "not home" and "come back later" pins are still prospects. The team leader wants to send reps through again on a clean map. A pass (some teams call it a phase or a clear) is how: the manager resets a canvass area, a team area or a whole territory, and every resettable pin renders fresh while the knocks behind it are kept.
Implement it as a counter, not a delete. Each canvass area has a current pass number; each knock records the pass it was made in; pins render from knocks in the current pass only, plus any non-resettable dispositions from any pass. Resetting is then one update (current_pass = current_pass + 1) instead of rewriting thousands of pins, and history survives intact: you can still ask how many times a house was knocked across the season, and on which pass it finally bought.
Every knock also carries the pass the tablet believed was current. If a manager resets the area while a rep is offline, the rep's next knocks arrive stamped with the old pass. Reject them with a clear error ("your map is out of date") and force a refresh, rather than filing a knock from the old map into the new pass. The rep loses one tap; the alternative is a fresh map with stale marks on it, and a manager who can't trust any of them.
Within a pass, count knocks per address. A second knock and a third-plus knock are useful map states (reps can see where they've already been twice), and the counter is cheap to keep on the write.
Planning With Hexes#
Polygons are how the organization divides the map; they're a poor unit for analysis, because every team draws them differently and they change weekly. For planning (where to put teams next season, which areas are worn out, where close rates are high), aggregate pins and knocks into a fixed grid instead. Uber's H3 is the common choice: a hierarchical index of hexagonal cells over the whole globe, where each hexagon has seven children at the next finer resolution. At resolution 8 a cell averages about 0.74 km², roughly a few blocks of suburban housing; at resolution 5 it averages about 253 km², a whole metro area.
Store each pin's cell IDs at a coarse and a fine resolution when it's loaded, and roll up per cell:
- Average weeks since last knocked, which shows which neighborhoods are fresh and which were worked to exhaustion.
- Share of qualified addresses, and the average score.
- Close rate, decision-maker rate, and the leading not-sold reasons.
- Active and previous customers, which shows route density from the service side.
Two cautions. H3's containment between resolutions is approximate (a child cell's area isn't exactly inside its parent), so roll up from the pins, not from child cells. And hexes are for analysis, not assignment: a canvass area drawn along a hex edge would split a street down the middle.
Goals, Stats and Leaderboards#
Door-to-door sales runs on visible numbers. Each rep and team has goals per day and per season (knocks, decision makers reached, sales, revenue), and the app shows progress all day. Compute per-rep daily stats from events rather than ad-hoc queries, because the same numbers drive pay and disputes:
- Knocks, first and last knock time (the length of the day), decision makers, and qualified and unqualified doors.
- Sales, and same-day sales.
- Agreements serviced (the first service happened), cancelled before the first service, cancelled after it, and rescinded inside the cancellation window.
- Average contract value and average prices, which Pricing & Sales Rules uses to gate discounting.
The split between sold, rescinded, cancelled before service and serviced is the honest measure of a rep. A rep who sells forty agreements and has fifteen rescind has a pressure problem, and leaderboards that rank only on sales reward exactly that. Rank on serviced sales, or show both.
Offline and the Field#
Reps spend the day outside, often in new subdivisions with poor coverage. The tablet app has to:
- Cache the rep's areas, pins and dispositions at the start of the day, and render from the cache.
- Queue knocks locally and send them in order when the connection returns, each with its own idempotency key, pass number and client timestamp.
- Refresh exclusions and do-not-knock pins first whenever it reconnects, because those are the ones with legal weight.
- Degrade honestly. Knocks can be offline; signing an agreement and taking payment generally can't, because they need a live identity check, a live price and a live appointment slot. Say so in the app instead of letting a rep start an agreement that will fail at the last step.
The Technician App covers offline sync for the service side, where the trade-offs are similar and the stakes are different.
Licensing at the Door#
Many cities require door-to-door solicitors to hold a permit, and some states require a license to sell certain services. A rep may be allowed to knock but not to close in a jurisdiction, or not to knock at all. Licenses & Permits covers the model. The sales system's job is to check it at the point of action: before a rep opens a canvass area, and again when a knock or agreement is recorded at an address, against every jurisdiction that contains it. A city's rule is stricter than the state's more often than not, so every overlapping jurisdiction has to allow the action.
What This Means for the System You Build#
- Seasons as a key on rosters, assignments, goals and stats, so history stays answerable.
- A polygon hierarchy (territory, team area, canvass area) with clipping and explicit overlap resolution in the database, in one transaction.
- Exclusions and do-not-knock as data that cuts through every level, including municipal registries, versioned.
- Pins with signals and prioritized styling defined as configuration, and an address-issue workflow.
- Dispositions as configuration, with final, decision-maker, note-required, admin-only and resettable flags.
- Idempotent knocks with client IDs, timestamps, location and the pass the client believed current; stale passes rejected.
- Passes as a counter, never as deletes.
- Hex aggregates for planning, rolled up from pins.
- Rep stats from events, split into sold, rescinded, cancelled before service and serviced.
- Offline knocks, online agreements, with compliance checked at the address before either.
References#
Specifications
- eCFR: 16 CFR 429.0, Definitions, the FTC's definition of a door-to-door sale, which covers sales at the buyer's home
Reference
- H3: Tables of Cell Statistics Across Resolutions, average cell area per resolution, the 12 pentagons, and seven children per hexagon
- H3: Introduction, a hierarchical hexagonal index developed at Uber, with approximate containment between resolutions
- PostGIS: ST_Intersection, clipping one geometry by another, which can return multi-part results
In practice
- Jersey City: No-Knock Ordinance, a municipal no-knock registry made available to solicitors, with fines for knocking registered homes