Skip to content

Steve Trucking, What I Would Architect

Also in 28 languages

Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

A row of plain white delivery trucks ready at the loading doors at first light, a clipboard on the front of the nearest one.
Image generated with AI

Module 6 of 6 in the chapter Master Data and Identity, chapter 6 of the Data Architect course, and the end of Part 1. Previous: When Authority Is Shared · Next: Part 2 begins with Designing for Scale (coming soon)

The question this checkpoint answers: Can you put Part 1 together on a real scenario?

Try the challenge first. This is my walkthrough of Checkpoint 1’s challenge. If you haven’t drawn your own design yet, do that before you read on. The value is in comparing your reasoning with mine, not in reading the answer.

This is “What I Would Architect”: a possible viable solution, not the answer, with the trade-offs named and my positions taken. We haven’t covered large data volumes, query design, integration patterns, migration or transactions yet, and that’s on purpose: architecture develops as you learn more. But Part 1 gives us enough to set the bones.

From the brief: about 3,300 deliveries a working day, a million a year, growing 30% a year. About 1.6 line items a delivery (1.6 million a year); about eight status changes a delivery (8 million a year); four to five million photos a year; about 200,000 GPS readings a day; about 180,000 cases a year; three Retail Partners sending manifests three different ways; nine distribution centers; 330 trucks with two-person crews. And Steve Trucking already runs one Salesforce org with Service Cloud, Field Service and a partner portal. Count the zeros before drawing a single box. They’ll decide several things below.

The deliveries are the heart of it, and Field Service already does dispatch. So I start with Field Service’s standard model, as chapter 3’s slice did:

Business conceptSalesforce objectWhy
Retail PartnerAccount (Retail Partner record type)A business Steve Trucking contracts with; carries contracts, cases and portal access
Partner staff (DC managers, store staff)ContactPortal users must be Contacts
One delivery: one Recipient, one address, one partner order, one dayWork OrderField Service’s unit of work; scheduling, the mobile app and service reports hang off it
Each item or service: the fridge, the install, the haul-awayWork Order Line ItemDivides the work, drives checklists and invoicing
The kind of stop: delivery only, with install, with haul-awayWork TypeSets duration, skills and the install checklist
The scheduled visit and its windowService AppointmentWhat Field Service schedules and the crew’s app shows
Crews and trucks; DC dispatch areasService Resource, Service Crew, Service TerritoryField Service schedules a crew as one resource
Recipient inquiries, partner claimsCaseThe service console, entitlements, email-to-case
The partner’s list for Tuesday at the Phoenix DCManifest__c (custom)Nothing standard represents the unit of receipt, reconciliation and replay

Everything else stays standard. Resisting more custom objects is deliberate: chapter 1’s question was when an architect should resist another one, and here the answer is “almost always.” The partner’s order line, for instance, isn’t a new object. It’s the Work Order, identified by the partner’s reference.

Checkpoint 1: the delivery core Checkpoint 1's physical core for Steve Trucking. On core: a Retail Partner, an Account with a record type, sends Manifests, the one custom object, and each Delivery is for one partner. A Manifest lists Deliveries. A Delivery is a Work Order carrying the Recipient as fields; it's scheduled as Appointments, Service Appointments, contains Delivery Items, Work Order Line Items, each described by a Kind of Stop, a Work Type, A Crew, a Service Crew, is assigned to Appointments and works in a DC Dispatch Area, a Service Territory. An Inquiry or Claim, a Case, can concern Deliveries. Off core: the Crew's GPS pings go to the warehouse, the Delivery links to Delivery Photos in a photo store, and each Appointment publishes its Status History as events to the warehouse. Underneath: look to the mothership: Field Service is the delivery core. {"author": "Steve Simpson", "blueprint": "1.0.0", "builder": "standard 1.28.0", "built": "2026-10-15", "id": "DGM-DA-MD-61", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "object-model/physical 1.8.0", "theme": "stevetecharc 1.4.0"} ON CORE OFF CORE sends is for lists concerns scheduled as contains describes crews work in assigned to pings links to publishes Retail Partner Account · record type Manifest Manifest__c · custom Inquiry or Claim Case Delivery WorkOrder · Recipient fields Delivery Item WorkOrderLineItem Appointment ServiceAppointment Kind of Stop WorkType DC Dispatch Area ServiceTerritory Crew ServiceCrew Status History events, warehouse Delivery Photos photo store, linked GPS Pings warehouse, by reference Look to the mothership: Field Service is the delivery core. exactly one zero or one one or many zero or many lookup © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

It grows from chapter 3’s finale (Design the Salesforce Physical Model): the same objects in the same places, with the crew, the dispatch area, the case and what Checkpoint 1 keeps off core added.

The Key That Matches a Partner’s Order to a Delivery

Section titled “The Key That Matches a Partner’s Order to a Delivery”

Each manifest line becomes one Work Order, linked to its Manifest. The key is the question I most want answered: how do we know that this line from the partner is that delivery? My answer: an External ID on the Work Order built from the Retail Partner and the partner’s own order and delivery reference (something like KEYSTONE-PHX-8843119-1), marked unique. One field per source, one-to-one. It’s the partner’s identifier, not ours: chapter 2’s “several identifiers for one thing,” and module 1’s “the partner owns its order reference.”

Why it matters: manifests arrive one to two days ahead and get revised on the day. With that key, every re-sent or revised manifest upserts instead of creating duplicates. The revision updates the Work Order, a field records it, and a change to an already-routed delivery alerts the coordinator: the partner’s change is applied, but flagged until dispatch confirms it. This is also what changes from chapter 4’s picture. Today every manifest lands in RouteDesk, and coordinators rekey routes into Salesforce and completed stops back. In this design the manifests come straight into Salesforce, upserted by the partner’s key; RouteDesk retires, and the rekeying ends. The Integration chapter designs the three inbound formats. The data decision is the key.

The Recipient: Person Account, Contact, or Neither?

Section titled “The Recipient: Person Account, Contact, or Neither?”

This is the most interesting data decision in Part 1, so here are the options, then my choice.

Option A: person accounts. Each Recipient becomes a person account, linked to every delivery. For: standard, works naturally with Service Cloud, messaging and the console, recognizes repeat Recipients. Against: about a million new Recipients a year, each a person account at roughly twice a business account’s storage (Estimated Record Size by Object Type (opens in a new tab)), so within two years one of the largest objects in the org. And Recipients aren’t Steve Trucking’s customers. They’re each Retail Partner’s customers, and Steve Trucking must never blend one partner’s customer with another’s (S2).

Option B: Contacts under the Retail Partner’s account. Against: a million Contacts under three or four accounts is parent-child skew on a massive scale, far past Salesforce’s guidance of about 10,000 children per parent (Considerations for Object Relationships (opens in a new tab); Parent-Child Data Skew (opens in a new tab)). This is the option to show, and reject.

Option C: the Recipient lives on the delivery. The Recipient’s name, phone, email, address and delivery notes are fields on the Work Order (the address fields are already standard there), captured from the manifest. For: no new large object; the data lives exactly as long as the delivery needs it; deletion happens per delivery, on the partner’s schedule; and partner isolation comes free, because each delivery belongs to one partner. Against: a repeat Recipient isn’t recognized as the same person.

That’s the balance to strike. Is there ever going to be a need to recognize several deliveries as the same person, at the same place? To give that person a login? That’s the line between a Recipient who needs a record of their own and Recipient details that are simply data about the delivery. And there’s a middle path. Carry the Retail Partner’s own customer ID as a field on the delivery, a Retail Partner Customer ID. It doesn’t create a Recipient record, but it ties together the deliveries a partner sends for the same customer, which is the start of a more unified customer experience, and it leads straight back to the Retail Partner’s system, where that customer really lives. It’s their identifier, so it only means something together with the partner: one partner’s customer 4417 has nothing to do with another’s.

In my professional opinion, Option C is the right choice. The not-recognized part is acceptable, even desirable: Steve Trucking has no relationship with these people beyond the delivery. It’s module 1 again: the Recipient is the partner’s customer, and the partner is the authority for who they are. And it’s chapter 5: personal data that lands in one place, tied to one delivery, is far easier to protect, retain and delete. And it holds up to chapter 2’s normal forms: the Recipient’s details are one-to-one with the delivery, so they belong on it. A separate Recipient child would save a few repeated values at the cost of another object, another relationship and its overhead, and the only way it would save more is by treating the same person as one across Retail Partners, which we won’t do. So the delivery carries the Recipient, with the Retail Partner Customer ID as the way back to the partner’s own system.

Who is the Recipient? Three Recipient options, each with its case for and against. Option A, a person account per Recipient: fails on the relationship, because the Recipient is the partner's customer; fails on volume, about a million a year at twice a business account's storage; passes on skew, each its own account; fails on partner isolation, because it blends partners' customers; fails on deletion, outliving the delivery; passes on recognizing repeats. Rejected. Option B, Contacts under the Retail Partner: fails on the relationship, as they aren't the partner's staff; fails on volume; fails on skew, a million under three or four accounts; passes on isolation, under one partner's account; fails on deletion; recognizes repeats within a partner. Show and reject. Option C, Recipient fields on the Work Order, highlighted as the Checkpoint 1 choice: the only relationship is the delivery; no new object; no new parent; one partner per delivery; deleted on the partner's schedule; and a repeat Recipient isn't recognized, which is fine. Underneath: model the person according to the relationship you actually have. {"author": "Steve Simpson", "blueprint": "1.0.0", "builder": "standard 1.28.0", "built": "2026-10-15", "id": "DGM-DA-MD-62", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "comparison 0.3.0", "theme": "stevetecharc 1.4.0"} A: Person Account rejected FOR Recognizes a repeat Recipient No parent skew: each is its own account AGAINST The partner's customer, not ours About 1M a year, at twice the storage Blends partners' customers (S2) Outlives the delivery B: Contact under the Retail Partner: show and reject FOR Kept under one partner (S2) Repeats known within a partner AGAINST Not the partner's staff 1M under 3 or 4 accounts: skew Outlives the delivery C: On the delivery fields on the Work Order: the choice FOR The only relationship is the delivery No new object, no new parent One partner per delivery (S2) Deleted on the partner's schedule AGAINST A repeat Recipient isn't recognized: fine Model the person according to the relationship you actually have. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

John Smith, 123 Main Street, appears in Redrock’s manifest and Brightwave’s. Probably the same person. Should Steve Trucking unify them? No, deliberately not. Unifying Recipients across Retail Partners would breach S2: a partner must never see another partner’s Recipients, and a unified identity is exactly the bridge that leaks. It’s this chapter’s position applied: under-match where blending is costly, and here blending is very costly.

If a Retail Partner later wants repeat-Recipient recognition within its own deliveries, that’s a job for an identity-resolution tool, such as Data 360’s, scoped to that partner: a registry-style map, not a person account, and never across partners. A map of who’s who doesn’t grant ownership, and it doesn’t grant access.

Chapter 3 asked where data should live. The zeros answer it here:

  • Current status lives on the Service Appointment and Work Order. The history of status changes, about 8 million a year and growing, doesn’t need to live in the core org. Each change is published as an event and kept in the warehouse, Snowflake. The org keeps the current state; the history is still there for service, operations and analytics, just not in the operational database.
  • Photos (four to five million a year, some showing people or the inside of a home) live off-core in storage built for that volume, uploaded straight from the crew’s app. The org keeps only what it needs: a small index record per photo, or just a count and a “required install photos complete” flag. My preference is the lighter option: keep the org lean, and let the photo store own its index and retention.
  • GPS readings (200,000 a day) stay in FleetLink and go to Snowflake; the org needs only the latest position for the tracking page and the dispatcher’s map.
  • RouteDesk’s eight years of history (about 5 million deliveries) go to the warehouse or an archive, reachable for claims. What, if anything, comes into the org is a migration decision for Part 2.
Checkpoint 1: what I would architect Checkpoint 1's landscape, what I would architect, in the same places as chapter 4's current landscape. People on the left: 45 dispatch coordinators inside 9 partner DCs, about 700 delivery crew members on 330 trucks, 100 care and office staff, all using Salesforce; about 300 Retail Partner users at 3 partners, using the Retail Partner portal; and about a million Recipients a year, who open a tracking page through a link, with no login, and call care agents by phone. In the middle, one US Salesforce org with Field Service, the corporate identity provider above it for office staff only, and email-to-case bringing cases in. The three Retail Partners at the bottom right, Redrock by REST API and webhooks, Keystone by CSV over SFTP, and Brightwave by EDI through a third-party network, send manifests in to one integration layer, designed in Part 2, which upserts them into Salesforce by the partner's key and sends status back out to each partner. On the right: Salesforce sends status events to Snowflake, which keeps the status history and analytics; FleetLink, where raw GPS stays, sends only the latest position to Salesforce; Salesforce sends delivery counts through the integration to the finance ERP, which invoices partners and pays crews; photos, 4 to 5 million a year, go from the crews' app to photo storage off core; and RouteDesk is retired to an archive of its 8 years of history. Salesforce sends the day-before message, with a link, through the SMS and email provider. Underneath: same company as chapter 4; the rekeying and the spreadsheet are gone; the history and the photos live off core. {"author": "Steve Simpson", "blueprint": "1.0.0", "builder": "standard 1.28.0", "built": "2026-10-15", "id": "DGM-DA-MD-63", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "system-landscape 0.10.0", "theme": "stevetecharc 1.4.0"} ABOVE: IDENTITY, APPEXCHANGE, WEB PEOPLE RIGHT: INTERNAL SYSTEMS BELOW: CUSTOMER CHANNELS BOTTOM RIGHT: PARTNERS AND PROVIDERS Dispatch coordinators 45, inside 9 partner DCs Delivery crews ~700 on 330 trucks Care and office staff 100: service, ops, finance Retail Partner users ~300 at 3 partners Recipients ~1 million a year Corporate IdP SSO for office staff only Retail Partner portal Tracking page INTEGRATION Snowflake status history, analytics FleetLink raw GPS stays here Finance ERP invoices partners, pays crews Photo storage 4–5 million a year, off core RouteDesk archive retired; 8 years of history Phone care agents Email email-to-case SMS and email provider day-before message, with a link Redrock REST API, webhooks Keystone CSV over SFTP Brightwave EDI through a third-party network Salesforce Field Service, one US org a link, no login office staff only calls cases in manifests in status out manifests in status out manifests in status out upserts, partner key status events latest position only delivery counts delivery counts photos, from the crews' app day-before, with a link Salesforce a community people identity, apps, web an internal system a customer channel the integration layer starts at the system that opens the connection; the label says what moves a shared certificate: trust, no direct call Same company as chapter 4. The rekeying and the spreadsheet are gone; the history and the photos live off core. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Checkpoint 1: what I would architect. Same places as chapter 4’s landscape (Steve Trucking’s Landscape), with the rekeying and the spreadsheet gone.

  • Retail Partners see only their own deliveries (S2). Every Work Order carries its Retail Partner; portal users see their partner’s deliveries, and DC managers only their DC’s.
  • Partner users need a portal license that supports sharing rules and roles: Customer Community Plus or Partner Community. Chapter 3’s stadium seats: the cheapest seats don’t get the sharing this design needs. Both licenses need roles for the external users, and Salesforce warns that more roles slow the org down (Experience Cloud User Licenses (opens in a new tab)). A role per partner and per DC is fine; a role for every store isn’t.

Test knowledge. Know which external licenses carry standard sharing: Customer Community Plus and Partner Community (with roles for the external users), not Customer Community, which uses sharing sets.

  • Recipients need no license. The tracking page shows one delivery through a link with a token that expires (S3), not a login.
  • Watch the skew. Hundreds of thousands of Work Orders a year pointing at three or four partner accounts is account data skew. One option is a child account per DC under each partner, which spreads the children nine or more ways; archiving completed deliveries after the claims window keeps the active children per parent low. Part 2 takes that on.

I wouldn’t create a person account for every Recipient because a Recipient is an individual. I wouldn’t hang a million Contacts off three accounts. I wouldn’t build a custom Delivery object beside Field Service’s Work Order. I wouldn’t unify Recipients across partners. I wouldn’t put millions of photos or GPS readings in core storage. And I wouldn’t call a unified Recipient a golden record unless we’d actually made a mastering decision.

Part 1 set the bones; Part 2 tests them. The LDV ruler at year three (Work Orders, Service Appointments and line items are all large-volume territory within two to three years), query design for partner-scoped list views, the three inbound integrations and three status feeds, the RouteDesk migration, transactions on the day, and the security design behind the portal. Steve Trucking will change, too. Keep this design; you’ll revisit it.

  • Which standard objects carry the core (here, Field Service’s), and which custom objects are truly justified (here, one).
  • The key that matches each partner’s order line to a delivery, and why it belongs to the partner.
  • What the Recipient is, based on the relationship Steve Trucking actually has with them.
  • Whether to unify identities, and where blending is too costly to risk.
  • What stays in the org, what lives off-core, and which licenses the design depends on.