## TL;DR

HubSpot rejects rows whose email does not look like an address, and one bad row can stall an import. Validate every email before import with a real parser, fix or quarantine the bad rows, and import the clean set. Never hand-edit a 50k-row CSV to fix three addresses.

## Error

```text
Import error: invalid email address format on row 412: "[bad value]"
```

## Steps

1. Export the import's error rows from the import status page. Expected: the exact rows and values that failed.
2. Run the email column through a validator locally (syntax check plus no spaces, no double @). Expected: a clean list of bad rows.
3. Fix what is fixable (trim spaces, remove line breaks) and quarantine the rest into a separate file for manual review. Expected: two files, clean and quarantine.
4. Re-import the clean file. Expected: the import completes with zero email errors.
5. Add the validation step to the agent's pre-import pipeline permanently. Expected: future imports never hit this.

## When to use

- HubSpot imports report invalid email address format.
- An agent-generated CSV fails import on email rows.
- After merging data from a source with loose email hygiene.

## When not to use

- CONTACT_ALREADY_EXISTS (the email is valid but taken).
- Salesforce email validation (different platform rules).

## Tool compatibility

- HubSpot imports UI and imports API.
- Any CSV pipeline feeding HubSpot.

## Variant phrasings

### invalid email on import row N

Same fix; the row number points at the bad value.

### import skipped rows for email

The UI wording for the same rejection.

## Why it happens

Import sources (web forms, spreadsheets, legacy exports) accept anything typed into an email box. HubSpot enforces RFC-ish shape at import time, so years of accumulated junk surface all at once.

## Edge cases

- Plus-addressed emails (name+tag at domain) are valid; do not strip the plus.
- Internationalized domains are valid but some validators reject them; use a modern parser.
- Empty email cells are fine on non-required imports; only malformed non-empty values fail.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_m0l6dZHD8r1XoXq3H0FF6Q
