Migration ist zuerst ein Qualitätsprojekt
Auch in 19 Sprachen
English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Українська · Español (México) · Français (Canada)

Modul 1 von 5 im Kapitel Migration und Synchronisierung, Kapitel 10 des Kurses Data Architect. Jedes Modul steht für sich. Zurück: das vorige Kapitel, Integration und Datenbewegung · Weiter: Laden bei hohem Volumen
Die Frage, die dieses Modul beantwortet: Was sollte mit Daten passieren, bevor Sie anfangen, sie in Salesforce zu laden?
Ein Migrationsprojekt kann Sie täuschen. Sie haben Daten hier, Sie brauchen sie dort, also fängt jemand an, über Data Loader, die Bulk API, CSV-Dateien, Batch-Größen und Ladereihenfolge zu reden. Diese Dinge zählen. Dort fange ich nicht an. Meine erste Frage lautet: Was genau wollen wir bewegen? Wenn die Quelle doppelte Kunden, ungültige Adressen, veraltete Werte, gebrochene Beziehungen und fünfzehn Jahre Daten enthält, die niemand braucht, wird Salesforce bereitwillig das neue Zuhause für all das. Schnelleres Laden behebt das nicht. Migration ist zuerst ein Qualitätsprojekt.
Start With the Picture
Abschnitt betitelt „Start With the Picture“Here’s Steve Trucking’s landscape from Checkpoint 1, the weekend RouteDesk retires. RouteDesk is the desktop dispatch tool the coordinators used inside each distribution center (DC) to turn manifests into routes. It holds eight years of delivery history, about 5 million deliveries, and the quality varies by DC. At Checkpoint 1 we decided it retires, and we left one question open: what, if anything, comes into the org? That’s a migration decision, and this is the chapter for it. ⟲
One new arrow. It runs once, and then it disappears. ⟲
A migration is an arrow on the landscape like any other. Everything chapter 9 asked of an arrow applies: what moves, how much, by which key, who proves it arrived. The difference is that this arrow has an end. When it’s done, RouteDesk is switched off and the arrow comes off the drawing. That makes it easy to rush, because “we only do it once.” But the data it carries stays in Salesforce for years. ⟲
Schlechte Daten schneller zu bewegen, ist kein Erfolg
Abschnitt betitelt „Schlechte Daten schneller zu bewegen, ist kein Erfolg “Das Altsystem hat 500.000 Kundendatensätze, und wir migrieren 500.000 Kundendatensätze. Waren wir erfolgreich? Vielleicht. Was, wenn 40.000 Duplikate sind, 75.000 seit zehn Jahren nicht aktiv waren, Tausende ungültige Bundesstaatcodes haben, manche keine brauchbare Kennung, manche Kinder auf Elterndatensätze zeigen, die es nicht mehr gibt, und manche Felder je nach Erstellungszeitpunkt des Datensatzes Unterschiedliches bedeuten? Der Bericht kann trotzdem sagen: 500.000 Quelle, 500.000 Ziel, 100 Prozent geladen, und das Projekt kann trotzdem ein Fehlschlag sein. Vollständigkeit zählt, aber Vollständigkeit allein beweist keine Qualität.
Bevor ich das Laden entwerfe, will ich also die Quelle verstehen. Welche Daten gibt es, und was bedeuten sie? Wie alt sind sie, wie vertrauenswürdig, welche Felder werden wirklich genutzt, welche Werte sind gültig, welche Beziehungen existieren, welchen Kennungen kann ich vertrauen? Was sollte die Migration überleben, und was nicht? Hier werden die früheren Kapitel fällig: Kapitel 4 hat uns die Unternehmenslandschaft gelehrt, Kapitel 5, dass Qualität entworfen werden muss, Kapitel 6 Identität und Autorität. Migration wendet all das auf einen bestehenden Datenbestand an. Es geht nicht nur ums Verschieben von Zeilen. Es geht um die Entscheidung, welche Teile der Vergangenheit es verdienen, Teil der künftigen Architektur zu werden.
Migrieren, archivieren oder verwerfen, und wissen, warum
Abschnitt betitelt „Migrieren, archivieren oder verwerfen, und wissen, warum “Ein Migrationsinventar braucht mindestens drei Antworten: migrieren, archivieren oder gemäß Richtlinie verwerfen. Fünf Jahre alte Transaktionsdetails müssen vielleicht aus Compliance-Gründen aufbewahrt werden, ohne im aktiven Datenmodell zu leben; veraltete temporäre Daten haben vielleicht weder eine Aufbewahrungspflicht noch einen Wert; Historie gehört vielleicht in ein durchsuchbares Archiv. Das Lebenszyklusprinzip aus Kapitel 7 lautete „Entwerfen Sie den Ausgang“, und die Migration ist der perfekte Zeitpunkt, es anzuwenden. Tragen Sie nicht jeden Datensatz weiter, nur weil er da ist.
So zoom in on RouteDesk and take it apart, one class of data at a time. ⟲
Every class of data gets a decision, a place and a reason. ⟲
The deliveries not yet made have to come in: manifests arrive one to two days ahead, so on cutover weekend RouteDesk holds about two days of work, roughly 6,400 deliveries, and the crews need them on Monday morning. The recent history comes in because of claims. A damage claim is a Case in Salesforce, and the agent working it needs the delivery behind it. So deliveries still inside the claim window come in too. Steve Trucking accepts claims for 60 days after a delivery, so that’s about 190,000 more Work Orders. Had the business said 30 days, it would be half that. The window is the business’s number, not ours. ⟲
The other 4.8 million deliveries go to Snowflake, where Checkpoint 1 already sends status history, kept by the partner key so a claim on an old delivery can still find it, and so leadership’s five-year reports still work. They don’t belong in the operational core: that would make Salesforce RouteDesk’s retirement home, and chapter 7 showed what Work Orders at volume cost. And the route plans and the coordinators’ drafts? Eight years of yesterday’s plans have no value once the deliveries are done. But I don’t decide that alone. ⟲
The opposite mistake is “we don’t need the old stuff.” Who decided? Legal, finance, operations, service, compliance? The data architect shouldn’t invent retention policy during a migration; we translate the business and regulatory requirement into architecture. Before excluding data, establish whether it must be kept, for how long, where, who needs access, and whether its relationships and source identifiers must survive. Eight years of Recipients’ names, addresses and phone numbers is exactly that kind of question: archiving them isn’t the same as keeping them forever. The goal isn’t to migrate less. It’s to know why every class of data is moving, or isn’t. ⟲
Test knowledge. Migrate what the new system needs to operate, not everything the old one held. Expect a scenario with years of legacy history: the answer is usually to migrate active and recent records and archive the rest outside Salesforce where it stays reachable, with the retention decision made by the business, not by the migration team. ⟲
Where the Preparation Happens
Abschnitt betitelt „Where the Preparation Happens“Before the steps, the place. All of this preparation happens outside Salesforce, in a working database of its own: Postgres, SQL Server, Oracle, MySQL, even SQLite for a small job, whatever the team knows. Not in Salesforce, and not in a spreadsheet that gets emailed around. I call it the preparation data store, or the preparation store for short. It sits in between: the source feeds it, and it feeds Salesforce. ⟲
The preparation data store sits in between. Every step in this module happens inside it. ⟲
The extract lands there raw. The standardizing, cleaning, enriching, deduping and validating all run there, as code. The quarantine is a table, the counts are queries, and the whole thing can be run again from the top. Some tools connect a database like this straight to Salesforce, copying data down and sending changes back; others export files for a data loader. There are many ways to load data. The principle doesn’t change: prepare it outside, then load the result. ⟲
And it holds more than the source. Pull down the relevant parts of the target org too. Why? Because dedupe has to compare against what’s already in Salesforce, and when the survivor of a merge is a record that’s already there, the new children need its key to link to it. You can’t decide the merge without both sides in front of you. For RouteDesk, the preparation store holds the RouteDesk extract and a copy of what Salesforce already has: the Retail Partner Accounts, the Products and Service Territories, the claim Cases with their delivery references, and the Work Orders the new integration has already created, because the partners don’t stop sending manifests for our cutover weekend. ⟲
Then you practice. Run the preparation, load a sandbox, reconcile, find the rule that was wrong, fix it, run it all again. By the time we reach production, the preparation has run many times, and it’s boring. That’s the goal. ⟲
Meine Reihenfolge: standardisieren, bereinigen, anreichern, deduplizieren, validieren
Abschnitt betitelt „Meine Reihenfolge: standardisieren, bereinigen, anreichern, deduplizieren, validieren “When I’m preparing data for migration, I work in this order, and the order matters. All five steps happen in the preparation data store. ⟲
Standardize. Get equivalent values into one form. One source has CA, California and Calif.; another has US, USA and United States. A company comes in as Steve Plumbing, Steve's Plumbing and Steve's Plumbing LLC. Phone numbers arrive as 5555550142, (555) 555-0142 and +1 555 555 0142. Before we compare records or apply matching rules, we need to know which differences are formatting and which are meaningful. ⟲
Names are the classic trap. I had a system with first and last name in one field, and the Salesforce contact needs them apart. “Daniel Reyes” splits easily. Then you get “Mr. Daniel Reyes,” “Daniel Reyes PhD,” “Daniel Reyes III,” and names with two family names, such as Roberto González Suárez, where González isn’t a middle name: split that wrong and you’re in trouble. Build the patterns (two words, three words, a title, a suffix), run the splits, and have the customer validate the results. ⟲
Bereinigen. Mit dem umgehen, was falsch, unbrauchbar oder veraltet ist: ungültige Codes, unmögliche Daten, Tippfehler, Platzhalterwerte, Felder mit Daten, die nicht zu ihrer Bedeutung passen. Ordnen Sie Werte von Auswahllisten bewusst zu: Ein alter Lead-Status Cold wird im Ziel vielleicht zu Closed. Wenn die Liste lang ist (ich habe 200 Werte gesehen), bauen Sie eine Transformationstabelle und lassen Sie das Geschäft für jeden Quellwert den Zielwert eintragen. Salesforce validiert Auswahllisten streng, also fangen Sie diese ab, bevor sie ankommen, und warten Sie nicht darauf, dass Validierungsregeln Ihnen sagen, was Ihre Quelle enthält.
RouteDesk’s “quality varies by DC” shows up right here. Each DC set up its own status codes over eight years, so the same outcome arrives in nine spellings. The transformation table maps every one of them to the Work Order’s status values in Salesforce: ⟲
| DC | RouteDesk says | Work Order status |
|---|---|---|
| DC 1 | DLV | Completed |
| DC 4 | Delivered - OK | Completed |
| DC 7 | DONE/INST | Completed (the install is on its line item) |
| DC 1 | NH | Cannot Complete (nobody home) |
| DC 4 | Refused | Cannot Complete |
| DC 7 | CXL | Canceled |
The left two columns come from profiling the extract; the right column comes from the business, not from us. Completed, Cannot Complete and Canceled are three of the standard Work Order status values (WorkOrder (öffnet in einem neuen Tab), Object Reference, Winter ‘27, checked 2026-10-27). Notice the third row: one RouteDesk code carried two facts, the delivery and the install, and the target model keeps them apart. ⟲
Enrich. Sometimes missing information can be reliably added: a normalized address, a postal code from city and state, a county, a geolocation, a mapping from a legacy code to the new enterprise taxonomy, an enterprise identifier. Enrichment needs provenance. If we add or change information, I want to know where it came from and why I trust it. Some of RouteDesk’s older deliveries don’t name the Retail Partner at all, because each DC served one partner and everybody knew. The DC and the order number’s format tell us which partner it was. That’s enrichment from a rule we can show, not a guess. ⟲
Deduplizieren. Dann die Datensätze finden, die dieselbe Sache in der realen Welt darstellen. Warum nicht hier anfangen? Weil der Abgleich schmutziger Daten schwieriger ist: Steve's Plumbing und STEVES PLUMBING LLC lassen sich nach dem Standardisieren viel leichter vergleichen. Deduplizieren Sie innerhalb der eingehenden Daten, dann gegen das, was schon in Salesforce ist. Die Regel aus Kapitel 6 gilt weiter: Zusammenführen ist zerstörerisch; Verknüpfen nicht. Fassen Sie Datensätze nicht zusammen, weil ein unscharfer Wert überzeugend aussieht.
Validate. Finally, test the transformed data against the target: required information present, reference values valid, relationships resolvable, keys unique where they should be, values fitting the model, authority rules preserved. Only then do I want to talk seriously about loading. And don’t expect the import tool to catch everything. Salesforce’s own Trailhead project on the NPSP importer makes the point: it catches invalid picklist values and missing required fields, but if a spreadsheet turned a postal code like 02134 into the number 2134, the importer loads the four digits (Perform an Import Dry Run (öffnet in einem neuen Tab), Trailhead, checked 2026-10-27). That’s one more reason the preparation lives in a database with typed columns, not in a spreadsheet. ⟲
Five steps, in order. A record that fails one goes somewhere visible, with its reason. ⟲
Test knowledge. Data quality is fixed before the load, not after. Know the preparation steps (standardize, clean, enrich, deduplicate, validate) and why the order matters: you can’t match records reliably until their values are in one form. Picklist values are mapped with a transformation table the business signs off, because Salesforce rejects values a restricted picklist doesn’t have. ⟲
Vor dem Umzug bereinigen
Abschnitt betitelt „Vor dem Umzug bereinigen “Die Versuchung lautet: „Bringen wir erst alles nach Salesforce und räumen danach auf.“ Als Standard mag ich das nicht. Sobald schlechte Daten in der Produktion sind, wirken sie in der Produktion mit: Benutzer sehen sie, Automatisierung, Berichte, Integrationen und Agenten sehen sie, Duplikate sammeln verknüpfte Datensätze an, und das Aufräumen wird schwerer. Wo es praktikabel ist, verbessern Sie die Daten, bevor sie ins Ziel gelangen. Nicht jede historische Unvollkommenheit muss behoben werden; das ist eine Kosten-Nutzen-Entscheidung. Aber „Wir räumen später auf“ ist keine Migrationsstrategie. Es ist technische Schuld mit Starttermin.
And not every record deserves the same effort. An active customer with open orders, open cases, current contracts and billing relationships is different from one who bought something once nine years ago. Both may need to be kept. For the critical, active data I may require stricter validation, more enrichment, closer duplicate review and detailed reconciliation; for low-value history, preserving traceability may matter more than making every record perfect. Architecture is partly deciding where quality effort creates value. For RouteDesk, the 6,400 deliveries the crews will drive to on Monday get the strictest checks. The 4.8 million going to the archive need their keys and their dates right; nobody will fix eight years of typos in delivery notes. ⟲
Bewahren Sie die Quellidentität, und laden Sie über Schlüssel
Abschnitt betitelt „Bewahren Sie die Quellidentität, und laden Sie über Schlüssel “Einer der leichtesten Fehler ist, die Fähigkeit zu verlieren, einen Salesforce-Datensatz bis zu seiner Herkunft zurückzuverfolgen. Wenn der Altkunde CUST-847291 zum Account 001… wird, will ich trotzdem wissen, dass er von CUST-847291 stammt, für Abgleich, Fehlersuche, erneutes Laden, Audits, das Zuordnen von Kinddatensätzen, Rollback-Analysen und die Fragen, die nach dem Start kommen. Die neue Salesforce-ID zählt innerhalb von Salesforce; sie löscht die Quellidentität nicht. Das ist das Prinzip der externen ID aus Kapitel 9. Migration und Integration treffen sich bei der Identität.
At Steve Trucking they meet in one field. Every Work Order already carries the partner’s key, Partner_Delivery_Key__c, an External ID marked unique, holding values like REDROCK-8472914-1 (chapter 9, module 2). RouteDesk kept the partner’s order number on each delivery, so the migration builds the same key and upserts on it, exactly as the integration does. That matters on cutover weekend: if Redrock resends a manifest for Tuesday after we’ve loaded Tuesday from RouteDesk, the integration finds the migrated Work Order and updates it instead of creating a second one. RouteDesk’s own delivery number comes along too, in a plain field, so anyone can trace a Work Order back to the record it came from. ⟲
So don’t rebuild relationships by name (“find the Account whose Name is Acme Distribution”). If the legacy contact carries Legacy_Account_ID = CUST-847291 and the Salesforce Account carries that identifier as an External ID, the relationship is rebuilt deterministically. The Bulk API does this in the load file itself: a column header such as WorkOrder.Partner_Delivery_Key__c says “find my parent by this indexed field,” and Salesforce looks up the parent’s ID for you (Relationship Fields in a Header Row (öffnet in einem neuen Tab), Bulk API 2.0 and Bulk API Developer Guide, checked 2026-10-27). Keys turn “I think this child belongs here” into “I know which parent this came from,” and that matters more as the Number of Zeros grows. ⟲
Relationships also create sequence. If contacts reference accounts, the accounts must exist first; if line items reference orders and products, those come first. So migration isn’t one giant load. It’s reference data, parents, children, junctions, then dependent history, in an order the target data model dictates. That’s one more reason the data architect belongs in migration planning: the model tells us how the migration has to be assembled. Here’s RouteDesk’s open work, on Checkpoint 1’s model. ⟲
Wave 1: what the Work Orders will point to has to exist first. Most of it already does. ⟲
Wave 2: the Work Orders, upserted by the partner key. ⟲
Wave 3: the children, each finding its Work Order by the same key. ⟲
Wave 4: the claim Cases already in Salesforce get their link to the delivery. The model sets the order. ⟲
Test knowledge. Keep each legacy record’s key in an External ID field, load parents before children, and let each child find its parent by that key: an upsert on the External ID, and a relationship column in the load file (
Parent.External_Id__c) instead of looking up Salesforce IDs. Reloads then update instead of duplicating, and every record traces back to its source. ⟲
Zusammengeführte Datensätze brauchen eine Strategie für die Kinder
Abschnitt betitelt „Zusammengeführte Datensätze brauchen eine Strategie für die Kinder “Hier ist das Problem, das unterschätzt wird. Die Analyse ergibt, dass die Altkunden A, B und C derselbe Kunde sind, also bekommt das Ziel einen Account. Gut. Aber A hat 12 Kundenvorgänge, B hat 4 Bestellungen und C hat 3 Kontakte. Führen Sie die Elterndatensätze gedanklich zusammen, ohne die Zuordnung der Kinder neu zu entwerfen, und Sie haben den Elterndatensatz gelöst und die Beziehungen zerbrochen. Jede Entscheidung zum Deduplizieren braucht eine Strategie für die Kinder.
RouteDesk has its own version. When a partner revised a manifest on the day, a coordinator sometimes keyed the delivery in again instead of editing it. Now RouteDesk has two deliveries with the same partner order number: one with the old window and two stops, one with the new window and the crew’s notes. Salesforce will have one Work Order, because the partner key is unique. Which window wins, and what happens to the stops and notes on the other one? ⟲
Zuerst die Felder: Wenn zwei Datensätze übereinstimmen, welche Werte gewinnen? Leer gegen einen Wert ist leicht. Ein Widerspruch nicht: Steven oder Stephen, die E-Mail in Salesforce oder die im Ladevorgang? Wählen Sie einen überlebenden Datensatz und entscheiden Sie Feld für Feld, und legen Sie dem Geschäft früh Beispielfälle vor, damit seine Fingerabdrücke auf den Entscheidungen sind.
Then the children. I see three options: add the children to the survivor, don’t load the merged record’s children, or load the merged record as inactive, linked to the survivor, with its children kept on it. ⟲
Three ways, none free. Notice the third one at RouteDesk: the inactive duplicate can’t reuse the partner key, because the survivor already holds it, so it needs a key of its own. ⟲
Whichever you choose, it happens in the preparation store, before anything loads. That’s where the survivor is picked, sometimes a record that’s already in Salesforce, pulled down with its key. That’s where each child gets the key of the parent it will point to. And that’s where the merged record either keeps its children, hands them over or is left out. Salesforce receives the result of the merge, not the job of doing it. ⟲
Wie wähle ich? Es hängt davon ab, wie kritisch die Daten sind und ob wir Nachverfolgbarkeit zu dem brauchen, was geladen wurde. Und wägen Sie das Risiko gegen den Nutzen des Zusammenführens überhaupt ab. Die Kaufhistorie der falschen zwei Personen in einer Kundenliste des Handels zu verbinden, ist ärgerlich; die Medikamente eines Patienten im Datensatz eines anderen Patienten anzuzeigen, ist ein schwerer Verstoß. Je höher der Einsatz eines falschen Treffers, desto vorsichtiger das Zusammenführen. Was auch immer Sie entscheiden: Lässt sich jedes Kind noch bis zu seiner ursprünglichen Quelle zurückverfolgen? Deduplizieren bei der Migration ist nicht „Duplikatabgleich auf Accounts laufen lassen“. Der ganze Beziehungsgraph zählt.
Ich war schon auf der anderen Seite. Ein Händler, bei dem ich seit meiner Studienzeit kaufte, migrierte seine Kundendaten, und als wir nachsahen, tauchte Steve Simpson unter etwa einem halben Dutzend E-Mail- und Postadressen auf: meine Adresse aus der Studienzeit, das Haus, das ich gemietet hatte, die Orte danach. Sollten wir sie zusammenführen? Es gibt andere Steve Simpsons. Das Geschäft entschied, dass es das Verbinden meiner alten Historie nicht wert war, wenn das Risiko bestand, mich mit dem falschen Steve Simpson zusammenzuführen. Das ist die Frage, die jedes Zusammenführen beantworten muss: Was ist der Nutzen, die Daten zusammenzubringen, und was ist das Risiko, die falschen Menschen zu erwischen?
Test knowledge. Deduplicate before the load, within the incoming data and against what’s already in Salesforce, with matching rules and a survivor chosen field by field. Expect the follow-up question: what happens to the merged record’s child records? Re-parent them to the survivor, leave them out (and archive them), or keep them on an inactive linked record. Each has a cost. ⟲
Wiederholbare Transformationen, die Rohquelle behalten
Abschnitt betitelt „Wiederholbare Transformationen, die Rohquelle behalten “Der alte Status A wird zu Active, I zu Inactive, S zu Suspended. Wo lebt diese Zuordnung? Nicht im Gedächtnis von jemandem, nicht in einer Excel-Formel, die in drei Dateien unterschiedlich kopiert wurde, nicht als manueller Schritt am Freitagabend. Wenn wir morgen neu laden, sollten wir dasselbe Ergebnis bekommen, also müssen Zuordnungen, Standardisierungs- und Bereinigungsregeln, Transformationen, Entscheidungen zum Deduplizieren und die Erzeugung von Schlüsseln alle reproduzierbar sein. Der Migrationsprozess ist Code, auch wenn manche Teile nicht wörtlich in einer Programmiersprache geschrieben sind.
And don’t destroy the starting point. Keep the original extract in raw tables, exactly as it came out, and never change them. Each step writes its result to a new staged table: standardized, cleaned, deduplicated, load-ready. When something looks wrong, I want to know whether it was wrong in the source, changed by our transformation, changed by the load, or changed by Salesforce automation afterward, and with every table kept I can walk back through them and find out. Overwrite your only copy of the source while cleaning it and you lose the evidence. ⟲
I learned how much this pays off on a support migration. A company was moving its support desk from Zendesk into Salesforce, and Zendesk’s tickets were very similar to Salesforce Cases, but not exact. So I loaded every Zendesk export into a SQL database as raw tables, one per Zendesk structure: organizations, users, tickets, custom fields, comments, attachments. Then I built interim tables that got closer and closer to the Salesforce structure, with the field and picklist mappings kept as tables of their own. Then I loaded Salesforce from those tables and brought the Salesforce IDs back. In the end every row had three things: its original Zendesk key, the transformations that had been applied to it, which were never one way, and its Salesforce key. That’s what let me do partial loads and reloads whenever I needed to. ⟲
Here’s the same design for RouteDesk, one step at a time. ⟲
Extract: one raw table per RouteDesk structure, each row with its RouteDesk key. These tables never change. ⟲
Generate: new tables shaped for Salesforce, built from the raw ones with the mapping tables. The raw tables are still there. ⟲
Load: the Work Orders upserted by the partner key, then their children. ⟲
Keys back: each Salesforce ID is written to its row. Now every row knows where it came from, what was done to it and where it landed. ⟲
So no transformation is allowed to lose fidelity. If a step throws information away (truncates a note, drops a code it didn’t recognize, keeps one of two conflicting values without saying which), I can’t trace back through it, and I can’t repeat the run and get the same answer. Keep the raw tables, keep the staged tables, keep what each load sent and what came back. Then you can rerun the whole thing from the raw extract at any time, and you have the history of every load. This is migration’s version of lineage: preserve where the data came from and what you did to it. ⟲
Sometimes the Staging Is Inside Salesforce
Abschnitt betitelt „Sometimes the Staging Is Inside Salesforce“The preparation store isn’t the only place to stage. In a few special cases, the last stop before the real objects is a plain custom object inside Salesforce: one flat row per source record, no automation, loaded fast. Then a batch process works through the rows and builds the real records. I’ve used it when Salesforce’s own logic had to create the records and was too slow to load through: a scheduling process that took a few seconds per appointment. Module 3 comes back to that case. ⟲
Salesforce uses the same pattern in its own products, and it’s worth learning from. The Nonprofit Success Pack loads a spreadsheet into its NPSP Data Import object first. A dry run checks for matches without creating anything. Then the importer creates the accounts, contacts and donations, and writes each new record’s ID back onto the row it came from (How the Import Process Works (öffnet in einem neuen Tab), Salesforce Help, checked 2026-10-27). That’s a reference, not a rule: staging inside Salesforce is the special case, not the way to load everything. ⟲
For RouteDesk, a one-time move with heavy cleaning and merging, the preparation store outside Salesforce does the work, and the load sends the result. ⟲
Schlechte Datensätze brauchen einen Ort
Abschnitt betitelt „Schlechte Datensätze brauchen einen Ort “Von 500.000 Datensätzen bestehen 497.800 die Validierung und 2.200 nicht. Still verwerfen? Nein. Müll in Pflichtfelder zwingen? Nein. Das Projekt anhalten, bis jeder historische Datensatz perfekt ist? Wahrscheinlich nicht. Ich will einen Weg für Quarantäne und Nachbesserung, der festhält, welcher Quelldatensatz gescheitert ist, warum, welche Regel ihn abgelehnt hat, ob er vor der Umstellung behoben werden muss, wem die Entscheidung gehört und ob sie aufgeschoben werden kann. Jetzt sind Ausnahmen sichtbare Architekturarbeit statt versteckten Datenverlusts.
Before you call a record bad, look at the rule that rejected it. Sometimes the record is fine and the rule is wrong. Salesforce’s Well-Architected framework puts it plainly: “data architecture decisions determine the populations that become visible—and invisible,” and a required email address “excludes populations that don’t have reliable internet access or personal email addresses” (Fairness (öffnet in einem neuen Tab), checked 2026-10-27). RouteDesk has thousands of deliveries where the Recipient gave only a phone number. If the new Work Order requires an email, those aren’t bad records. They’re real people the rule would make invisible. Fix the rule, not the person. ⟲
Dann beweisen Sie die Transformation vor dem Laden. Mit wie vielen Quelldatensätzen haben wir begonnen, wie viele haben wir bewusst ausgeschlossen, wie viele Duplikate wurden konsolidiert, wie viele sind bereit, wie viele in Quarantäne, wie viele Eltern-Kind-Beziehungen lassen sich auflösen, und wie lauten die Kontrollsummen? Wenn die Zahlen vor dem Laden nicht aufgehen, hilft schnelleres Laden nicht. Modul 4 beweist die Migration mit Anzahlen, Summen, Stichproben und aggregierten Berichten, aber der Beweis beginnt hier.
KI kann beim Bereinigen helfen. Wahrheit erfinden darf sie nicht.
Abschnitt betitelt „KI kann beim Bereinigen helfen. Wahrheit erfinden darf sie nicht. “KI ist bei der Migration nützlich: Zuordnungen vorschlagen, verdächtige Werte finden, mögliche Duplikate gruppieren, Anomalien erkennen, Transformationscode erzeugen, Muster in abgelehnten Datensätzen erklären. Aber wenn ein Anreicherungsprozess entscheidet „Diese Firma ist wahrscheinlich in Arizona“, reicht „wahrscheinlich“ nicht. Und wenn er entscheidet, dass zwei Kunden ähnlich genug zum Zusammenführen aussehen, denken Sie an Kapitel 6: Ein falscher Treffer kann mehr Schaden anrichten als zu wenig Abgleich. Nutzen Sie KI, um die Untersuchung zu beschleunigen. Lassen Sie sie nicht still maßgebliche Unternehmensdaten fabrizieren.
Über die Prüfung hinaus: Was KI ändert. KI kann Profiling, Zuordnung, Anomalieerkennung und das Finden von Kandidaten für den Abgleich während einer Migration drastisch beschleunigen. Halten Sie deterministische Regeln, Herkunft und menschliche Prüfung rund um Entscheidungen, die maßgebliche Geschäftsdaten erzeugen, zusammenführen oder verändern.
Was Architekt:innen hier entscheiden
Abschnitt betitelt „Was Architekt:innen hier entscheiden “- Welche Quelldaten nach geschäftlichem Wert und Aufbewahrungsanforderungen migriert, archiviert oder ausgeschlossen werden.
- Where preparation happens (a preparation store outside Salesforce, a staging object inside it, or both), and which parts of the target org are pulled down to merge against. ⟲
- Wie Daten standardisiert, bereinigt, angereichert, dedupliziert und validiert werden, bevor sie ins Ziel gelangen.
- Welche Quellkennungen und welche Datenherkunft überleben, damit jeder wichtige Zieldatensatz nachverfolgt und abgeglichen werden kann.
- The load order the target data model dictates, and the keys each child uses to find its parent. ⟲
- Wie Entscheidungen zum Deduplizieren Felder und Kinder über den ganzen Beziehungsgraphen behandeln, abgewogen nach Kritikalität, Nachverfolgbarkeit und dem Risiko eines falschen Zusammenführens.
- Welche Regeln für Transformation und Ausnahmebehandlung wiederholbar sein müssen, bevor irgendein Ladevorgang in der Produktion beginnt.
Messen Sie Migration nicht an geladenen Zeilen
Abschnitt betitelt „Messen Sie Migration nicht an geladenen Zeilen “„Wir haben 500.000 von 500.000 Datensätzen geladen“ sagt mir, dass das Ladewerkzeug funktioniert hat. Ich will wissen: Haben wir die richtigen Daten bewegt, verbessert, was verbessert werden musste, Identität und Beziehungen bewahrt, Duplikate sicher konsolidiert? Können wir erklären, was wir ausgeschlossen haben, die Transformation reproduzieren, einen Salesforce-Datensatz bis zu seiner Quelle verfolgen und das Ergebnis beweisen? Machen Sie diese Arbeit zuerst. Dann kümmern wir uns darum, wie schnell wir laden können.
Weiterlesen
Abschnitt betitelt „Weiterlesen “- Salesforce, General Guidelines for Data Loads (öffnet in einem neuen Tab) and Relationship Fields in a Header Row (öffnet in einem neuen Tab), Bulk API 2.0 and Bulk API Developer Guide, checked 2026-11-01. ⟲
- Salesforce, WorkOrder (öffnet in einem neuen Tab), Object Reference for the Salesforce Platform, Winter ‘27 (API version 68.0), checked 2026-11-01. ⟲
- Salesforce Help, How the Import Process Works (öffnet in einem neuen Tab) (the Nonprofit Success Pack’s staging object), checked 2026-11-01. ⟲
- Hands-on: the Trailhead trail Import Data With Nonprofit Success Pack (NPSP) (öffnet in einem neuen Tab) walks through the whole staging pattern in a practice org: a template, staging rows, a dry run, fixing the failed rows, then the import. It runs in a Trailhead Playground; Trailhead notes that as of December 2025, NPSP is no longer offered as a preconfigured package in production orgs. Checked 2026-10-27. ⟲
- Salesforce Architects, Well-Architected, Fairness (öffnet in einem neuen Tab), checked 2026-11-01. ⟲
- In this course: Master Data and Identity (matching, survivorship, link vs merge), Data Quality and Governance, and Keys and Write Ownership (the partner key). ⟲
- Trailhead, Perform an Import Dry Run (öffnet in einem neuen Tab), checked 2026-11-01. ⟲
