Skip to content

Contact Task

Overview

The Contact Task manages contact records in your CRM - get contact details, add new contacts, or edit existing ones. Use it to maintain accurate contact information, link contacts to clients, and keep your CRM data up-to-date.

These are the people on a client's Contacts tab — see Contacts.

When to use this task:

  • Retrieve contact information
  • Add new contacts to existing clients
  • Update contact details
  • Link/unlink contacts from clients
  • Validate contact data
  • Manage contact relationships
  • Build contact databases
  • Sync contact information

Key Features:

  • Four actions: Get, Get Contacts, Add, Edit
  • Auto-validates emails and phone numbers
  • Auto-formats phone numbers to E.164
  • Links contacts to client records
  • Supports contact unlinking
  • Triggers global CRM events
  • Returns comprehensive contact data

The Contact task opened to its settings: Action set to Add Contact, with Client ID, First Name, Last Name, Email, Cell Number and Notes filled from earlier tasks

Quick Start

Get Contact:

1. Add Contact task
2. Select Action: Get
3. Enter a Contact ID, or add matching items (email, cell number, …)
4. Save

Get Contacts (all matches):

1. Add Contact task
2. Select Action: Get Contacts
3. Add matching items (e.g. Email Domain: acme.com)
4. Loop over the contact_ids output
5. Save

Add Contact:

1. Add Contact task
2. Select Action: Add
3. Enter contact details
4. Link to Client ID (required)
5. Save

Edit Contact:

1. Add Contact task
2. Select Action: Edit
3. Enter Contact ID
4. Update fields needed
5. Save

Configuration

Builder fields

The Field column is the label as it appears in the task builder; Key is the name the value is stored under and referenced by.

Field Key Type Default Notes
Action Action select get Options: Get Contact · Get Contacts · Add Contact · Edit Contact
Find the contact by _match_rows contact-match-rows – Only shown when Action is get
Find contacts by _match_rows_all contact-match-rows – Only shown when Action is get_contacts
Return contact data return_contact_data checkbox 0 Only shown when Action is get_contacts
Contact ID Contact ID text – Only shown when Action is edit
Client ID Client ID text – Only shown when Action is add, edit
First Name User Name text – Only shown when Action is add, edit
Last Name User Surname text – Only shown when Action is add, edit
Email User Email text – Only shown when Action is add, edit
Cell Number User Cell Number text – Only shown when Action is add, edit
Landline Number User Landline Number text – Only shown when Action is add, edit
Notes Notes textarea – Only shown when Action is add, edit
Custom Fields custom_fields contact-custom-fields – Only shown when Action is add, edit

Action Selection

Get Contact:

Action: Get
Contact ID: {{task_15001_match_contact_id}}

Retrieves all contact information.

Finding the contact (Get)

Get Contact can find the contact by several fields. Contact ID is always the first item; add more with Add matching item. A contact must match every item you fill in. Blank items are ignored, so leave the Contact ID blank to find the contact by the other items only.

This differs from Match to Client

Match to Client tries its criteria in order and stops at the first one that finds a client, so later criteria are fallbacks. The Contact task combines its items instead: each one you add narrows the search. An item that cannot be used — a variable that did not resolve, a value that is not a valid email, phone number, contact ID or option of the field — stops the lookup entirely and the run text says which item and why. Dropping the item instead would widen the search and return a contact the workflow never asked for. A blank item is different: it is simply ignored.

Item Key Matches
Contact ID Contact ID The contact with that ID. Given a comma-separated list, the first ID in it. Get only — an ID names one contact, so Get Contacts ignores it
Email match_user_email Exact email address (not case sensitive), or part of one when the item reads Contains
Email Domain match_user_email_domain Everyone at the same domain. Takes acme.com or a whole address
Cell Number match_user_cell_number Same number in E.164, digits-only or local form; falls back to the last 9 digits
Landline Number match_user_landline_number As Cell Number
Client Status match_client_status A contact linked to a client in that status, by status ID. Several IDs match any of them
A contact custom field match_contact_field_id_<id> Text, number, checkbox, single select and multi select. See below
Action: Get
Contact ID: (blank)
Email Domain: acme.com
VIP: Yes

finds the most recently added contact who is at acme.com and has VIP ticked.

Custom fields are the contact's own fields — see Contact custom fields. They use the same Direct / Variable control as the rest of the builder. A checkbox offers Yes / No, a select offers its options, and a multi select lets you pick several — a contact holding any of them matches. Switch to Variable to map a value in instead; the value is read the same way the Add and Edit actions read it, so a variable resolving to Yes, to an option's name, or to its ID all match.

How each item is matched. Between each item's field and its value there is a small button reading Matches, so the row reads as a sentence. Click it and it steps to the next way of matching, and round again at the end:

The button reads The item finds
Matches Records where the field is exactly your value. For a status or a dropdown, any of the options you pick
Does not match Records where the field is anything else, blank included. For a status or a dropdown, none of the options you pick
Contains Records where your value appears anywhere in the field. Capital letters make no difference
Does not contain Records where your value appears nowhere in the field, blank included
Is empty Records where the field is blank. No value is needed
Has any value Records where the field is filled in. No value is needed

Each item offers only the choices that mean something on it: all six on Email and on Text and Multi-line Text custom fields; the four without Contains on phone numbers and on dropdown, number and date custom fields; Matches and Does not match on Email Domain and Client Status. Contact ID and checkbox fields have no button. sales@ with Contains finds sales@acme.com and sales@other.co.za.

A Client Status item and a dropdown custom field let you tick several options: with Matches a contact holding any of them is found, with Does not match only contacts holding none of them. A contact has no status of its own, so "Client Status does not match Lost" finds the contacts with no linked client in that status, including contacts linked to no client at all.

The same button, with the same choices and wording, is on Match to Clients and on the Table task's filters.

Built through an AI connection, an item is { "field", "value", "how" }, for example { "field": "email", "value": "sales@", "how": "contains" }:

The button reads Stored as how
Matches left out
Does not match not_equals
Contains contains
Does not contain not_contains
Is empty empty
Has any value not_empty

Several statuses or dropdown options go in value as IDs separated by commas. A how the field cannot take is refused when the task is saved.

Unlike Match to Client, this finds contacts that are not linked to any client. When several contacts match every item, the most recently added one is used and the run text says how many matched. The matched_by output lists the items that were matched on.

Tasks built before matching existed only have a Contact ID, so they run exactly as before.

A list of IDs names the first one

contact_ids — from Get Contacts or from Match to Client — can be dropped straight onto Contact ID, and the task uses the first ID in the list. The run text says which one it used. Use a Loop when you want each of them, not just the first.

Get Contacts:

Action: Get Contacts
Email Domain: acme.com
VIP: Yes

Returns every contact matching all the items, as contact_ids — a comma-separated list of contact IDs, newest first. Each item you add narrows the list, so one item on its own returns the widest set.

By default it returns IDs only. To act on each contact, feed contact_ids to a Loop task and put a Get Contact task inside the loop, with the loop's item as its Contact ID. Or tick Return contact data and loop over contacts instead, with nothing to look up inside the loop.

Return contact data. Off by default. Tick it to also get the details of the matched contacts in contacts. It is the same box as the Table task's Return row data and Match to Clients' Return client data. contacts holds the first 100 contacts only, newest first; contact_ids still lists every match, so you can tell when there were more. Each contact in the list carries:

Field Example Notes
contact_id 881
contact_name Thandi First name
contact_surname Mokoena
contact_email thandi@acme.co.za
contact_cell_number +27821234567
contact_landline_number +27123456789 Empty when the contact has none
contact_notes Prefers WhatsApp.
contact_receive_invoices true
contact_email_unsubscribe false
contact_sms_unsubscribe false
client_ids 10482,10977 Comma-separated IDs of the clients the contact is linked to
custom_field_<id>_label Job title One pair for each custom field the contact has a value in
custom_field_<id>_value Sales Manager For a dropdown, the option ID(s)
custom_field_<id>_value_full Rugby, Cricket Dropdown fields only: the names of the options picked

At most 10,000 contacts are returned. When more match, the 10,000 most recently added are returned and the run text says so.

Add Contact:

Action: Add
Client ID: {{task_13001_client_id}}
First Name: {{task_55001_first_name}}
Surname: {{task_55001_last_name}}
Email: {{task_55001_email}}
Cell: {{task_55001_phone}}

Creates new contact linked to client.

Edit Contact:

Action: Edit
Contact ID: {{task_28001_contact_id}}
Cell: {{task_55001_new_phone}}

Updates existing contact fields. Only the fields you fill in are changed — a blank First Name, Last Name, Email, Cell Number, Landline Number or Notes leaves the contact's current value as it is, including when a mapped variable resolves to nothing. To fill in just a birthday, set the Contact ID, add that one custom field, and leave everything else blank.

Custom fields work like Edit Client: only the ones you add are touched, and an added custom field whose value is blank clears that field. When the value comes from a variable that is sometimes empty, put an If task before the Contact task so a missing value does not clear one already on the contact.

Contact Fields

First Name:

First Name: {{task_55001_first_name}}

User Surname (Last Name):

User Surname: {{task_55001_last_name}}

Email:

Email: {{task_55001_email}}

Auto-validated. Invalid emails are rejected.

Cell (Mobile):

Cell: {{task_55001_mobile}}

Auto-formatted to E.164. Invalid numbers rejected.

Landline:

Landline: {{task_55001_phone}}

Auto-formatted to E.164.

Position:

Position: {{task_55001_job_title}}

Job title or role.

Notes:

Notes: Additional information about contact

Client Linking

Link to Client (Add action):

Client ID: {{task_13001_client_id}}

Required for Add action.

Change Client Link (Edit action):

Client ID: {{task_15002_client_id}}

Move contact to different client.

Unlink from Client (Edit action):

Client ID: (leave empty)

Removes client link entirely.

Outputs

Field Type Example Notes
contact_id number 881 The contact acted on.
matched_by string email, vip The matching items the contact was found on.
contact_ids string 881,874,802 Get Contacts only: comma-separated contact IDs, newest first.
contact_count number 3 Get Contacts only: how many IDs were returned.
contacts array [{"contact_id":881,…}] Get Contacts with Return contact data ticked: the first 100 matched contacts. See below.
contact_name string Jane First name. Empty string when unset.
contact_surname string Doe Surname.
contact_email string jane@example.com
contact_cell_number string +27825550111
contact_landline_number string +27115550100
contact_notes string Prefers email
contact_receive_invoices boolean true Whether the contact receives invoices.
contact_email_unsubscribe boolean false true means they have opted out of email. Check this before sending.
contact_sms_unsubscribe boolean false true means they have opted out of SMS.
custom_fields array [{…}] The contact's custom fields, when the action returns them.
run boolean true
run_text string Contact retrieved.

Honour the unsubscribe flags

contact_email_unsubscribe and contact_sms_unsubscribe are returned so a workflow can respect them. Branch on them with an If Statement before an Email or SMS task.

Real-World Examples

Check whether someone has opted out before messaging

Schedule
  └─ Contact           get the contact
      └─ If Statement  {{task_28001_contact_email_unsubscribe}} is false
          └─ Email     send the campaign

Add a contact to a client

Form Submission
  └─ Match to Client   look the client up
      └─ Contact       add the new contact

Correct a contact's details

Webhook In
  └─ Contact   edit the contact's phone number

Best Practices

Email Validation

  1. Validate before submission - Check email format
  2. Handle invalid gracefully - Use If task to check success
  3. Unique emails - One email per contact (system enforced)
  4. Business emails preferred - Personal emails for individuals

Phone Numbers

  1. Use Phone Formatter first - Ensure consistent format
  2. Include country code - For international contacts
  3. Validate before submit - Invalid numbers are rejected
  4. Multiple numbers - Use cell and landline fields

Contact Linking

  1. Always link to client - Contacts need client association
  2. Verify client exists - Use Match to Client first
  3. Handle unlink carefully - Empty Client ID removes link
  4. One primary contact - Mark most important contact clearly

Data Quality

  1. Required fields - First name, last name, and client ID (for Add)
  2. Clean data - Trim whitespace, fix case
  3. Validate before create - Check for duplicates
  4. Update regularly - Keep contact info current

Troubleshooting

Contact Not Created

Check:

  1. Valid Client ID provided?
  2. Client exists in system?
  3. Email format valid?
  4. Phone number valid?
  5. First name and surname provided?

Debug: Check workflow logs for validation errors

Email Already Exists

Issue: Cannot create contact with duplicate email

Cause: Another contact already has this email

Solution:

  • Use Match to Client to find existing contact first
  • Update existing contact instead of creating new
  • Verify email is unique before creation

Phone Number Invalid

Issue: Contact not created due to phone validation

Cause: Phone number format not recognized

Solution: Use Phone Formatter first

Phone Formatter → Format: {{task_55001_phone}}
Contact (Add) → Cell: {{task_24001_phone_number_output}}

Contact Not Unlinked

Issue: Contact still linked after edit

Cause: Client ID field not properly emptied

Solution: Ensure Client ID field is completely blank (not "null" string)

Update Not Saving

Issue: Edit action doesn't update fields

Cause: Contact ID invalid or missing

Solution: Verify contact exists first with Get action

Frequently Asked Questions

Can I create contact without client?

No. All contacts must be linked to a client. Create client first with New Client.

Can I add multiple contacts to one client?

Yes. Run Contact task multiple times with same Client ID or use Loop.

How do I change a contact's email?

Use Edit action with Contact ID and new Email field.

Can I merge duplicate contacts?

No. This task doesn't merge. Handle duplicates manually in CRM or via custom code.

What happens to contact when client is deleted?

Contact remains but becomes orphaned. Re-link to different client.

Can I add custom fields?

No. Use Edit Client task to add custom fields to the client record.

How do I make a contact the primary contact?

System uses first created contact as primary. No specific "primary" flag in this task.

Can I get all contacts for a client?

Use Match to Client: its contact_ids output is a comma-separated list of every contact linked to the client.