You are here:
Migrate Peer-to-Peer Conversations to Your Experience Cloud Site
Migrating peer-to-peer conversations from other platforms can be a part of creating an Experience Cloud site. Understand the steps to take before migrating and how to use Data Loader to migrate conversations.
Required Editions
| Available in: both Salesforce Classic and Lightning Experience |
| Available in: Enterprise, Performance, Unlimited, and Developer Editions |
Before you can load your data, perform these steps.
- Create your Experience Cloud site.
- Create the profiles to assign to your internal and external users, as applicable.
- Assign profiles to your site (Setup | All Sites | Workspaces [for the site you’re working on] | Administration | Members).
- Create an Account and Contact (for B2B sites) or a Person Account (for B2C sites) before creating an external user. Internal users (employees of your company) aren’t linked to accounts and contacts. Your internal users can exist in Salesforce, so you don’t need to create them as users.
- Put together a plan for how to migrate your data. Identify how to transform the data from your current format into the format that Salesforce uses. We recommend that you do a trial run of your data load into a full sandbox before migrating in production. Create a guide to refer to when you do the load into production.
- As with all data migrations, do a test load of a few records first. Ensure the data looks as you expect, and then proceed with the full load. This process is especially important when loading conversations to ensure that they render the way you expect them to.
Important
- When you create site users during the data load, don’t send a welcome email. You can prevent this action by taking your site offline or by deactivating the welcome email option.
- To prevent users from receiving Chatter email alerts during the data load, turn off emails
for all your site members. Email notification preferences are site-specific and are stored in
the
NetworkMemberobject. QueryNetworkMember (SELECT Id,NetworkId,PreferencesDisableAllFeedsEmail FROM NetworkMember WHERE NetworkId = 'ENTER YOUR 18-DIGIT SITE ID HERE')and set thePreferencesDisableAllFeedsEmailfield for all users in the community toTRUE. Be sure to set it back toFALSEafter the entire data load is complete so that site members get email notifications after the site is live. We advise not globally disabling all system emails from your sandbox when doing a test load. Disabling all system emails when doing the data load in production prevents other departments that also use your Salesforce instance from sending email.
There are many dependencies between objects when migrating posts, so it’s important to pay attention to the order in which the data is loaded. Here is our recommended order and the key required fields to populate to be successful.
-
Load Accounts
Ensure that the Account Owner for each account has a role assigned to their user. If you aren't specifying an Account Owner, ensure that the user doing the data load has a role assigned to them. Users without an assigned role can't load users.
- For business accounts—
Account Name - For person accounts—
First Name;Last Name
- For business accounts—
-
Load Contacts
If you're using person accounts, upload contacts as they're automatically created when you load their information to the Accounts object. At a minimum, load these fields:
AccountIdFirst NameLast Name
-
Load Users
Required fields:
ContactId: Leave blank if creating a user in your Salesforce org who works for your organization. Only external users must be linked to a contact.FirstNameLastNameEmailUsername: The username in the format of an email address that members use to log in and isn't visible to anyone else in the site.Alias: The alias doesn't appear anywhere in the site, but it's a globally required field in Salesforce.Nickname: If you choose to use a nickname instead of first and last names, the nickname appears to users in the site.ProfileIdLanguageLocaleKey: The user's language and locale.LocaleSidKey: The two-digit ISO language code. For example, English (United States) is en_US.TimeZoneIdEmailEncodingKey: The email encoding for the user, such as ISO-8859-1 or UTF-8.
-
Load Collaboration Groups
Required Field Description GroupNameOwnerIdThe user ID of the person who owns the group. CollaborationTypeControls the visibility of the group:
- Public: Anyone can see and post updates. Anyone can join a public group.
- Private: Only members can see the group feed and post updates. Non-members can see only the group name and a few other details in list views, search, and on the group page. The group's owner or managers add members who request to join the group.
- Unlisted: Only members and users with the Manage Unlisted Groups permission can see the group and post updates. Other users can't access the group or see it in lists, search, or feeds.
-
Load Collaboration Group Members
Required fields:
GroupId: The ID of the groupCollaborationRole: If the user is a Standard or Admin user.MemberId: The user ID of the member.
-
Load Topics
Required fields:
NameDescriptionNetworkId: The 18-digit Experience Cloud site ID.
-
Load Content Documents
For information about how to load files, see Upload Content with the Data Loader. You can leave the
ParentId(for example, Library) field blank because files attached to Chatter records typically aren't stored in Libraries. -
Load Feed Items
Required Field Description BodyThe main content of your post. Only specific HTML tags are supported, so make sure to clean your data before attempting to upload. TypeThe kind of post made. Common options include:
AdvancedTextPost: For announcements in groupsContentPost: A post with an attached fileQuestionPost: Used for posting a question to a topic or groupPollPost: Used if the post includes a poll in groupsLinkPost: A post with an attached URL
IsRichTextTrue: Use when there's HTML markupFalse: Use if plain text
NetworkScopeThe 18-digit site ID. To get the ID, query the Network object in Data Loader using: SELECT Id,Name FROM NetworkParentIdFor group posts, enter the CollaborationGroupID. For topic posts, enter the ID of the user who created the post.VisibilityAllUsersTitleIf using type QuestionPost, enter the question title here. -
Load Feed Comments
When adding feed comments, it's crucial to add attachments at the time of creation. You can't edit a comment and add an attachment to it.
Required Field Description FeedItemIdThe parent post that the comment is related to. CommentBodyThe content in the post. ThreadParentIdLeave empty if a comment is the first level down of comment on a post. If it is below an existing comment, enter the FeedItemIdfrom its parent comment.CommentType ContentComment: A comment that includes an attachment.TextComment: A direct text entry on a comment.
RelatedRecordIdID of the ContentVersionobject associated with aContentComment. This field is null for all comments exceptContentComment. -
Load Feed Likes
Required fields:
FeedItemId: If the like is related to a post, enter theFeedItemIdfrom the post here.FeedEntityId: If the like is related to a comment, enter theFeedCommentIdfrom the comment here.
-
Load Feed Attachments
Required Field Description FeedEntityIdThe ID of the associated post ( FeedItem) that contains this attachment.RecordIdThe ID of the record that this feed attachment contains. For inline images, RecordIdis aContentDocumentID. For content attachments,RecordIdis aContentVersionID.TitleThe title of this feed attachment. When TypeisLink, theTitlevalue is the label for the attachment link. Otherwise, theTitlevalue isn't used.TypeThe type of this feed attachment. Valid values are:
Content: A content attachment.FeedEntity: A feed entity, such as a shared post. Available in API version 39 and later in Lightning Experience.InlineImage: An inline image. The system creates an inline image attachment when an image is added to the body of the associatedFeedItem. You can't add an inline image directly by usingFeedAttachment.Link
ValueEnter the URL here if the feed attachment is Type = Link. Otherwise, leave blank. -
Load Topic Assignments
Required fields:
EntityId: The ID of the post (such asFeedItem) that corresponds to the topic.TopicId: The ID of the topic to assign to the feed.
-
Load Entity Subscriptions
Required fields:
ParentId: The ID of the record being followed. For example, it could be the ID of a user or a topic being followed.SubscriberId: The ID of the user who is following the record.NetworkId: The 18-digit site ID.
-
Update Network Members
Member records were already created. However, if you want to migrate user email preferences or reputation points earned, update these records as a final step of your migration.
Other Considerations
- External IDs — You can’t add external ID fields to most of the objects, so keep your
success files from each data load to track the relationship between your source data and
Salesforce. You can then use
VLOOKUPSto populate the Salesforce ID from the parent record created into the next file load. - Threaded conversations — If your current platform uses threaded conversations, load
FeedCommentsin several batches. For example, group all top-level comments into one file and load them. Then group all the posts beneath those comments into the next data load, and so on. Only threaded conversations that are three levels deep are supported. - Inactive users — If you’ve had your legacy forum for some time, chances are that you have some users who are no longer active. Migrate them as active users so that you can bring over their posts and comments, and then deactivate their user record. If you’re using member-based licenses and are migrating more users than you have licenses, before starting your data load, contact your Account Executive to discuss which options are available.
- Formatting posts — The trickiest part of this load is getting your posts into the correct format. If you can’t migrate your posts exactly the way you want with these instructions, see the Connect REST API Developer Guide for how a developer could load your posts and comments to the site.
- Updating Chatter posts to select best answer — If your current forum has the concept of
a best answer, update the
BestCommentIdfield on theFeedItemrecords after loading all yourFeedComments. You can’t set this value during the initialFeedIteminsert, because the childFeedCommentrecords don’t yet exist. - Updating the
BestCommentIdfield — TheBestCommentIdfield can't be updated using Workbench or Dataloader. To update the field, use the QuestionAndAnswers Class via the Connect API. - Uploading Chatter profile photos and Chatter polls — This upload must be done via Connect REST API. For more information, see this guide on photos and this guide on polls.
- What can’t be migrated — For example, you can’t migrate the view count on posts or whether a user has or hasn’t viewed a post.
Did this article solve your issue?
Let us know so we can improve!

