Skip to main content

Contacts

Maintain the people associated with your CRM companies -- billing contacts, site representatives, property managers, and other stakeholders. A contact can be linked to one or more companies and referenced from estimates, projects/jobs, and guest portal accounts.

Where it is​

Sidebar → CRM → Contacts

URL: /contacts (the list); clicking a row opens that contact's detail page

Both require the Contacts → View permission.

What it is for​

The Contacts page is the searchable, filterable list of every person recorded against your CRM companies -- billing contacts, site reps, property managers, and anyone else you need to reach. It is the entry point for creating a new contact and for bulk archive/delete/restore housekeeping on existing records.

Contacts list showing First Name, Last Name, Position / Job Title, Company, and Company Type columns, with Active/Archived tabs and Company/Company Type filters

Columns​

Contact uses the same configurable list as Company -- any column below can be added to a view; the five marked below are what the demo instance shows by default.

ColumnShown by defaultNotes
First NameYes—
Last NameYes—
Position / Job TitleYesThe column header and the create/edit form both read "Position / Job Title"
CompanyYesThe contact's current company, linked. See Company vs. Companies below for how this differs from the Companies tab
Company TypeYesThe Company Type of the contact's current company, not a property of the contact itself
Email AddressNoSearchable from the list search box even though it isn't a default column
Last Guest User InviteNoTimestamp of the most recent guest-portal invite sent to this contact
QuickBooks Online Sync StatusNoOnly meaningful on instances with the QuickBooks Online integration connected
All CompaniesNoEvery company linked to this contact -- broader than the single Company column
Created At / Updated AtNoStandard record timestamps
note

Gender, Location, and Industry are excluded from the column list entirely -- they cannot be added to any view, even though a Location can still be attached to a contact behind the scenes.

ControlTypeEffect
All / Active / ArchivedQuick tabsFilters by the record's archived state. Active is selected by default
CompanyFilter chipFilters by the contact's current company
Company TypeFilter chip (multi-select, searchable)Filters to contacts whose current company's Company Type matches one or more checked values
Search Name, Email, Position, Phone #Search boxFree-text search across name, email, position/job title, and phone number, per the placeholder
Column header click (e.g. First Name)SortToggles ascending/descending sort on that column

The list's underlying default sort is Last Name, ascending, even though First Name is the leftmost column and carries the sort-arrow indicator in the current view.

Company Type filter chip open on the Contacts list, showing the searchable option list with an Empty bucket

note

On the demo instance no Company Type values are configured yet, so the filter shows only No Company Type Options Available and Empty. Confirmed against the demo instance on 2026-09-08.

Contacts Archived tab, shown empty on the demo instance -- Export is disabled and the table reads "No Data Found"

Export​

Click Export to download the current view as CSV or PDF, reflecting the columns, sort, filters, and any selected rows at the time of export -- the same mechanism documented on Companies → Export. It is disabled when the active tab has zero rows (for example, an empty Archived tab, as shown above).

Bulk actions​

Select one or more rows with the row checkboxes to reveal a bulk-action bar:

TabActionPermissionEffect
ActiveArchiveContacts → ArchiveArchives the selected contacts. If any have related records, a confirmation lists the affected counts
ArchivedRestoreContacts → RestoreReturns the selected contacts to Active
ArchivedDeleteContacts → DeletePermanently deletes the selected contacts. The confirmation lists related-record counts and requires typing the total count to confirm
note

On a Company's own Contacts tab (documented below), the same list renders in a "detach" mode -- the bulk action reads Detach instead of Archive/Delete and only removes the link between the contact and the company, gated by Contacts → Assign rather than Archive/Delete.

Import​

There is no CSV/bulk import for contacts, unlike some other Appello list pages.

Creating a Contact​

  1. Click Create Contact in the top right (or Add New).
  2. In the Contact Create Form flyout, fill in First Name and Last Name (both required).
  3. Optionally fill in Position / Job Title, Email Address, Phone Work, Phone Extension, Phone Mobile, and LinkedIn URL.
  4. Under Company, click Add to open the Associate Company panel. Use Associate Existing to search for and select one or more companies already in your CRM, or switch to Associate New to create a company inline and link it in the same step.
  5. Click Save. Cancel closes the panel without saving.

Contact Create Form flyout with First Name, Last Name, Position / Job Title, phone fields, Email Address, an Add button under Company, and LinkedIn URL

Associate Company panel opened from the contact form, with Associate Existing / Associate New tabs and a searchable list of companies showing Primary Contact and Type

Contact Create Form fields​

Like Company, this panel is configuration-driven -- Appello builds it from the Contact model's field setup, so the exact fields, order, and which are required can differ per instance. What appears is configured in Property Settings (Contacts → Manage Forms / Detail View Layout). The fields below are what the demo instance shows today, in the order the form renders them.

FieldRequiredTypeEffect
First NameYesTextThe contact's given name
Phone ExtensionNoTextExtension for Phone Work
Last NameYesTextThe contact's surname
Position / Job TitleNoTextShown as a badge on the contact's detail-page header when present
Phone MobileNoText—
Phone WorkNoText—
Email AddressNoTextRequired before Guest User Access can be enabled (see below); must be unique across contacts
Company — AddNoAssociate-company pickerOpens the Associate Company panel (Associate Existing / Associate New) shown above, setting the contact's current company
LinkedIn URLNoText—
note

There is no street-address, gender, or tag field on the create/edit form on the demo instance, even though a contact can carry a location, a gender, and tags behind the scenes. None of the three appeared as a form field, list column, or detail-page field during this review. An instance could expose a location or a tag-style custom property by adding it in Property Settings, but no such field exists on the demo instance today. Confirmed against the demo instance on 2026-09-08.

Contact Detail​

Click a contact row to open their detail page. It has three tabs: Overview, Companies, and Settings.

Download a PDF of the contact​

The header above the tabs carries one action: a down-arrow Download icon button. It produces a one-record PDF of this contact -- a different thing from the CSV/PDF Export on the list above, which uses a fixed column set. Which fields the PDF contains is decided by a Download Template for Contacts, set up under Settings → Download Templates (see Templates → Download Templates).

Select Template For Export picker opened from a contact's Download button, with the template dropdown empty and Export disabled until a template is chosen

  1. Click the Download icon in the header.
  2. In the Select Template For Export picker, choose a template. Only templates created on the Contacts sub-tab of Download Templates are listed. Export stays disabled until one is chosen.
  3. Click Export. The PDF is generated from the fields that template has toggled on and downloads as <Company Name>_Contact Details_<date>_<time>.pdf. Cancel closes the picker without generating anything.

There is no separate permission for this button; anyone who can open the contact page can use it.

note

Confirmed from source (pages/contacts/[id]/index.tsx, components/ConfirmTemplate/TemplateSelectionModal.tsx, and the contactDetail case in pages/api/pdf-export.ts) and on the canary demo instance on 2026-09-08; the picker was opened and dismissed without clicking Export. The shared behavior of this picker is documented in Exports, Imports and Bulk Actions → Downloading a record with a download template.

Overview tab​

Gated by Contacts → View.

Contact detail Overview tab for a contact, showing Contact Details on the left (First Name, Phone Extension, Last Name, Position / Job Title, Phone Mobile, Phone Work, Email Address, Company, LinkedIn URL) and a Notes panel on the right

Card / fieldContents
Contact DetailsEvery field from the Contact Create Form above, read-only with a pencil-icon Edit button that reopens the same flyout
NotesA chronological note feed for this contact -- Create Note and Search Contact Notes
note

The Company field here (the contact's "current" company) and the list on the Companies tab are not always the same set. In the demo, a contact showed a current Company on Overview while its Companies tab read "No Data Found." Treat Company as the contact's primary/current company and Companies as the full list of companies this contact has been explicitly added to. Confirmed against the demo instance on 2026-09-08.

Companies tab​

Gated by the Certifications → View permission -- not a Contacts or Companies permission. Treat this as a known quirk rather than a rule to design around.

Every company this contact is linked to, narrowed to two columns -- Company Name and Company Type -- with All / Active / Archived and Company Type filters, the same list behavior as the standalone Companies page.

Companies tab on a contact record, with an Add Companies button, Company Name and Company Type columns, and Active/Archived/Company Type filters

Add Companies opens an Associate Company panel -- the reverse direction of the Associate Contact flyout covered below: here you're picking companies to add to this contact, with Associate Existing and Associate New tabs, matching the picker on the Create Contact form. Selecting one or more companies and saving links them to the contact; removing a company from this list unlinks it.

Settings tab​

Gated by Contacts → Edit.

Settings tab on a contact record, showing the Guest User Access card with a Send Email Invite button, and a note that custom property settings can be added via Update Properties

SectionContents
Guest User AccessInvite this contact to a guest portal login -- see below
Custom propertiesAny custom properties configured for the Contact model render here as additional fields/cards. When none are configured, the tab shows "No settings available" with an Update Properties link

Update Properties goes to Property Settings → Contacts, where the Contacts model's assigned fields and layout are configured -- the same generic Detail View Layout / Manage Forms / custom-properties system used across every Appello model.

Guest User Access​

A contact with an email address can be invited as a Guest User, giving them a login to a limited company portal:

  1. On the contact's Settings tab, click Send Email Invite.
  2. Once invited, the card shows the account as Invited on [date] until the person signs up, then Active after their first login. From here you can Resend Email Invite or Reset Password.
  3. For a guest account, a Portal Access toggle turns the login on or off, and an Associated Companies section lists every company the guest's contact record is linked to, each with its own Portal Access toggle and an expandable panel of that company's projects and standalone jobs -- toggle individual projects/jobs on or off to control exactly what the guest can see within that company. The contact's current company can't be hidden from the portal.
note

Guest User Access requires an email address on the contact -- the Send Email Invite button is disabled without one. Confirmed against the demo instance on 2026-09-08.

Primary, billing, and receivable contacts​

A company record -- not the contact record -- designates which of its linked contacts is the Primary Contact, and which is used for accounts payable / accounts receivable. See Companies for how those are set. A contact does not carry its own "is primary" flag; the same person can be the primary contact for one company and simply a contact on another.

Associate Contact​

Wherever a form needs to attach one Contact to another record, Appello opens the same Associate Contact flyout, with Associate Existing (search and pick) and Associate New (an inline Contact Create Form) tabs -- the mirror image of the Associate Company panel described above.

Associate Contact flyout opened from a Company&#39;s Contacts tab, showing Associate Existing / Associate New tabs and a searchable list of existing contacts with pencil-icon edit links

Launched fromWhat it sets
Company detail → Contacts tab → Add ContactsLinks one or more contacts to that company
Company Create/Edit form → Primary Contact / Accounts Payable Contact / Accounts Receivable Contact → AddSets that single named contact field on the company. See Companies
Project create/edit form → Project Contact → AddSets the project's site contact, which a standalone Job inherits when created from that project
Job create/edit form → Primary Contact → AddSets the job's own contact field for jobs not tied to a project, or to override an inherited one
Estimate / Change Order detail → recipient contactSets the single Contact an estimate is addressed to -- see Estimate report

In every case above the picker is the same control, which is why it always looks and behaves identically regardless of which screen opened it. All of these are cancel-safe -- closing the flyout or clicking Cancel attaches nothing.

Where contacts are used elsewhere​

  • Companies -- a company designates one linked contact as its Primary Contact, and optionally separate contacts for accounts payable and accounts receivable; any contact can also simply be listed on a company's Contacts tab. See Companies.
  • Projects and Jobs (site contact) -- a Project's Project Contact field (and a standalone Job's own Primary Contact field) names a single site-level point of contact, set through the same Associate Contact flyout described above.
  • Estimate recipients -- an estimate can have a single Contact attached as its recipient, set via the Add button on the estimate. See the Estimate report page.
  • RFIs and Work Orders -- neither RFIs nor Work Order line items carry a direct contact field. An RFI's printed PDF instead pulls its "Contact" block from the RFI's linked Company's Primary Contact rather than from a contact assigned to the RFI itself.
  • Guest portal accounts -- a contact with an email address can be turned into a guest-portal login, scoped to specific companies and their projects/jobs. See Guest User Access above and Guest Portal.
  • Notification recipients for forms -- contacts can be added as email notification recipients on Projects and Safety Forms, so people outside your own workforce (a property manager, a GC's site contact) are copied on the relevant activity. See Form Management.
note

Appello can also associate notification recipients with Jobs behind the scenes, but this review did not find a corresponding control on the Job editor screen, so it is not documented here as a user-facing feature.

Permissions​

PermissionGates
Contacts → ViewThe Contacts list and a contact's Overview tab
Contacts → CreateCreate Contact / Add New and the Associate New tab of every Associate Contact flyout
Contacts → EditEditing an existing contact's fields, and access to its Settings tab
Contacts → ArchiveThe Archive bulk action on the Active tab
Contacts → RestoreThe Restore bulk action on the Archived tab
Contacts → DeleteThe Delete bulk action on the Archived tab
Contacts → AssignLinking/unlinking companies to a contact (Add Companies / Detach, and the reciprocal Add Contacts on a company)
  • Companies -- Company records contacts are linked to, including Primary/AP/AR contact assignment
  • Estimate report -- Where an estimate's recipient contact is set
  • Projects -- Projects where contacts serve as the site contact or notification recipients
  • Guest Portal -- The limited login a contact can be invited into via Guest User Access
  • Form Management -- Where contacts are added as notification recipients on forms
  • Property Settings -- Configures the Contact model's form fields, layout, and any custom properties