Supported formats
Upload CSV, TSV, plain text, or Excel (.xlsx / .xls) up to 10 MB. Excel workbooks use the first sheet; delimiters are auto-detected.
Every upload is mapped
1
Pick a file
From Contacts → Import, or the contacts empty state.
2
Confirm the column map
Senderz parses the headers and auto-maps common ones — including Shopify
consent columns (
Accepts Email Marketing, Accepts SMS Marketing).
Review and adjust before starting.3
Import runs in the background
Progress and a per-row results table are shown on the import status page.
Three-stage email validation
Each row’s email is validated before it imports:1
Syntax
Format check and lowercase normalisation.
2
Domain MX
A DNS MX lookup. No MX (or a null MX) means the domain can’t receive mail
— the row is rejected.
3
Quality
Disposable domains are rejected; role addresses (
info@, admin@) are
kept but flagged risky; in-file duplicates are removed.syntax, no_mx, disposable, duplicate, role, undeliverable.
Accept-all domains (like Gmail) return
unknown at import — a non-existent
Gmail mailbox surfaces later through the bounce → suppression pipeline, not
at import time.Consent on import is conservative
A row is opt-in only if the file carries a truthy consent signal. SMS is never auto-subscribed. Every consent change writes a consent-log entry with channel, state, source, IP and user agent.Store-synced imports carry the provider’s own consent timestamp (e.g.
when the customer opted in on Shopify), not the import time — so your
consent evidence stays accurate.
What completing an import does
- Marks contacts subscribed only where a consent signal was present.
- Completes the onboarding Import step when at least one row imports.
- Fires
contact_createdflows for genuinely new contacts (bulk import does not enrol into other triggers).
Importing via the API
For programmatic contact creation, use the Public API profiles endpoints rather than file upload —POST/PUT/PATCH /public/profiles.
