Mass Transfer Ownership
Activate when an admin needs to move a non-trivial volume of records (typically >100, often tens of thousands) from one or more current owners to one or more new owners. The skill produces a transfer plan covering tool selection, child-record cascading rules, sharing recalculation timing, and a rollback path.
Before Starting
Gather this context before working on anything in this domain:
- Volume per object (Accounts, Opportunities, Contacts, Cases, custom objects). Above ~250k records on a single object, sharing recalc dominates the timeline and a maintenance window is required.
- Whether the transfer is a single-source-to-single-target swap, a many-to-many remap (e.g., a CSV mapping old owner → new owner), or a queue-to-user / user-to-queue move. Each uses different tooling.
- Whether child records should follow. Account.OwnerId reassignment can optionally cascade to child Cases and Opportunities through the Mass Transfer tool's checkboxes; Data Loader does not cascade — every child object must be transferred explicitly.
- Whether the org has Apex triggers, validation rules, or workflow rules that fire on Owner change. These can fail or send unwanted notifications during a 50,000-record transfer.
Core Concepts
Tool selection
| Tool |
Best for |
Limit |
| Setup → Data Management → Mass Transfer Records |
<50k records on standard objects (Accounts, Leads, Opportunities), simple one-to-one reassignment, with cascade-to-children checkboxes |
UI-only, no CSV mapping; many-to-many requires repeated runs |
| Data Loader Update |
Any object, any volume, mapping CSV |
No cascade — each child object is its own job; emits triggers and workflow |
Apex (Database.update with AllOrNone=false) |
Many-to-many remap with conditional logic, suppression of email notifications, batched sharing recalc |
Requires careful governor-limit-aware batching |
Anonymous Apex Batch (Database.Batchable) |
>250k records where sharing recalc would otherwise lock the org |
Asynchronous; needs progress monitoring |
Sharing recalculation
Owner changes trigger sharing recalculation for the record and its children if the org-wide default is not Public Read/Write. On large objects, recalc can extend the transaction by hours. For >100k records, Salesforce recommends using Defer Sharing Calculations (a feature you must request via Support) so the transfer completes first and recalc runs in a controlled window.
Cascade behavior
Account ownership change cascades to child Cases, Contacts, and Opportunities only when the Mass Transfer Records tool's "Transfer ... " checkboxes are ticked. API-driven updates (Data Loader, Apex) do not cascade. If you want child records to follow the parent through API, you must update each child object as a separate operation.
Common Patterns
Pattern: user departure cleanup
When to use: A sales rep is terminated. Reassign all their open Accounts, Opportunities, and Cases to their manager before deactivating the user.
How it works: Query OwnerId = '005...' per object. Use Data Loader Update with a single OwnerId column. Run before deactivation — Salesforce blocks deactivation if the user owns active records or is referenced as a default owner.
Why not the alternative: Mass Transfer Records works for Accounts but won't transfer Cases or custom objects in one pass.
Pattern: territory realignment via mapping CSV
When to use: 30 territories collapsing to 18; each old owner maps to a new owner.
How it works: Build CSV OldOwnerId, NewOwnerId. Per object, build a SOQL query joined to the mapping (in a spreadsheet or via Apex). Update OwnerId via Data Loader. Defer sharing recalculation in advance for large volumes.
Pattern: queue ↔ user transfer
When to use: Cases sitting in a queue need to be assigned to a specific user.
How it works: OwnerId can be a Queue ID (starts with 00G) or a User ID (starts with 005). Update through Data Loader the same way, but verify the target object has Queue support enabled in Setup.
Decision Guidance
| Situation |
Recommended Approach |
Reason |
| <50k records, standard object, parent-with-children cascade desired |
Mass Transfer Records |
Built-in cascade, no scripting |
| Any object, CSV-driven mapping, no cascade |
Data Loader Update |
Cleanest for one-table-at-a-time |
| >250k records on one object |
Apex Batch + deferred sharing recalc |
Avoids row-lock and recalc timeouts |
| Need to suppress notifications and trigger logic |
Apex with custom-setting flag your triggers honor |
Tool-based transfers fire triggers and workflows |
Recommended Workflow
- Inventory: per-object record counts under the source-owner criteria. Write to a planning doc.
- Choose the tool from the decision table above. If mixed (e.g., Accounts via Mass Transfer + Cases via Data Loader), document each step with its order.
- Set the policies before executing.
- Cascade: do child Cases/Opportunities/Contacts follow the parent Account? Tick the Mass Transfer checkboxes accordingly, or queue follow-up Data Loader jobs for each child object.
- Trigger/workflow: turn off email notifications via the "Send Email" checkbox (Mass Transfer Records UI), or set a custom-setting flag your triggers honor to short-circuit during the migration.
- Sharing: for >100k on a single object, request Defer Sharing Calculations from Support before starting; resume recalc in a maintenance window.
- Execute.
- Sandbox first; capture timing and any trigger errors.
- Then production with
AllOrNone=false (Apex) or "Continue on error" (Data Loader) so a single bad record doesn't stop the batch. Capture the success+error CSVs as the audit trail.
- Validate: rerun the source-owner query — should return zero. Verify a sample of child-record ownership matches expectation.
Review Checklist
Salesforce-Specific Gotchas
- User deactivation blocks if records remain — Salesforce refuses to deactivate users who own active records or are listed as default queue/owner. Always transfer before deactivating.
- Sharing recalc can lock other writes — On a 500k-record transfer, downstream sharing recalc can extend the lock; concurrent integrations may time out. Use deferred sharing recalc.
- Data Loader does not cascade ownership — Updating Account.OwnerId leaves child Case.OwnerId untouched. Plan child object updates explicitly.
- OwnerId on a Queue is a
00G prefix — Some custom objects don't allow Queue ownership; check the object's "Allow Queues" before targeting 00G IDs.
- AssignmentRuleHeader on the update toggles routing — If you don't want assignment rules to fire during the migration, omit the header (Apex) or uncheck the Data Loader option.
Output Artifacts
| Artifact |
Description |
| Per-object volume inventory |
Counts and source criteria for each object in scope |
| Transfer execution plan |
Ordered list of tool runs with cascade and notification settings |
| Rollback CSV |
record-id, old-owner-id, new-owner-id — re-runnable in reverse |
| Validation queries |
SOQL that should return zero rows post-transfer |
Related Skills
- admin/user-management — context on user deactivation pre-conditions and transfer-before-deactivate sequencing
- data/data-loader-batch-window-sizing — sizing the Data Loader batch parameter to keep sharing recalc tractable
- security/record-access-troubleshooting — when post-transfer users report missing records (sharing recalc not yet completed)
1---2name: mass-transfer-ownership3description: Use when re-assigning record OwnerId across many records — territory realignment, employee departure, region split, integration cleanup. Triggers: 'mass transfer accounts', 'reassign opportunities to new owner', 'transfer all records on user deactivation', 'OwnerId migration'. NOT for auto-assigning new records — use admin/assignment-rules. NOT for territory assignment data — use data/territory-data-alignment.4---56# Mass Transfer Ownership78Activate when an admin needs to move a non-trivial volume of records (typically >100, often tens of thousands) from one or more current owners to one or more new owners. The skill produces a transfer plan covering tool selection, child-record cascading rules, sharing recalculation timing, and a rollback path.910---1112## Before Starting1314Gather this context before working on anything in this domain:1516- Volume per object (Accounts, Opportunities, Contacts, Cases, custom objects). Above ~250k records on a single object, sharing recalc dominates the timeline and a maintenance window is required.17- Whether the transfer is a single-source-to-single-target swap, a many-to-many remap (e.g., a CSV mapping old owner → new owner), or a queue-to-user / user-to-queue move. Each uses different tooling.18- Whether child records should follow. Account.OwnerId reassignment can optionally cascade to child Cases and Opportunities through the Mass Transfer tool's checkboxes; Data Loader does not cascade — every child object must be transferred explicitly.19- Whether the org has Apex triggers, validation rules, or workflow rules that fire on Owner change. These can fail or send unwanted notifications during a 50,000-record transfer.2021---2223## Core Concepts2425### Tool selection2627| Tool | Best for | Limit |28|---|---|---|29| Setup → Data Management → Mass Transfer Records | <50k records on standard objects (Accounts, Leads, Opportunities), simple one-to-one reassignment, with cascade-to-children checkboxes | UI-only, no CSV mapping; many-to-many requires repeated runs |30| Data Loader Update | Any object, any volume, mapping CSV | No cascade — each child object is its own job; emits triggers and workflow |31| Apex (`Database.update` with `AllOrNone=false`) | Many-to-many remap with conditional logic, suppression of email notifications, batched sharing recalc | Requires careful governor-limit-aware batching |32| Anonymous Apex Batch (`Database.Batchable`) | >250k records where sharing recalc would otherwise lock the org | Asynchronous; needs progress monitoring |3334### Sharing recalculation3536Owner changes trigger sharing recalculation for the record and its children if the org-wide default is not Public Read/Write. On large objects, recalc can extend the transaction by hours. For >100k records, Salesforce recommends using *Defer Sharing Calculations* (a feature you must request via Support) so the transfer completes first and recalc runs in a controlled window.3738### Cascade behavior3940Account ownership change cascades to child Cases, Contacts, and Opportunities only when the Mass Transfer Records tool's "Transfer ... " checkboxes are ticked. API-driven updates (Data Loader, Apex) do **not** cascade. If you want child records to follow the parent through API, you must update each child object as a separate operation.4142---4344## Common Patterns4546### Pattern: user departure cleanup4748**When to use:** A sales rep is terminated. Reassign all their open Accounts, Opportunities, and Cases to their manager before deactivating the user.4950**How it works:** Query `OwnerId = '005...'` per object. Use Data Loader Update with a single OwnerId column. Run before deactivation — Salesforce blocks deactivation if the user owns active records or is referenced as a default owner.5152**Why not the alternative:** Mass Transfer Records works for Accounts but won't transfer Cases or custom objects in one pass.5354### Pattern: territory realignment via mapping CSV5556**When to use:** 30 territories collapsing to 18; each old owner maps to a new owner.5758**How it works:** Build CSV `OldOwnerId, NewOwnerId`. Per object, build a SOQL query joined to the mapping (in a spreadsheet or via Apex). Update OwnerId via Data Loader. Defer sharing recalculation in advance for large volumes.5960### Pattern: queue ↔ user transfer6162**When to use:** Cases sitting in a queue need to be assigned to a specific user.6364**How it works:** OwnerId can be a Queue ID (starts with `00G`) or a User ID (starts with `005`). Update through Data Loader the same way, but verify the target object has Queue support enabled in Setup.6566---6768## Decision Guidance6970| Situation | Recommended Approach | Reason |71|---|---|---|72| <50k records, standard object, parent-with-children cascade desired | Mass Transfer Records | Built-in cascade, no scripting |73| Any object, CSV-driven mapping, no cascade | Data Loader Update | Cleanest for one-table-at-a-time |74| >250k records on one object | Apex Batch + deferred sharing recalc | Avoids row-lock and recalc timeouts |75| Need to suppress notifications and trigger logic | Apex with custom-setting flag your triggers honor | Tool-based transfers fire triggers and workflows |7677---7879## Recommended Workflow80811. **Inventory:** per-object record counts under the source-owner criteria. Write to a planning doc.822. **Choose the tool** from the decision table above. If mixed (e.g., Accounts via Mass Transfer + Cases via Data Loader), document each step with its order.833. **Set the policies before executing.**84 - Cascade: do child Cases/Opportunities/Contacts follow the parent Account? Tick the Mass Transfer checkboxes accordingly, or queue follow-up Data Loader jobs for each child object.85 - Trigger/workflow: turn off email notifications via the "Send Email" checkbox (Mass Transfer Records UI), or set a custom-setting flag your triggers honor to short-circuit during the migration.86 - Sharing: for >100k on a single object, request Defer Sharing Calculations from Support before starting; resume recalc in a maintenance window.874. **Execute.**88 - Sandbox first; capture timing and any trigger errors.89 - Then production with `AllOrNone=false` (Apex) or "Continue on error" (Data Loader) so a single bad record doesn't stop the batch. Capture the success+error CSVs as the audit trail.905. **Validate:** rerun the source-owner query — should return zero. Verify a sample of child-record ownership matches expectation.9192---9394## Review Checklist9596- [ ] Per-object volumes inventoried; tool chosen against the decision table97- [ ] Cascade policy explicit (children follow or stay)98- [ ] Notification policy explicit (suppress workflow emails during transfer)99- [ ] Triggers reviewed for OwnerId-change side effects (assignment rule re-fire, ownership-based sharing rule, etc.)100- [ ] Defer sharing recalc requested if volume warrants101- [ ] Rollback CSV captured (Old + New OwnerId by record ID) so a reverse update is one click102- [ ] Audit log saved (Data Loader success/error CSVs, or Apex DML log)103104---105106## Salesforce-Specific Gotchas1071081. **User deactivation blocks if records remain** — Salesforce refuses to deactivate users who own active records or are listed as default queue/owner. Always transfer before deactivating.1092. **Sharing recalc can lock other writes** — On a 500k-record transfer, downstream sharing recalc can extend the lock; concurrent integrations may time out. Use deferred sharing recalc.1103. **Data Loader does not cascade ownership** — Updating Account.OwnerId leaves child Case.OwnerId untouched. Plan child object updates explicitly.1114. **OwnerId on a Queue is a `00G` prefix** — Some custom objects don't allow Queue ownership; check the object's "Allow Queues" before targeting `00G` IDs.1125. **AssignmentRuleHeader on the update toggles routing** — If you don't want assignment rules to fire during the migration, omit the header (Apex) or uncheck the Data Loader option.113114---115116## Output Artifacts117118| Artifact | Description |119|---|---|120| Per-object volume inventory | Counts and source criteria for each object in scope |121| Transfer execution plan | Ordered list of tool runs with cascade and notification settings |122| Rollback CSV | record-id, old-owner-id, new-owner-id — re-runnable in reverse |123| Validation queries | SOQL that should return zero rows post-transfer |124125---126127## Related Skills128129- admin/user-management — context on user deactivation pre-conditions and transfer-before-deactivate sequencing130- data/data-loader-batch-window-sizing — sizing the Data Loader batch parameter to keep sharing recalc tractable131- security/record-access-troubleshooting — when post-transfer users report missing records (sharing recalc not yet completed)