Adding subscribers: import, manual entry and edits
Three ways to get people onto your list, and how to keep it clean.
Three ways onto your list
Every subscriber in Sumezi ends up in the same table with the same four possible statuses — subscribed, pending, unsubscribed or bounced — no matter how they got there. What differs is the path: adding someone by hand, importing a CSV, or letting people sign themselves up through a public form. Each path has a different relationship with consent, so it's worth knowing which one you're using.
| Method | Status set to | Source value |
|---|---|---|
| Manual add | subscribed | manual |
| CSV import | subscribed | import |
| Public signup form | pending → subscribed (after confirm) | form |
The source value above is exactly what shows as a badge in the subscriber list and detail page — useful for spotting, at a glance, how any one person got onto your list.
Add subscribers by hand
Click Add above the list to open a form with four fields: Email, Name, City and Language (Dutch, English or German). Submitting posts straight to your subscriber table with status subscribed and source manual — there's no draft state and no confirmation email.
The modal deliberately doesn't close after you add someone: your fields clear except language, and a small counter tracks how many you've added this session, so entering a dozen people by hand doesn't mean reopening the dialog a dozen times.
To fix a mistake later, open the row menu (the ⋯ button at the end of a row) or a subscriber's own detail page and choose Edit — it's the same form, pre-filled, and now saves with a PUT instead of a POST. Delete from the same menu removes the row outright; it doesn't move them to the suppression list, so a deleted person could theoretically sign up again through the public form later.
Import a CSV
Click Import, drop a .csv file, and Sumezi reads the header row to guess which column is which: it looks for email, e-mail or emailadres for the address; naam, name or voornaam for the name; and taal, lang or language for the language. Matching is case-insensitive but exact otherwise — a header the detector doesn't recognize is simply ignored for that field.
A CSV header Sumezi recognizes
Any of the column names above work out of the box, in any order. Anything else in the header row is simply left unmapped.
email,name,lang jane@example.com,Jane Doe,en jan@voorbeeld.nl,Jan de Vries,nl
Before Import will do anything, you have to tick a consent checkbox confirming that these people agreed to receive email and that you aren't importing a purchased list. It's a confirmation, not a verification — Sumezi has no way to check that consent actually exists, so this is genuinely on you.
Every valid row (a real-looking email address; anything that fails that check is skipped, not rejected as a batch) is inserted or updated as subscribed with source import — the same immediate status as a manual add, and just like manual add, no confirmation email goes out.
The public signup form
For anyone who shouldn't need you in the loop, open Signup form from the Subscribers page. You get three ways to use it: a hosted URL you can link to directly, an embeddable script tag, or a plain HTML snippet for sites that can't run JavaScript — all three post to the same public endpoint and include a hidden honeypot field that real visitors never see or fill in.
A submission here doesn't become subscribed right away. Sumezi inserts the person as pending and emails a confirmation link that's valid for 48 hours; only clicking that link flips them to subscribed. This is a real double opt-in — the visitor is proving the address is theirs, which is a meaningfully stronger consent record than a manual add or an import.
Public signups are rate-limited to 10 submissions per hour per IP address, and the form silently ignores anything that looks automated (a filled-in honeypot field, or a submission faster than 3 seconds after the page loaded) — bots get a fake "success" response with no side effects, so they can't tell they were blocked.
Tags, city and source
Every subscriber row shows a language flag, a city (if you have one), a source badge (form, import, api or manual) and a status pill in the list, plus tags on the detail page. City and language come straight from whichever path added the subscriber; tags exist as a field on every subscriber (visible in the list and detail view) but the current Add/Edit modal doesn't include a tag editor — for now, tags only get set if something writes them through the API's fields.tags array.
Common mistakes
- Import button stays disabled: it needs both a detected email column and a ticked consent checkbox. If your header doesn't say email, e-mail or emailadres (or similar for name/language), rename it and re-upload — there's no manual remapping yet.
- Rows with commas silently split wrong: the CSV parser splits on every comma in a line, including ones inside quoted fields (for example an address like "Main St, Apt 2"). Keep values comma-free, or use a different field for anything that needs one.
- Add or import is rejected with a plan-limit message: every plan caps subscriber count (Free: 500, Starter: 2,500, Pro: 25,000, Business: unlimited), counting subscribed rows plus pending signups from the last 48 hours. Adding one contact over the limit, or importing a batch that would cross it, fails with a 402 error naming the limit — upgrade, or clean out stale pending/unsubscribed rows first.
- Manual add says "invalid email": the form only checks for an @ sign client-side before submitting — if that's missing or the field is empty, it won't even attempt the request.