Skip to main content

Contacts & Groups

Your personal contact list inside Community Surveys. Used as the audience picker for invitation campaigns.

Strict per-user isolation — every contact and contact group is owned by the admin who created it. No admin (including the site super-user) can see another admin's contacts. If you import a CSV, only you can use those contacts.

Open via Contacts in the left rail.


Layout

  • Top toolbar — search, group filter, plus three actions: + Add contact, Import, + New list.
  • Left rail — your contact lists (groups). Each shows the group name and contact count.
  • Main table — contacts in the selected list, or all your contacts when "All contacts" is selected.

Adding contacts one at a time

Click + Add contact. Fill in:

  • Name — display name; shown in invitation emails as the recipient name.
  • Email — required; must be unique within your contact list (other admins can have the same email).
  • Phone — optional.
  • Company — optional.
  • Add to lists — multi-select; assign to one or more contact groups.

Save. The contact appears in the table immediately.

You can edit any contact later by clicking its row.


Importing from CSV

Click Import in the toolbar.

Two ways to provide the CSV:

  1. Paste the CSV text into the textarea.
  2. Upload a .csv file from your computer.

Header detection

The first non-empty row is treated as the header. Column names are normalised (lowercased, non-alpha chars stripped) and mapped to canonical fields:

Your headerMaps to
name, full_name, display_namename
first_name, firstname(combined into name)
last_name, lastname, surname(combined into name)
email, email_address, mailemail
phone, mobile, phone_numberphone
company, organization, organisationcompany

If your file has a first_name + last_name columns but no name, the import combines them ("Jane" + "Doe" → "Jane Doe").

Required vs optional

  • Email — required. Without it the row is rejected.
  • Everything else — optional. Missing values become empty strings.

Duplicate handling

Within your contact list, email is treated as the unique key. Re-importing a CSV with existing emails silently skips those rows — no errors, no duplicates created.

If you want to update existing contacts (e.g. fix a phone number), edit them in the UI individually. Bulk update via import isn't supported by design (too easy to overwrite good data with a bad CSV).

Target list

Below the file/paste field, you can pick a target group. Every newly-imported contact is added to that group automatically. Pick "No group" to leave them un-grouped.

Result

After import, a summary toast: "Imported X, skipped Y duplicates". The table refreshes to show the imported contacts.


Contact groups (lists)

Lists organise contacts for campaign targeting. A contact can belong to multiple lists.

Creating a list

In the left rail, click + New list. Fill in:

  • Name — what the list is called. Shown in the campaign wizard's audience picker.
  • Description — optional one-liner.

Save. The list appears in the rail with a contact count of 0.

Adding contacts to a list

Two ways:

  1. From the contact edit form — "Add to lists" is a multi-select.
  2. From the table — select rows (checkbox) → Bulk → Add to list → pick the list.

Renaming / deleting a list

Right-click any list in the rail (or use the kebab menu on hover):

  • Rename — change the name. Doesn't affect contact memberships.
  • Description — edit the one-liner.
  • Delete — removes the list. Contacts stay (they just lose this membership).

Deleting a list does not delete the contacts in it.


Searching and filtering

The toolbar carries:

  • Search — full-text across name, email, phone, company. Debounced so typing doesn't fire a request per keystroke.
  • Group filter — defaults to "All contacts"; pick a specific list to narrow.

Both filters combine — search within a specific list, etc.


Bulk actions

Select rows via the row-checkboxes. A bulk-action bar appears above the table:

  • N selected — count of selected rows.
  • Cancel — clears the selection.
  • Add to list — multi-select which list to add into.
  • Remove from list — only enabled when you're viewing a specific list; removes the selected contacts from this list (they stay in others).
  • Delete — permanent delete of every selected contact. Confirmation dialog.

The "select all" checkbox in the header toggles every row in the current view (i.e. matches your current search + filter).


Privacy and isolation

The strict isolation guarantee:

  • Every contact carries a created_by column = the Joomla user id who created it.
  • Every query in the contact API filters by created_by = <current user>.
  • The integration runs even for core.admin super-users — they see their own contacts, not everyone's.

This matches the GDPR concept of "controller" — whoever imported the contacts is responsible for the legal basis on which they were collected. Sharing across admins would muddy that responsibility.

If you genuinely need shared contacts (e.g. a marketing team), each team member imports the same CSV. The duplicate guard scoped per-user means the imports don't conflict.


Audience for invitation campaigns

The Contacts page is the source of the recipient picker in invitation campaigns. When you create a campaign on the Invitations page:

  1. Pick a survey.
  2. Pick recipients — your contact groups and/or individual contacts.
  3. The campaign builds one tracked invitation per recipient.

See Invitations & Campaigns.


Limits

Soft limitNotes
Contacts per adminNone enforced; tested to 100kThe contact list scales server-side; the UI table is virtualised
Lists per adminNone enforced
Lists per contactNone enforced
CSV import size5 MB per uploadConfigurable via PHP upload_max_filesize
CSV columnsAll extra columns ignoredUnknown headers don't error
Bulk deleteAll selected at onceDELETE is hard delete; no recycle bin