Contacts
A contact exists once in your account, whatever the number of lists it is on. The email address is the key: AhaSend trims it and lowercases it, soAnn@Example.com and ann@example.com are the same contact.
Contacts come in three ways:
- CSV import on the Contacts page, on a list, or while you create a new list. A file can be up to 100 MB. See importing a CSV.
- By hand, one contact at a time, on the Contacts page. To put an existing contact on a list, use Add to List on the contact’s page.
- From your own app or website, through the Management API: one contact per request, or up to 1,000 per request with Batch Upsert Contacts.
Importing a CSV
The import matches the columns of your file to the contact fields by their header:email, first_name, last_name, status and the name or key of each of your custom fields. Columns that match no field are ignored. There is no preview: the file is imported when you upload it. Rules that apply to every import:
- A contact that already exists is updated, not duplicated.
- An empty cell never wipes a value you already have.
- A contact that unsubscribed from everything stays unsubscribed. A contact that unsubscribed from a list is not put back on that list by a new import.
- The address column can be named
emailorEmail Address, so a Mailchimp export imports as it is. From Mailchimp, import only the subscribed contacts file: the unsubscribed and cleaned files have no status column, so their contacts would come in as subscribed. - Save the file as UTF-8. A file saved in another encoding imports names with accents or non-Latin letters garbled; export it again as CSV UTF-8.
Contact Status
You set the status when you add a contact, or with a
status column in a CSV import of new contacts. To change the status of an existing contact, use Update Contact.
Next to the status, a contact can be unsubscribed from everything. That is the account-wide opt-out: campaigns skip the contact on every list, and its memberships stay as they are.
Email validation adds a third signal: a contact whose address was found invalid is left out of campaigns.
Custom Fields
Add the fields your campaigns need, such as company, plan, city, VIP or customer since, under Marketing > Contact fields. A field has a name, a key and a type: text, number, yes/no, date or date/time. The type is fixed when you create the field, so a number stays a number. Renaming a field changes only its name, not its key, so it does not break the campaigns, searches or API calls that use it. Custom fields are used in two places:- Filtering: find the contacts that match, with advanced search.
- Personalization: write
{{ first_name }}or the key of any field of your own in the email, and each recipient sees their own value. Give a default for contacts where the field is empty. See personalization.
attributes of a contact. The API accepts only fields that you defined in the dashboard, with a value of the right type. See attributes.
Lists
A list is a static group of contacts and the unit a campaign targets. A campaign sends to one or more lists; through the API, up to 50. List names do not have to be unique, so give lists names that tell them apart. The Lists page shows two numbers for each list: how many contacts are on it, and how many a campaign would reach. The second number counts a contact when its membership is confirmed, the contact is enabled, it has not unsubscribed from everything, and email validation did not find its address invalid. The API returns the same number ascontact_count.
List Status
Each contact on a list has its own status on that list, separate from the contact status above:
A list page can therefore show a contact as Confirmed on the list and Blocked as a contact at the same time. The two columns answer different questions: is the contact subscribed to this list, and can AhaSend send to this contact at all. A campaign reaches the contact only when both answers are yes.
Unsubscribe, Remove or Delete
The dashboard has no button to unsubscribe a contact; recipients unsubscribe themselves with the link in a campaign. To stop marketing email to a contact yourself, unsubscribe it through the API rather than removing it.
Contacts and suppressions are separate records. A suppression you add by hand, or one that a bounce of your transactional mail creates, does not change any contact or list status.

