Skip to main content
Bring an existing list into Senderz from a spreadsheet or a Google Sheet. The importer is source-agnostic. The same engine handles file uploads and store customer syncs, so validation, consent handling, duplicate matching and the status report are identical everywhere.

Where to start an import

Contacts page

Open Contacts and press Import in the page header.

Empty audience

A workspace with no contacts shows Import a file on the Contacts page.

Straight into a list

Open a list and press Import file. Everyone imported joins that list.
When you start from a list, the upload step says so, and the list keeps an Import history card with each run’s new, updated, skipped and failed counts plus a View report link back to the full result.

What you can import

Files

CSV, TSV, plain text, Excel
.csv, .tsv, .txt, and Excel workbooks in .xlsx, .xls, .xlsm or .xlsb.
10 MB
A larger file is rejected before anything is read.
50,000 per import
The upload box states this as Up to 50,000 rows. Rows beyond the cap are not imported, and the import is flagged as incomplete in the log.
Excel workbooks use the first sheet only. For delimited text the separator is detected from the header line, so comma, tab and semicolon files all work without a setting. Keep one header row at the top.
On the upload step, Download sample CSV gives you a small example file with the column names Senderz recognises out of the box.

Google Sheets

If Google Sheets import is enabled for your workspace, the upload box also shows Import from Google Sheets.
1

Connect Google

You connect your own Google account. The connection belongs to you, not to the workspace, so a teammate importing a sheet connects their own account.
2

Pick the spreadsheet

Choosing the file in Google’s own picker is the permission grant. Senderz only ever gets read access to the spreadsheet you picked. There is deliberately no paste-a-link field, because a link you have not picked is not readable under that permission.
3

Choose the tab and header row

Pick which sheet tab to read and confirm whether the first row contains column names. The dialog previews the row count and the columns found.
4

Continue to mapping

From here the wizard is identical to a file import.
The sheet is read again when the import actually runs, not snapshotted at preview time. Edits you make after previewing are picked up. That is also why removing individual rows on the review step is not offered for a sheet.
You can disconnect Google at any time from the same dialog.

The four steps

1

Upload

Choose the file or the Google Sheet.
2

Map fields

Confirm which column feeds which contact field.
3

Review

Check the preview and choose what happens to contacts you already have.
4

Subscription

Declare which channels these people gave you permission to market on.
There is no blind import. Every upload goes through the mapping step, because a wrong column map is what silently rejects an entire file.

Step 2: mapping columns

Senderz reads your headers and pre-selects a target field for each one. A column it recognised is marked Detected. Common names in English and Hebrew are matched automatically, including store export headers such as Accepts Email Marketing and Accepts SMS Marketing. Review every row before continuing. Each column has a dropdown with three kinds of choice.
Email, first name, last name, phone, timezone, locale, country, tags and the consent fields, grouped by category. Some catalog fields are calculated by Senderz and are shown as computed. Those cannot be imported and are disabled in the list.
The explicit skip. This is a real instruction, not just leaving the column unmapped: a column you mark Don’t import this column is skipped even if its header is one Senderz would otherwise recognise. A spare phone number or a colleague’s birthday stays out of your contact records.
Pinned to the top of every dropdown. It opens the same new-field dialog as Settings, and the value type is pre-selected from that column’s own sample values, so a column of dates suggests date and a column of numbers suggests number. You can change it before saving. The new field is created and mapped to the column in one step. Available types are text, number, date, true/false, single select, multi select, URL and list. There is a 5,000 field safety limit per workspace; the dialog tells you if you reach it.
Each target field can only take one column. Assigning a field to a second column releases the first one back to Don’t import this column.
You must map either Email or Phone to continue. Everything else is optional. Until one of them is mapped, the step says so and the Next button stays disabled.
Map Email consent, SMS consent or WhatsApp consent and Senderz reads each row’s own opt-in state from the file. See what the values mean below. Map Email consent date, SMS consent date or WhatsApp consent date and each contact keeps the date they actually opted in, rather than the date you switched to Senderz. The date format is strict on purpose.
03/04/2024 is rejected. It means 3 April to one exporter and 4 March to another, and nothing in the file says which. Guessing would file your consent evidence months away from the truth, so an unreadable value falls back to the import time instead. A date in the future is rejected for the same reason. A date and time with no zone is read as UTC.

Step 3: review and duplicate handling

The review step shows how many rows are ready, a preview table of email, name and phone, and the duplicate setting.

The preview is a sample

Senderz reads the first 100 rows for the preview so a large file does not have to be held in your browser. When that happens the step says Showing the first 100 rows of N. The full file will be imported. Everything after row 100 is still imported.

Removing rows

You can drop an individual row from the preview with the trash icon. That is only offered when Senderz has the whole file in the browser, which means:
  • It is available for a file of 100 rows or fewer.
  • It is not available once the preview is sampled, because most rows are not on screen to review.
  • It is not available for a Google Sheet, because the sheet is re-read at import time and a removal made here would silently do nothing.

Existing contacts

Existing contacts decides what happens when a row matches a contact you already have. Matching is by email first, then by phone. The Added to the list column only matters when you started the import from a list.
An update only ever fills values in. A blank cell in your file never wipes a value the contact already has, so a partial export cannot erase your data.An existing email address or phone number is never overwritten by the file. Custom properties are merged into what the contact already holds. Tags are the one exception: a tags column with a value replaces the contact’s tag list, while a blank tags cell leaves the existing tags alone.

Step 4: subscription

The final step. Imported contacts are not subscribed unless you say so. Tick each channel these contacts agreed to receive marketing on:
  • Subscribed to email
  • Subscribed to SMS
  • Subscribed to WhatsApp
  • Subscribed to all channels
The step then spells out the outcome in plain language, including what your mapped consent columns will do on their own.
Selecting nothing is a valid answer. It is never blocked. It keeps the conservative default: only rows whose own consent column says they opted in are subscribed, and everyone else stays unsubscribed and cannot be sent marketing.
Tick any channel and an acknowledgement appears: I confirm these contacts gave permission to receive marketing on the channels I selected. You cannot start the import until you tick it. Changing your channel selection clears the acknowledgement, so a narrower confirmation is never carried onto a wider claim.
Only tick a channel you can evidence. Israeli law requires explicit opt-in, and the consent record this import writes names you as the source of that claim. See Consent and compliance and Israeli compliance.
Two rules hold no matter what you tick:
  • An import never re-subscribes someone who opted out. A withdrawal recorded through Senderz always wins, including over the force-subscribe boxes, so a stale file cannot resurrect someone who unsubscribed last week. A genuine re-subscribe goes through the preference center.
  • A channel the contact has no address for is skipped. Ticking email on a phone-only file marks nobody email-subscribed. Those rows stay honest and do not count toward your billable contact total.
A mapped consent column is read per row and is three-way. Values are matched without regard to case.
never_subscribed, which Klaviyo and Flashy both export, is deliberately not treated as a withdrawal. It means the profile never opted in, not that it opted out, so treating it as an opt-out would unsubscribe people the old platform had no opinion about.

An opt-out in the file is final

This is what makes a migration off another platform safe. When a row says unsubscribed:
  • The contact is set to unsubscribed on that channel.
  • Their address or number is added to your suppression list in the same operation, so the two can never disagree.
Suppression is checked before consent at send time and keys on the address rather than the contact record, so it still holds if the contact is later deleted and imported again from a clean file.
This is one-directional. An import never removes a suppression. That list also holds hard bounces and spam complaints, and a stale spreadsheet must not be able to bring those addresses back into your sends.

Re-importing the same list is safe

A consent state that already matches is left alone rather than rewritten. Importing the same file twice does not restamp every opt-in date to today and bury your original evidence. Every consent change an import makes is written to the append-only consent log with the channel, the new state, a source of import, and the date. The date comes from your mapped consent-date column when there is one, otherwise the time of the import. IP address and user agent are empty for imports, because a file upload has neither. Store syncs are different: Shopify, WooCommerce and the other store connectors carry the provider’s own opt-in timestamp, so a customer who subscribed on your store two years ago keeps that date.

Email validation

Every row that carries an email is checked in three stages before it is written.
1

Syntax

Format check, plus trimming and lowercasing. A malformed address is rejected as Invalid email address.
2

Domain mail server

A DNS lookup for the domain’s mail servers. A domain with none cannot receive mail, so the row is rejected as Domain can’t receive email.
3

Quality

Disposable, throwaway domains are rejected. Role addresses such as info@ or admin@ are kept and flagged as risky. Addresses repeated inside the same file are collapsed to one.
Rows without an email are still imported if they carry a usable phone number, so a phone-only list is a valid import. A row with neither, or with a phone number that cannot be read, is rejected.

Reject reasons

A role address is not a rejection. It imports and is flagged Risky so you can decide for yourself.
Catch-all domains such as Gmail accept mail for any address, so no check at import time can tell you a specific mailbox exists. A dead Gmail address surfaces later as a bounce, and that bounce suppresses it automatically. See Consent and compliance.

Watching the import run

The import runs in the background and you land on a live status page. You can leave the page and come back. It moves through two phases. First Validating emails, where the count climbs as rows are checked. Then Importing & consent, where contacts are written in batches of 500 and the de-duplicating and consent recording happen. The page reports the current count against the total throughout.
An import that stops making progress is detected and marked as failed with Import stopped, rather than spinning forever. Start a new import to try again.

The result

When it finishes you get four counts: New, Updated existing, Skipped and Invalid, plus First issues found, a short list of the first problems with their row numbers.

Per-row results

Below that is a Per-row results table showing up to the first 1,000 rows, with: Filter tabs across the top switch between All, Valid, Risky and Rejected.
Did you mean catches the common domain typos. A row that came in as gmial.com shows the corrected address, so you can fix that customer in your source file instead of losing them.

Download failed rows

Download failed rows exports every row that was not clean as a CSV, with the row number, address, status, reason and suggested correction. Fix them in your source data and import that smaller file again.

After the import

Contacts are live

Imported contacts are immediately searchable, filterable, usable in segments and ready for campaigns.

List membership

If you imported into a list, everyone is added according to the duplicate setting you chose.

Consent recorded

Every subscribe and unsubscribe the import made has a consent log entry with its own date.

Setup step completed

A run that creates at least one new contact completes the Import step in your workspace setup checklist.
A bulk import does not trigger automations. Importing a file deliberately does not enroll anyone into a contact created flow or any other trigger. Uploading a 20,000 row list would otherwise fire a welcome email at 20,000 people who did not just sign up. Contacts created one at a time, through a form, a popup or the API, do trigger automations normally. See Flow triggers.

The import and export log

Every import and export is recorded permanently, whichever source it came from. Open Contacts and choose the Import & export log tab. Each row shows:
  • The type, such as Contact import or Contact export, and where it came from: CSV file, Google Sheets, Shopify, WooCommerce, Konimbo, Magento, Stripe or WordPress.
  • The status: Running, Completed, Completed with warning, or Failed.
  • Rows processed, broken down into added, updated, skipped and rejected.
  • A live progress bar for anything still running.
  • The failure reason when something went wrong.
  • A Download button to re-fetch a finished export file while it is still stored.
Filter by All activity, Imports or Exports.
Completed with warning on an import usually means the file was over the 50,000 row cap. The log states how many rows were processed and that the rest were not imported.

Importing through the API

For programmatic contact creation, use the profiles endpoints rather than uploading a file. See Profiles and Lists in the API reference.