Contacts and Companies
One record per person, shared by your services. A form submission, a booking and an invoice for the same email address all point at the same contact instead of three half-copies.
Overview
Contacts is not a service you install. It is part of the platform, under Contacts and Companies in the sidebar. That means:
- Someone who fills in a form, books an appointment and later gets an invoice with the same email address is one contact, not three.
- A tag you add here is a tag Outreach can send to and a workflow can react to.
- Quotes, deals and invoices can all point at the same person.
Getting contacts in
Many contacts arrive on their own. Each of these creates a contact, or matches one that already has the same email address:
- A form submission that includes an email or phone field.
- A newsletter signup.
- A new customer in Appointments, including one created by a booking.
- A new customer in Invoicing.
- A new user signing up through Customer Auth.
- A lead you convert in My Leads.
- A text, WhatsApp message or call that comes in through Outreach.
Matching is on the email address, ignoring capitals, so Ada@Example.com and ada@example.com are the same person. Somebody who arrives with only a phone number gets a new contact.
You can also add one by hand with New contact. A name, an email or a phone number is enough to start. Press Add contact to save.
Import a spreadsheet
Press Import and choose a CSV file (up to 5 MB and 5,000 rows). We read the header row and suggest which column is the name, email, phone, tags, stage or notes. Check each column, choose Do not import for any you do not want, and match your own fields by hand. You can also add a tag to everyone in the file. Nothing is saved until you press the import button, which shows how many rows will be read.
Rows that match an existing contact by email (or by phone, for a row with no email) update it rather than making a second copy. An update only fills in empty details and adds tags. Rows without a usable email or phone are skipped, and the result tells you how many were added, updated and skipped.
Company names are not imported. Link people to companies afterwards, as described under Companies.
Your own fields
Every business tracks something the next one does not. Press Fields on the Contacts page to add your own: text, long text, number, date, a list to choose one or several from, yes or no, a web address, an email address or a phone number. They appear when you add or edit a contact, and in the import.
Your fields can be used as merge values in an Outreach campaign. A field called "Renewal month" can be dropped into a message as {{renewal_month}}.
Tags and stages
A tag is a free label, such as "attended webinar", "VIP" or "wants a callback". Use tags for anything you want to filter or send to later.
A stage is where somebody is with you overall: Lead, Prospect, Customer or Churned. Each contact has one stage, unlike tags. New contacts start as Lead.
Stages also update by themselves. A contact becomes a Prospect when a deal is opened for them, a Customer after a payment, an accepted quote or a subscription, and Churned when their last subscription ends. You can still change a stage by hand at any time.
A workflow can start when a tag is added or when a stage changes. That is how you get "tag someone VIP and they automatically get the VIP welcome". These triggers fire when you add or edit a single contact, not from bulk changes or an import.
Consent and do-not-contact
Two separate things, and the difference matters:
- Marketing opt-in - whether they have agreed to marketing at all. It shows on the contact's page as Opted in or Not opted in. Outreach campaigns send only to people who opted in, unless you turn that check off.
- Do not contact - set per channel: email, SMS, WhatsApp or calls. Someone can be happy with email but not texts. Tick the contacts, press Do not contact and pick the channels. Whatever you pick replaces their current list.
If someone replies STOP to a text, do-not-contact is set for them automatically. Outreach campaigns, workflow messages, calls and pay-by-text requests to that contact all respect it.
The activity timeline
Open a contact and choose the Activity tab to see what has happened with them, newest first: messages sent and received through Outreach, form submissions, invoices, the services they are linked to, and changes to their record. The Notes and Linked records tabs sit beside it.
Saved lists
Build a filter (a search, a stage, a tag, an owner, or a channel they can be reached on) and press Save this view, give it a name and press Save list. The list stays live: contacts join and leave it as they change, so "everyone tagged VIP" is always current.
In Outreach, choose Saved list from Contacts to send a campaign to one, so you are not rebuilding the same filter every time.
Merging duplicates
Duplicates happen, for example when somebody signs up with a work address and later a personal one. To merge two contacts, ask the AI Assistant, for example "merge Ada Lovelace into ada@example.com". You choose which record survives, and the merge waits in AI Review until someone approves it.
Companies
If you sell to organisations rather than individuals, open Companies and press New company. Add a name and website domain, then press Add company.
To link a person, open their contact, press Edit, choose the Company and save. They then appear on the company's People tab. Deals and quotes can point at the company as well as the person, so when your contact leaves their job the history stays with the organisation.
Export and deleting
Press Export on the Contacts page to download the contacts in your current view as a CSV file.
Deleting a contact removes it from Contacts, deletes their AI call recordings and transcripts, and stops any campaign or sequence messages still waiting to go out. Invoices, form submissions and bookings are kept.
If someone asks you to erase their data, tick Erase everything about this person when you delete. Their messages, quote signatures, funnel visits and referral tracking are cleared as well, and their email address and phone number are blocked so nobody in your workspace contacts them again. Records held in other services, such as invoices and form submissions, still need deleting in each service.
Test it step by step
These steps prove Contacts works. You can try them in the sandbox first: open the workspace menu and choose Switch to Sandbox mode. The sandbox keeps its own contacts.
- Check your access. Contacts needs no install. The workspace owner and Admins can do everything. Other roles need the Contacts permissions (see, manage, fields, export) and the Companies permissions turned on under Members & access → Roles.
- Add a contact. Open Contacts, press New contact, type a name and an email address, add the tag "test" and press Add contact. You should see "Contact added" and the new row.
- Try a duplicate. Press New contact again with the same email in capital letters. You should see A contact with that email already exists. That proves matching ignores capitals.
- Import a file. Make a CSV with the header
Name,Emailand two rows, one using the same email as above. Press Import, choose the file, check the columns and press the import button. The result should say 1 new and 1 updated. - Save a list. Filter by the tag "test", press Save this view, name it and press Save list. You should see "List saved".
- Add a company. Open Companies, press New company, add a name and press Add company. Then open your contact, press Edit, pick the company and save. The contact appears on the company's People tab.
- See it from another service. If Invoicing is installed, add an Invoicing customer with the same email address. No second contact is made: open your contact and the Linked records tab shows it is linked to Invoicing.
For developers
There is no separate API for contacts. They are created or matched when you add people through other services' APIs, such as an Invoicing customer, a form submission, a newsletter subscriber or an Appointments customer. For example, with Invoicing installed and a sandbox key that has the service.invoicing.customers.manage scope:
curl -X POST https://app.softsolz.uk/api/v1/services/invoicing/customers \
-H "Authorization: Bearer sk_test_your_key" \
-H "Content-Type: application/json" \
-d '{
"display_name": "Ada Lovelace",
"email": "ada@example.com"
}'
A reply with the new customer means it worked, and Ada appears under Contacts, linked to Invoicing. Full details: Create a customer.
If something goes wrong
| What you see | What it means |
|---|---|
A contact with that email already exists. (code CONTACT_EXISTS) | Somebody already has that email address, whatever the capitals. Search for them and edit that contact instead. |
| Pick which column holds the email address or the phone number. | Every import needs an email or a phone column. Choose it from the column dropdowns before you import. |
That file has no contacts in it. (code CSV_EMPTY) | The file has a header row but no rows under it. Check you saved the right file as CSV. |
You don't have permission to do this... (code MISSING_PERMISSION) | Your role cannot make this change. Ask an Admin to turn on the Contacts permission named in the message under Members & access → Roles. |