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 01

Basic 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 02

Combine 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 03

Choose 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 04

Shared 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 05

Dates 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 06

Explicit 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 07

Email 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 08

CSV 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 09

Delimiter 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 10

Mapping 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 11

Fuzzy 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 12

Zoho 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 13

Company 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 14

Deal 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 15

Repeatable 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.