CRM Test Data: A Labeled Duplicate Set for Testing Match, Merge, and Lifecycle Logic
A CRM test dataset that exercises dedupe and merge logic needs more than realistic contact fields. It needs a labeled duplicate group with the answer key attached, Salesforce-object-aware derived fields, and a HubSpot lifecycle stage enumeration. This page names all 15 CRM fields, provides a labeled survivorship table, and lists 5 CRM-specific test scenarios.
Salesforce-object derived-field side effects
The silent-ignore Amount trap
Labeled survivorship answer key (duplicate group)
Intended survivor is contact 003SYN0000000001AA. EXACT and FUZZY rows share its master_record_id. Distinct from retail product dedupe: entity is a person; identifiers are name, email, phone.
| contact_id | master_record_id | duplicate_type | first_name | last_name | mailing_street | phone | lifecyclestage | survivor | |
|---|---|---|---|---|---|---|---|---|---|
| 003SYN0000000001AA | Avery | Synthfield | [email protected] | 12 Placeholder Way | +1 555 0100 | customer | YES (intended master) | ||
| 003SYN0000000002AA | 003SYN0000000001AA | EXACT | Avery | Synthfield | [email protected] | 12 Placeholder Way | +1 555 0100 | lead | merge into master |
| 003SYN0000000003AA | 003SYN0000000001AA | FUZZY | Avery | Synthfeild | [email protected] | 12 Placeholder Wy. | 555 0100 | marketingqualifiedlead | merge into master |
| 003SYN0000000004AA | Brin | Testworthy | [email protected] | 88 Sample Road | +1 555 0142 | salesqualifiedlead | distinct contact |
Opportunity sample: StageName derived fields and Amount silent-ignore
| opportunity_id | name | StageName | Amount | Probability | ExpectedRevenue | IsClosed | IsWon | Assertion note |
|---|---|---|---|---|---|---|---|---|
| 006SYN0000000001AA | Synthfield Co: Platform renewal | Qualification | 125000.00 | 10 | 12500.00 | false | false | StageName drives derived fields |
| 006SYN0000000002AA | Synthfield Co: Seat expansion | Negotiation/Review | 40000.00 | 75 | 30000.00 | false | false | expected_revenue = amount × probability |
| 006SYN0000000003AA | Testworthy Ltd: Pilot | Closed Won | 18000.00 | 100 | 18000.00 | true | true | IsClosed/IsWon from stage |
| 006SYN0000000004AA | Testworthy Ltd: Add-on (has products) | Closed Lost | 9000.00 | 0 | 0.00 | true | false | Amount write silently ignored when products exist |
HubSpot lifecycle stage internal values
HubSpot lifecyclestage internal values (not UI labels), from HubSpot property docs / community payload (retrieved 2026-08-01):
| Internal value | Common label |
|---|---|
| subscriber | Subscriber |
| lead | Lead |
| marketingqualifiedlead | Marketing Qualified Lead |
| salesqualifiedlead | Sales Qualified Lead |
| opportunity | Opportunity |
| customer | Customer |
| evangelist | Evangelist |
| other | Other |
Test scenarios
- Exact duplicate contacts share Master ID (rows 1 and 2).
- Fuzzy duplicate contacts share Master ID (row 3; phone/street drift).
- StageName change updates IsClosed/IsWon/Probability (rows 1 to 3).
- Opportunity with products: Amount write silently ignored (row 4).
- CloseDate required validation; lifecycle forward-only guard (customer back to lead refused).
Generate a larger version
Frequently asked questions
Can a merged contact be restored?
No. Native Salesforce merge is permanent: the non-master records are deleted and cannot be individually restored from the merge action. The surviving master record carries the merged field values. The massmailer.io guide confirms this behavior ([massmailer.io/blog/salesforce-merge-contacts](https://massmailer.io/blog/salesforce-merge-contacts/), retrieval date 2026-08-01). A test fixture that exercises the merge path should include a pre-merge snapshot so assertions can compare before and after states. This is general information about documented Salesforce behavior; it is not legal or compliance advice.
What happens to activities after a contact merge?
Salesforce re-parents related activities (tasks, events, emails) from the deleted records to the surviving master contact. The massmailer.io guide confirms this re-parent behavior ([massmailer.io/blog/salesforce-merge-contacts](https://massmailer.io/blog/salesforce-merge-contacts/), retrieval date 2026-08-01). A test fixture that exercises merge should include activity records attached to the non-master rows so the re-parent path is covered by assertions, not just the contact merge itself.
Do custom object records transfer during a contact merge?
Only standard related objects (activities, cases, opportunities, and others) are automatically re-parented. Custom object relationships behave differently depending on their relationship type: a lookup field on a custom object that points to the deleted contact may be set to null unless the merge is handled in custom code, while a master-detail relationship will delete the child record if the parent is deleted. A test fixture should include at least one custom object row attached to a non-master contact to exercise this path. Source for the general merge behavior: [massmailer.io/blog/salesforce-merge-contacts](https://massmailer.io/blog/salesforce-merge-contacts/), retrieval date 2026-08-01. Verify custom object behavior against your org's relationship types before writing assertions.