Contacts

Get your list in — once, and cleanly.

Bring the list you already have in from a spreadsheet, without ending up with the same person three times. Every import is matched on email, tagged, recorded with the consent that came with it, and handed back to you as a report you can read.

Matched on email, not re-addedConsent recorded at importEvery failed row named
Sample import report
customers.csv · 1,240 rows
1,180
imported
42
updated
14
skipped
4
failed
rows that did not import
row 118 — invalid or missing email
row 402 — invalid or missing email
consent recorded on every new row

The list is rarely the problem. Getting it in is.

Most businesses already have their customers written down somewhere — an export from an old provider, a spreadsheet a colleague keeps, a book by the till. Three things go wrong every time it moves.

Duplicates

The same person, three times

You import the new file on top of the old one and everybody who was on both gets a second row. Now they get the same offer twice, and your contact count is wrong in a way you cannot easily unpick.

Silent failures

Rows that just vanish

A blank cell, a typo in an address, a header the tool did not recognise. The upload says it worked, the count is lower than the file, and nothing tells you which rows fell out or why.

Permission

No record of who agreed

The list arrives with names and numbers and nothing else. When somebody asks why you messaged them, you have nothing to point at — no channel, no date, no note of how they came to be on it.

Four steps from a spreadsheet to a list you can send to.

  1. Upload the file

    A CSV export from your old provider, your accounts package or a spreadsheet. QuickGrow reads the header row and matches the columns it recognises on its own — email, phone, first and last name, and company or brand.

  2. Check the mapping

    Before a single row is written you get back the headers it found, the first five rows exactly as they will be read, and the total row count. Correct anything matched to the wrong field, and point the leftover columns at custom fields of your own.

  3. Tag it and record the consent

    Tag the whole import — Eid list, walk-ins, whatever you will search for later — and record the permission that came with it: which channel it covers, whether it is marketing or transactional, how it was collected and on what date.

  4. Read the report

    You get four numbers back — imported, updated, skipped, failed — and a line for every failed row with its number and the reason. Nothing is dropped without telling you.

columns matched from your header row

Your headers do not have to be named the way QuickGrow names them. Email, e-mail and mail all find the email field; mobile, cell and telephone all find the phone. Anything it does not recognise is left for you to point at a custom field of your own — or to leave out.

Email Addressemail
Mobilephone
First Namefirst name
Companybrand
Last Ordercustom field
four matched automatically, one left to you

Import the same file twice on purpose.

Contacts are matched on their email address, so a re-import is a safe thing to do rather than a mistake to avoid. What happens to a row that is already on your list is your choice, made once per import.

What each kind of row does on a CSV import.
DefaultWith update-existing turned on
An email you have never seenAdded as a new contactAdded as a new contact
An email already on your listLeft alone and counted as skippedUpdated in place — phone, name and custom fields refreshed, tags merged in
The same email twice inside one fileSecond one skippedSecond one skipped
A row with no usable email addressReported with its row number; the rest of the file still importsReported with its row number; the rest of the file still imports
Starts an automationGenuinely new contacts onlyGenuinely new contacts only

A CSV import is also the one place in QuickGrow where adding a contact starts a journey by itself. A genuinely new row fires the contact-created trigger, so a welcome sequence runs without anyone pressing anything. Rows that were skipped or updated do not fire it, so re-importing your whole list will not re-welcome everybody. See what a journey can do.

The QuickGrow API reference inside the product, with the endpoint list beside the detail for a single endpoint
One at a time, or by the thousand

A file is not the only way in.

Add someone by hand while they are still standing in front of you, or have your own system push contacts across as they sign up. Either way the same duplicate check runs, so the same person does not arrive twice by two different routes.

  • Adding by hand needs an email address or a phone number — one of the two, not both, so a walk-in with only a mobile is a real contact
  • Send up to 1,000 contacts in a single API call and get a line back for each one: created, duplicate, or the error that stopped it
  • There is no cap on how many contacts you can hold — contacts are never metered, so a list can grow as large as it needs to
The form builder showing its field list beside a live preview of the published sign-up form
Forms, popups and landing pages

Collect sign-ups — and know exactly what that does.

Build a form, drop it on any website with one script tag, and every submission is stored with the time, the page it came from and the answers given. Be clear on what happens next, because this is where most tools overpromise: a submission is a submission. It does not become a contact until you make it one.

  • Every submission is kept and listed against the form, with its view and submission counts and the conversion rate between them
  • You are notified when one comes in, so a lead does not sit unseen for a week
  • A hidden honeypot field quietly drops bot submissions instead of letting them fill your list

Forms, on-site popups and landing pages all live in Growth, with A/B tests and conversion tracking of their own.

Permission you could show someone, not a tick box.

Consent here is a record with a date on it, kept per channel and per type, and it is read at send time rather than filed away.

What is kept

More than a yes

Each record holds the channel it covers, whether it is marketing or transactional, how it was collected, the address it was collected from, which version of the wording the person saw, and when. Withdrawing adds the date and the method, and the record stays as history.

Double opt-in

On when you ask for it

It is off unless you switch it on. With it on, the consent sits pending and the contact gets a confirmation email whose subject and wording you write. Their click records the time and the address it came from, then activates the consent. The link works once.

Checked, not filed

Read before every send

An SMS or WhatsApp message to a contact with no active consent for that channel is stopped before it leaves — then the quiet-hours window set for their country, then the per-contact frequency cap. You get the reason it was blocked, not a silent failure.

Off the list, and out of it.

Two different things, and worth knowing which one you are being asked for.

Happens on its own

  • The unsubscribe link on your emails opens a confirmation page, so a link scanner cannot unsubscribe somebody by accident
  • A confirmed unsubscribe marks the contact Unsubscribed and withdraws their active consent for that channel, with the method recorded
  • A hard bounce marks the contact Bounced; a spam complaint marks them Complained

You do it

  • Delete one contact, or select a batch and delete them together
  • A deleted contact leaves your list for good; there is no contact cap, so nothing needs freeing up
  • Withdraw a single consent and leave the rest — off marketing email, still getting order updates

A full erasure request

  • Removes the contact, their messages, their activity history and their consent records together, in one operation
  • Writes an audit entry that keeps the fact of the erasure without keeping the person
  • There is no self-serve button for this — raise the request and it is carried out for you

It is your list, and it stays that way.

Stored unreadable, still searchable

Name, email and phone are encrypted where they sit. Searching matches a one-way fingerprint of what you typed, so a lookup never has to read the stored value back. In practice that means search finds a whole email address or a whole phone number rather than part of one.

Private to the brand that owns it

If you run more than one brand or shop from one account, each has its own list and cannot see the others. Contacts are shared across brands only when you import them that way on purpose.

Four permissions, not one

Viewing, creating and editing, deleting and exporting contacts are separate permissions you grant per role — and none of them is permission to send a campaign. A new assistant can tidy the list without being able to message it.

Yours to take away

Export the list to a CSV file whenever you want, filtered by status or by channel. Getting your own data out is a button, not a support ticket.

Encrypted at restSeparate per brandCSV exportTag counts across the whole list

Before you upload anything.

Will importing the same file twice give me duplicates?

No. Every row is matched against your list on its email address. By default a match is left alone and counted as skipped; turn on update-existing and it is updated in place instead, with the tags from this import merged into the ones already there. The same email appearing twice inside one file is caught as well.

What happens to rows without an email address?

A CSV import needs a usable email on every row — anything else is listed in the report with its row number and the reason, and the rest of the file still imports. Contacts with only a phone number are perfectly valid, but you add those one at a time or through the API rather than by CSV.

Does importing contacts start sending them things?

Only if you have built a journey that starts on a new contact. That is the one thing that happens by itself: a genuinely new row from a CSV import fires the contact-created trigger. Skipped and updated rows do not, and a contact created through the API does not either.

Bring the list in. Keep it clean.

Import what you already have, know exactly what landed, and start from a list you can stand behind.