Salta ai contenuti

Checkpoint 1, Steve Trucking

Questi contenuti non sono ancora disponibili nella tua lingua.

Module 5 in the chapter From the Lake to the Model, chapter 8 of the Data 360 Architect course. Each module stands on its own. Previous: The Party, Ready for Identity Resolution

The question this module answers: Given three of Steve Trucking’s sources, which door, which category, which key, and which path to the model?

This is the end of Part 1, and the first time the course leaves the airports and the pilots. If you haven’t tried the Checkpoint 1 challenge, try it first. Here’s how I would architect it, and why.

Steve Trucking delivers appliances, TVs and furniture for big-box Retail Partners to the partners’ customers, the Recipients, at home. About 3,300 deliveries a day. In the org, each delivery is a Work Order, keyed by the partner’s own reference in one field, such as KEYSTONE-PHX-8843119-1. The Recipient is fields on the Work Order, not a contact, because a Recipient belongs to one Retail Partner, and no partner may ever see another’s (S2 in the brief).

Source 1: deliveries and their Recipients, from the org

Section titled “Source 1: deliveries and their Recipients, from the org”

The door: pull. It’s a Salesforce org, so the CRM connector brings it in (chapter 5). We set up the Work Order stream ourselves and choose its fields, as with any object a bundle doesn’t cover (chapter 5).

The category: profile. This is the one to think about. A delivery sounds like engagement: it happens on a day. But the planned day changes when a Recipient reschedules, and an engagement stream needs an event time that never changes (chapter 6). And because the Recipient lives on the delivery, each Work Order row is the only record of that Recipient for that delivery: one row, one person, which is what profile means.

The key: the partner key, already one field, already unique (chapter 3). No formula needed.

The path to the model: one lake object, several model objects, exactly as the pilots file did in module 3:

Work Order fieldsMaps to
Partner keyIndividual: Individual ID
Recipient’s first and last nameIndividual: First Name, Last Name
Recipient’s emailContact Point Email (key: partner key plus -EMAIL; Party: partner key)
Recipient’s phone, and in E.164Contact Point Phone (key: partner key plus -PHONE; Party: partner key)
Delivery addressContact Point Address (key: partner key plus -ADDR; Party: partner key)
The delivery’s own fields: partner, DC, status, datesA Delivery object

The keys and fields are this course’s example.

For the Delivery object, look at the standard objects first (module 1); if nothing means “a delivery”, create a custom one, named for what it is, not for the org it came from (module 2). Delivery notes and gate codes stay out: they’re personal data, and nothing downstream needs them (S4).

Notice what this design does to people. A Recipient who gets three deliveries is three Individuals. That’s deliberate, and it’s where Part 2 starts.

The door: push. The tracking page’s back end sends each event as it happens through the Ingestion API, streaming (chapter 4). Nobody’s job drops a file; the page knows the moment something happens.

The category: engagement. Each row is something that happened at a moment: the link opened, the window viewed, a question asked. The event time is when it happened, and it never changes.

The key: an event ID the page makes for each event.

The path to the model: a custom engagement object, related to the Delivery by the partner key. And here’s the decision to see: no Party. The link’s token identifies a delivery, not a person. Whoever opens the link, the Recipient or someone in the household, the event belongs to the delivery. Linking it to the Individual would claim to know more than we do.

Source 3: manifest lines, pulled from Amazon S3

Section titled “Source 3: manifest lines, pulled from Amazon S3”

The door: pull. The integration layer writes each partner’s manifest set, and each revision, as a CSV file in Amazon S3; a scheduled stream picks it up (chapter 4).

The category: other. A manifest line is a plan. It’s not about a person, and its date can change, so it isn’t engagement.

The key: partner key plus the revision number, built by a formula field on the stream (chapter 6): compound values in a single key. With the partner key alone, a revision would overwrite the line it revised, and the requirement says it mustn’t. With the revision in the key, each version is its own row.

The path to the model: a custom Manifest Line object, related to the Delivery by the partner key. And the Recipient’s fields on the manifest stay out of the stream (chapter 3: choose the fields you need). People come from one source only, the org. A second copy of a Recipient’s name and phone would be one more place to protect and delete, and one more Individual to unify for no reason.

Steve Trucking: three sources into the model Three sources, each a row going left to right: the door, the stream with its category, the lake object with its key, and the model objects. 1. **The org,** through the CRM connector (pull), to a Work Orders stream (profile) and lake object keyed on the partner key. It maps to an Individual (the Recipient, once per delivery), whose contact points (email, phone, address) carry the partner key as their Party, and to a Delivery (partner, DC, status, dates). 2. **The tracking page,** through the Ingestion API (push), to a Tracking events stream (engagement) and lake object keyed on the event ID. It maps to a Tracking Event, related to the Delivery by the partner key. It has no Party. 3. **Amazon S3,** manifest files pulled, to a Manifest lines stream (other) and lake object keyed on the partner key plus the revision. It maps to a Manifest Line, one row per revision, related to the Delivery by the partner key. Footnote: people come from the org only. The tracking events have no line to the Individual: a link identifies a delivery, not a person. {"author": "Steve Simpson", "blueprint": "1.1.0", "builder": "standard 1.59.0", "built": "2026-11-10", "id": "DGM-D360-LM-03", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "cells 0.5.0", "theme": "stevetecharc 1.4.0"} The org CRM connector: pull Work Orders stream: profile Work Orders lake object; key: partner key Individual the Recipient, once per delivery Contact points email, phone, address; Party: partner key Delivery partner, DC, status, dates Tracking page Ingestion API: push Tracking events stream: engagement Tracking events lake object; key: event ID Tracking Event no Party: it belongs to the delivery Amazon S3 manifest files: pull Manifest lines stream: other Manifest lines lake object; key: partner key + revision Manifest Line one row per revision brings in lands in maps to Party maps to brings in lands in maps to partner key brings in lands in partner key maps to People come from the org only. The tracking events have no line to the Individual: a link identifies a delivery, not a person. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge
  • Unify the Recipients, or deliberately don’t? Three deliveries, three Individuals. Within one Retail Partner, unifying them could be useful; across partners, never (S2). Chapter 9.
  • Keeping each partner’s data apart inside Data 360. Part 3.
  • Status history and truck positions: ingest them, or query them where they are. Chapter 15.

Part 1 was about bringing data in. Eight chapters:

  1. Data 360 in One Picture: the whole flow first.
  2. Under the Hood: what Data 360 sits on: Parquet files, Iceberg tables, the change feed, the engines.
  3. Understanding Your Data Structures: the dictionary and the keys, before anything comes in.
  4. The Doors In: pull, push, or leave it where it is.
  5. Bringing In CRM Data: your orgs, your objects, your timing.
  6. Streams and the Lake: the category, the lake object, the formula fields.
  7. Data Transforms: reshaping data inside Data 360.
  8. From the Lake to the Model: this chapter.

Every decision in this checkpoint came from one of them. Part 2 starts with what we just set up: Individuals from more than one place, waiting to become one.

  • For each source: the door, the category, the key, and the path to the model, written down before the first stream is built.
  • Which source owns the people, and which sources leave the people fields out.
  • What each event belongs to: a person, or something else.