| Contact (individual)Name, DOB, contact details |
Person AccountFirstName / LastName / PersonBirthdate req |
direct |
Confirm Person Accounts are enabled before loading. Some firms use Contact plus Household instead. |
| ContactPhones, emails and addresses (multiple) |
Person AccountPrimary fields + Contact Point records |
split |
Primary values go to standard fields. Extras go to Contact Point records or custom fields. |
| Household / familyHousehold name |
Account (Household record type)Name req |
direct |
|
| Family member + roleRelationship |
Account Contact RelationshipRoles / Primary Group flag req |
association |
Head of household, spouse, dependent and so on become ACR roles. |
| Contact (business)Organization record |
Account (Business)Name, address, phone |
direct |
|
| ContactType / Category / Status |
Person AccountClient category and status fields |
picklist map |
Clean up the value lists before mapping. They are often inconsistent. |
| ContactServicing advisor / writing advisor |
Person AccountOwnerId / primary advisor field req |
lookup |
Match advisors to Salesforce users by email. |
| ContactTags |
Person AccountMulti-select picklist or Topics |
picklist map |
|
| ContactUser-defined fields |
Person AccountCustom fields |
manual review |
Keep only the fields someone still uses. |
| ContactTax ID / SSN |
—— |
drop |
Not migrated by default. Bring it only with an approved security design. |
| Financial accountAccount number, type, balance |
Financial AccountAccount number, type, balance |
manual review |
If a custodian feed will run, it becomes the source of truth. Redtail accounts are reference only. |
| Financial accountHistorical balances and posted transactions |
Financial Account / Financial Account TransactionBalance and transaction records |
direct |
Load balances and posted transactions as of the extract date instead of recalculating them. Fees and adjustments may have been edited or waived in the source. |
| ActivitiesCategory (category later deleted) |
Task / EventCategory picklist / Subject |
picklist map |
Activities whose category was deleted in Redtail can export with a blank category while the Redtail screen still shows a default one. Decide before mapping whether to keep the original category name (as an inactive picklist value or in the subject) or map blanks to a default, so history does not come across uncategorized. |
| ActivitiesActivities for former clients or with no linked contact |
—— |
drop |
Agree a scope filter before the first realistic test load, for example drop former-client activities older than an agreed cutoff and activities not tied to any contact. Client status usually has to come from a separate export, so line that up early. |
| ActivitiesActivities (calls, meetings, tasks) |
Task / EventSubject, dates, WhoId / WhatId |
association |
|
| Activities (events)Activity date and start date |
EventActivityDate / StartDateTime |
derive |
Salesforce rejects an event whose activity date differs from its start date. Set both from the source start date; a completion date cannot be used for events. Tasks do not have this constraint. |
| Activities (tasks)Completed by |
Task— |
drop |
Salesforce Task has no completed-by field, only OwnerId (assigned to). Drop it from the mapping, or keep the name in the description if the history matters. |
| ActivitiesCreated by (no last-modified-by in the source) |
Task / EventCreatedById / LastModifiedById |
lookup |
The source has no last-modified-by, so reuse the created-by user for both. Needs the "Set Audit Fields upon Record Creation" permission; check after the load that LastModifiedById did not fall back to the load user. |
| ActivitiesCategory |
Task / EventSubject |
concat |
Prefix the category to the subject (for example "Client review: …") so it stays visible in list views and search without a custom field. |
| Activities / tasksAssigned user (former or inactive employee) |
Task / EventOwnerId |
lookup |
Users who will not exist in Salesforce map to an agreed placeholder user. Keep the original name in a text field if it matters for history. |
| Activities (events)Location |
EventLocation |
direct |
Map the source event location to the standard Location field so it shows on the event and in calendar views. |
| ActivitiesDetails (linked steps, step tasks, notes and comments) |
Task / EventDescription |
concat |
There is no single details field in the source. Build the description by joining the activity's linked step, step-task, note and comment text, and have the business confirm the result on a sample before the full load. |
| Activities (tasks)Activity date |
TaskActivityDate |
derive |
Take the date from the activity record itself, not from a join to completed-instance records, which can return the wrong date. Agree which record date to use (due, completed or last updated) and check it on a sample. |
| ActivitiesAdded-by user vs. user who worked the activity |
Task / EventOwnerId |
derive |
The added-by user is often not the person who did the work, so owners come out wrong if it is mapped straight across. Where the source records who completed or last worked the activity, use that user and fall back to added-by. Spot-check owners with the client before the production load. |
| NotesNotes |
ContentNoteContent |
direct |
Preserve note dates and authors. |
| Notes / activitiesRich-text body (HTML, line breaks) |
ContentNote / TaskContent / Description |
derive |
CSV-based pipelines often strip HTML and line breaks. Swap line breaks for a placeholder before export and restore them after load. |
| Notes / activitiesText with non-ASCII characters |
ContentNote / Task / EventContent / Subject / Description |
derive |
One stray non-ASCII character can make a cleanup or CSV step silently drop whole rows. Keep extracts in UTF-8, replace or normalize the characters instead of discarding the row, and reconcile record counts after every transform step. |
| NotesNotes that only record a completed activity or workflow |
—— |
drop |
System-generated completion notes duplicate the activity or workflow record. Filter them out instead of migrating them as separate notes. |
| NotesComments on excluded workflow-generated notes |
CaseDescription |
concat |
Dropping completion notes also drops any comments on them. Join comment → note → note association → workflow and append the comments to the matching Case. If the join is impractical, add the few that remain by hand after the load. |
| WorkflowsWorkflow templates |
Action Plan templates / FlowTemplate steps |
rebuild |
|
| Workflow stepStep comments and notes |
Action Plan item / TaskDescription |
concat |
Notes tied to a workflow step go inside that step, not as standalone notes. |
| WorkflowCompleted by |
Action Plan / TaskCompleted-by field or description |
derive |
There is no single completed-by value. Decide whether it comes from the workflow owner, the user on the last completed step, or a completion note, and record the rule in the mapping. |
| Workflow (completed instance)Workflow template |
CaseRecordTypeId / Type |
lookup |
Historical workflows can load as closed Cases. Keep a template-to-record-type table so each workflow lands on the right record type, and drive Type and other template-dependent picklists from the same table. |
| Workflow (completed instance)Name, description, category and completed steps |
CaseSubject / Description |
concat |
Put the category in the body as well as any field, since it shows when a workflow was cancelled. Roll completed steps into one dated block per Case: step, assignee, due date, completed date, comments. |
| Workflow (completed instance)Created, due and completion dates |
CaseCreatedDate / ClosedDate / due date field |
derive |
Setting CreatedDate and the created-by user on insert needs the "Set Audit Fields upon Record Creation" permission for the load user. Confirm the closed date can be set on insert, or keep the source completion date in its own field. |
| ImagingDocuments |
FilesContentVersion |
manual review |
Check document volume. Large archives often stay in a document system with links. |
| Workflow step (subtasks)Completed date |
TaskStatus / ActivityDate |
derive |
Take the completed date from each subtask, not from its parent step. A step-level join stamps every subtask with the step's date, so the history shows work finishing on the wrong day. |
| Workflow step (step tasks)Due date (shown in Redtail, not always stored) |
TaskActivityDate |
derive |
Redtail can display step due dates that it calculates from the workflow due date, so the export may have no value. Either derive the date from the workflow-level due date or leave it blank, and have the business decide how blank due dates should appear. |
| WorkflowLong description and instructions |
Case / Action Plan itemDescription |
direct |
Long workflow text can be cut short by an intermediate staging table or spreadsheet with a small column size. Compare source and output text lengths on a sample before loading; Description holds up to 32,000 characters. |
| ImagingDocument-to-record link |
ContentVersionFirstPublishLocationId |
association |
Set FirstPublishLocationId when creating the ContentVersion so the file links to its record in the same API call. Plan batches by total file size, not record count. |
| Notes and documents (repeat loads)Source note / file ID |
ContentNote / ContentVersionLoad tracking |
manual review |
Notes and files cannot be upserted by external ID. A full reload means delete and reinsert. For deltas, track loaded source IDs in a staging table and insert only new items. Load the most recent years first. |
| ContactRedtail Contact ID |
Person AccountRedtail_ID__c (external ID) req |
direct |
|
| All migrated recordsAccount, owner and created-by references |
All target objectsAccountId / OwnerId / CreatedById |
lookup |
Resolve lookups through external ID fields at load time (legacy contact ID on Account, legacy user ID on User). Salesforce record IDs copied from a sandbox do not exist in production. |
| Workflows and activitiesSource record ID |
Case / Task / EventExternal ID field |
derive |
Prefix the source ID by object type (for example RT-WF- for workflows, RT-ACT- for activities). IDs stay unique across objects, show where each record came from, and let reloads upsert instead of duplicating. |
| ContactMerged or duplicate contacts |
Person AccountRedtail_ID__c (external ID) |
manual review |
When source contacts were merged, decide which original ID becomes the external ID before loading; record order changes the result. |
| Household / familyFamily ID |
Account (Household)External ID / Account Contact Relationship req |
derive |
Don't key households on the family ID unless it is unique and consistent in the export. Key accounts and contacts on the Redtail contact ID, then use Account Contact Relationships to place each member in the right household. |
| Activities (events)Linked person and record |
EventWhoId / WhatId |
association |
Many source events have no linked person. Leave WhoId blank rather than inventing a placeholder contact, set WhatId to the household or account where one applies, and find events with no date before loading, since every event needs a start date. |
| Activities (tasks)Related household or account (bulk load) |
TaskWhatId / WhoId |
association |
Large task loads can fail with row-lock errors when many tasks point at the same account. Sort the file by parent record, load in serial mode or smaller batches, and switch off or bypass automations on Task for the load user. |
| Activities and workflows (business contacts)Linked business contact |
Task / Event / CaseWhatId / AccountId |
association |
Business contacts load as business Accounts, not Contacts, so activities and workflows tied to them can't use WhoId. Look up the business Account by its Redtail contact ID and set WhatId (AccountId on Cases), and keep business and individual records in one combined load file. Check that business-linked tasks and events land with WhatId populated before the full load. |