Import and clean your first contact list

TL;DR. Your list gets into SEMAOS one way: a CSV import. Export your contacts from wherever they live, trim the file to the columns that matter, verify the email addresses with a tool like NeverBounce or ZeroBounce, and drop everything marked invalid or unknown before you upload. Ten minutes of cleaning keeps your bounce rate under the 2 percent line that decides whether the rest of your mail reaches the inbox.

Contacts get into SEMAOS through a CSV import — there is no CRM connector to sync from, so wherever your contacts live now (a CRM, a spreadsheet, an event list), you export them to a CSV file and upload that. The work that actually matters happens before the upload: trim the file to the columns you will use, verify the email addresses with a verification service, and delete every address that comes back invalid or unknown. A clean list of 400 real addresses will always outperform a messy list of 1,000, because the messy list bounces — and a high bounce rate quietly poisons everything you send afterward.

How do contacts get into SEMAOS?

By CSV import, and only by CSV import. SEMAOS is a standalone sending tool, so it does not connect to Salesforce, HubSpot, or any other CRM to pull contacts automatically. That is a deliberate choice — it keeps the product simple and keeps your system of record wherever it already is. Your job is to get your contacts out of that system as a .csv file and bring that file in.

Almost everything exports to CSV. A CRM has an export button. A spreadsheet saves as CSV directly. A list you bought or collected at an event usually arrives as one already. If you can open it in a spreadsheet, you can save it as a CSV and import it.

Which columns should the file have?

Keep the columns you will actually merge into an email or filter on, and drop the rest. At minimum you need an email address. Everything else earns its place by being something you will personalize with or segment by.

ColumnKeep it?Why
EmailRequiredNothing sends without it
First nameYesPersonalization: {{contact.first_name}}
Last nameYesFallbacks and formal greetings
Company / accountUsuallyPersonalization and segmentation
Job titleUsuallyFiltering by role or seniority
Notes / internal IDsDropClutter you will never merge or filter on

A clean header row matters more than people expect. Give each column a short, obvious name — email, first_name, company — so mapping them during import takes seconds instead of guesswork. When you merge a field into a template later, an empty cell should degrade gracefully, which is why a fallback like {{contact.first_name | there}} is worth adding for any field that is not filled in on every row.

Why verify the list before you upload?

Because email addresses rot, and bounces are expensive in a way that is easy to underestimate. A B2B list decays continuously as people change jobs — a 1,000-contact list that was accurate three months ago can already carry 50 to 80 dead addresses, which is a 5 to 8 percent bounce rate sitting in the file waiting to go off. Mailbox providers watch that number. Sustained bouncing above roughly 2 percent over several days tells Gmail your list is stale, and it starts holding back your mail to every recipient, not just the dead ones.

Run the CSV through a verification service — NeverBounce, ZeroBounce, and similar tools all do this — before you import. They flag each address as valid, invalid, or unknown/risky. Delete the invalid and unknown rows. The goal is a file where nearly every address is a real, deliverable mailbox.

Bounce rate on a sendWhat it meansWhat to do
Under 2%Healthy — a clean, verified listKeep sending
2% to 5%Warning zone — the list is going staleRe-verify before the next send
Over 5%Danger zone — reputation damageStop, audit, and re-verify the whole list

For context, SEMAOS enforces its own guardrails on top of your hygiene: at a rolling 24-hour hard-bounce rate of 5 percent it throttles new sends, and at 10 percent it suspends sending on the account until things are cleaned up. Those are backstops, not targets. The point of verifying up front is to never get near them.

What does the import itself look like?

Straightforward, once the file is clean. You upload the CSV, match each column in the file to a SEMAOS field (email to email, first_name to first name, and so on), and confirm. Rows without a valid email are rejected rather than imported. Duplicates on the same email address collapse to one contact so you do not send the same person two copies.

A short pre-upload checklist that catches most problems:

  • One email address per row, in its own column
  • A header row with plain, lowercase names (email, first_name, company)
  • The file saved as CSV, not XLSX — commas, UTF-8, no merged cells
  • Verification already run, with invalid and unknown rows deleted
  • Obvious junk removed: info@, sales@, and other role addresses that rarely reply and often complain

Should you split the list into smaller lists?

Often, yes. One giant list is harder to personalize and harder to measure. If you can segment while the file is still a spreadsheet — by role, by industry, by how you sourced them — you can import each segment separately and write a sequence that speaks to that group specifically. A message that names the reader's world beats a generic blast, and a smaller, tightly-defined list is easier to keep clean over time.

How does SEMAOS handle this?

SEMAOS imports contacts from a CSV file with column mapping, rejects rows with no valid email, and de-duplicates on the email address as it imports, so a single upload of a cleaned file gives you a usable contact list in one pass. Contacts are unmetered on every plan, so the size of your list is never the constraint — its quality is. Do the verification before you upload, keep the file to the columns you will merge or filter on, and your first sequence goes out to a list that lands.

Next in this series: writing a sales email template you can reuse.