Your beta test checklist
Messy on purpose.
Predictable on the way out.
15 specific scenarios for the sample CSVs: what’s wrong, which settings to choose, and exactly what to expect.
Synthetic data only. Start over between tests; reload for fully fresh settings. Issues count rows, not reasons. General cleanup keeps flagged rows; migration candidate files exclude review rows.
Test 01Basic cleanup
Settings: Combine & clean files → General cleanup → Contacts. Keep trim, email casing, exact dedupe and validation on. Match only email; keep first. Phone/date/IDs/fuzzy off.
What’s wrong: Spaces and uppercase emails; one repeated Ava; invalid June email; postal codes with leading zeros.
Expected result: 8 in → 7 out; 1 duplicate removed; 1 row with issues. Ava email becomes ava@example.com. June is flagged and remains in output. 02108, 00501 and 00401 keep their zeros.
Test 02Combine different headers
Settings: Same settings as Test 01. Upload both as source files and review suggested mappings.
What’s wrong: First Name/firstname, Email Address/email, Company/companyname and Zip/postalcode differ. Contacts overlap across files.
Expected result: 14 in → 10 out; 4 exact duplicates removed; 1 issue row. One normalized schema; _source_file and _source_row identify surviving rows. The two blank-email Alex rows remain separate.
Test 03Choose a duplicate survivor
Settings: General cleanup, exact dedupe on email. Compare First row with Most complete row.
What’s wrong: Ava appears first with sparse fields, then with fuller data. Miles has two equally complete rows with different company values. Three rows have blank email.
Expected result: 7 in → 5 out; 2 duplicates removed; no issue rows. Most complete keeps the fuller Ava. A tie keeps the first Miles. Blank-email rows never match on blank email. Existing record_id values remain unchanged.
Test 04Shared IDs without deleting rows
Settings: Turn exact dedupe OFF. Turn Wizard IDs ON. Uncheck email as match key; select first_name, last_name, company and phone. All formatting off except trim/email.
What’s wrong: Two Alex rows have the same complete name/company/phone but different existing CRM IDs. Several other rows have incomplete match keys.
Expected result: 7 in → 7 out. Both Alex rows get the same run-local _wizard_id; their HS-003 and HS-004 record_id values stay separate. Incomplete-key rows get distinct Wizard IDs. IDs are not promised to persist across separate runs.
Test 05Dates and phone review
Settings: General cleanup. Phone and Dates ON; US/Canada region; input date order Flag non-ISO dates. Exact dedupe on email.
What’s wrong: Mixed date order, impossible February 30, invalid 2026 leap day, valid 2024 leap day, local US/UK phones and a three-digit phone.
Expected result: 8 in → 8 out; 6 rows with issues. 2024-02-29 is valid. Non-ISO and impossible dates need review. US numbers can normalize to +1. The UK local number and 123 remain flagged; country column does not choose region automatically.
Test 06Explicit date order
Settings: Repeat Test 05 with Month/day/year. Then compare Day/month/year.
What’s wrong: 03/04/2026 is ambiguous. 10/16/2026 is US order; 16/10/2026 is UK order.
Expected result: Month/day/year: 8 retained, 4 issue rows; 03/04 becomes 2026-03-04. Day/month/year: 03/04 becomes 2026-04-03. Impossible dates stay flagged in both modes. The tool must not silently choose an order.
Test 07Email validation and consent preservation
Settings: General cleanup; email match key; phone/date/fuzzy OFF. Then choose HubSpot but turn phone/date OFF to isolate email checks.
What’s wrong: Missing @, double @, localhost address, missing emails and a repeated email. status, dnd and tags carry suppression evidence.
Expected result: General: 7 in → 6 out; 1 duplicate removed; 3 issue rows. HubSpot: same row counts, 5 issue rows because missing emails are also flagged by the beta policy. Unsubscribed/DND/tag values are preserved, not converted into consent. This policy is not a universal statement of HubSpot import requirements.
Test 08CSV escaping and safe exports
Settings: General defaults. Download with Spreadsheet-safe exports ON; compare with it OFF. Use a plain-text editor to inspect.
What’s wrong: Quoted commas, double quotes, a newline within a cell, Unicode, =1+1 and +international phone values.
Expected result: 6 retained; no duplicates or issue rows. Quotes/commas/newlines/Unicode round-trip correctly. Safe mode prefixes formula-like values and +phones with an apostrophe; OFF keeps exact originals. Do not execute unknown spreadsheet formulas.
Test 09Delimiter detection
Settings: General defaults, match email.
What’s wrong: Semicolon delimiter, embedded semicolon/newline in quoted cells, email whitespace/case and a duplicate.
Expected result: 3 in → 2 out; 1 duplicate removed; 0 issues. Semicolon and newline inside quoted notes stay in one cell.
Test 10Mapping collision error
Settings: Upload alone with General defaults. Preview without changing mappings. Then skip Email Address, keeping Email → email.
What’s wrong: Email and Email Address both suggest email.
Expected result: First preview stops with a clear same-output-field error; no export is produced. After skipping the extra column, 2 rows remain. Choosing two distinct field names is another valid correction.
Test 11Fuzzy combine / Marketo trial
Settings: Migration Prep → Marketo → HubSpot → Contacts. Mark the HubSpot file Existing HubSpot export. Exact reference field email; fuzzy ON; no value mappings.
What’s wrong: Jon/John Smith at Northstar have similar names/emails and conflicting unsubscribe flags. Ava already exists in the reference; June has an invalid email.
Expected result: 4 source rows in → 4 retained; 0 removed; 1 possible-duplicate pair; 3 review rows; 0 create candidates; 1 update candidate. Ava source_id 1003 maps separately to _hubspot_record_id hs-901. Jon/John remain separate with their original unsubscribe values. Reference rows never enter imports.
Test 12Zoho contact matching
Settings: Migration Prep → Zoho → HubSpot → Contacts. Mark HubSpot file as reference. Match email; fuzzy ON.
What’s wrong: Zoho IDs must not become HubSpot IDs. Ava exists; Noor does not match the supplied reference.
Expected result: 2 retained; 0 review rows; 1 update candidate (Ava → hs-901), 1 create candidate (Noor). Ava email_opt_out remains true. “Create candidate” is not a guarantee the record is absent from all CRM data.
Test 13Company mapping and domain normalization
Settings: Migration Prep → Zoho → HubSpot → Companies. HubSpot file is reference. Exact reference field domain.
What’s wrong: Account Name vs Name, full website URL vs bare domain, different source/destination IDs.
Expected result: 2 retained; 0 issue rows; 1 update candidate for Oak → hs-c1 and 1 create candidate for Northstar. https://www.oak.example/about becomes oak.example. No missing-contact-email errors.
Test 14Deal values and unresolved associations
Settings: Migration Prep → Zoho → HubSpot → Deals. HubSpot file is reference. Match source_id. For this synthetic test only, enter {"pipeline":{"Sales":"default"},"stage":{"Qualified":"appointmentscheduled"}}. Date order Flag non-ISO.
What’s wrong: Source deal ID vs destination ID; stage labels; comma-formatted amount; non-ISO date; company references need lookup.
Expected result: 2 retained; 2 review rows; 0 create/update candidates. Pipeline/stage transform per the approved test mapping. Amount 2,000 and non-ISO date are flagged. Both company references appear in an unresolved association worksheet. It is not an import file. Use actual portal IDs for real data.
Test 15Repeatable recipe
Settings: Save mapping recipe. Start over, reload those same file names, then load the saved JSON recipe and preview.
What’s wrong: A repeat trial must preserve source/destination settings, field mappings, key choices and reference-file roles.
Expected result: Recipe restores Marketo, Contacts and source/reference roles. Preview returns the same Test 11 counts. Recipe includes configuration and headers/file names, not CSV row contents.