> For the complete documentation index, see [llms.txt](https://help.ringtonic.app/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.ringtonic.app/guides/contacts.md).

# Contacts

Contacts is Ring Tonic's lightweight CRM. Every phone call and form submission your tracking generates can be matched to a contact, moved through a pipeline of stages, and tracked from first touch to closed-won revenue — without leaving the platform.

{% hint style="info" %}
The Kanban view, contact detail page, custom fields, and stage drag-and-drop are **Agency plan** features. The basic table view and individual contact details remain available on every plan.
{% endhint %}

***

### The Pipeline

Every contact has a **stage** showing where they are in your funnel. Stages are forward-only by default — a contact advances automatically (from phone calls, form submissions, or events sent from other tools), but only owners and admins can move one backward.

| Order | Stage                  | Meaning                                                                                    |
| ----- | ---------------------- | ------------------------------------------------------------------------------------------ |
| 0     | **New**                | A contact exists but no event has been recorded                                            |
| 10    | **Contacted**          | An outbound or inbound interaction has happened                                            |
| 20    | **Form Submitted**     | The contact submitted a tracked form (via [Form Submissions](/guides/form-submissions.md)) |
| 30    | **Qualified**          | AI auto-qualification or manual review marked the lead worth pursuing                      |
| 40    | **Appointment Booked** | A calendar event was created (typically from an outside tool)                              |
| 50    | **Proposal Sent**      | A quote or proposal has been delivered                                                     |
| 100   | **Won** / **Customer** | Closed-won — revenue recognized                                                            |
| 200   | **Lost**               | Closed-lost                                                                                |
| 300   | **Unqualified**        | Excluded from the funnel (spam, wrong fit, etc.)                                           |

The terminal stages (Won, Customer, Lost, Unqualified) are **mutually exclusive** — once a contact lands in one, it stops advancing automatically. (Won and Customer are both "won" outcomes and share the same place in the funnel order.) To move a contact out of a terminal stage you have to drag it there yourself, which only owners and admins can do.

{% hint style="info" %}
**Why fixed stages?** Ring Tonic intentionally ships an opinionated stage set matching the call-tracking industry norm (CallRail, WhatConverts). This keeps funnel analytics consistent across workspaces. Workspace-customizable stages are a planned future enhancement.
{% endhint %}

***

### Kanban View

The default view at **Contacts** is a horizontally-scrolling Kanban board with one column per pipeline stage.

<figure><img src="/files/1lnfNjiucjgIXdoLhRDG" alt=""><figcaption><p>Contacts Kanban board — one column per pipeline stage, with counts and deal value</p></figcaption></figure>

**What each column shows:**

* **Stage label** (e.g. "Form Submitted") with a colored badge
* **Count** of contacts currently in that stage
* **Total deal value** — the combined value of all contacts in the column
* **Up to 50 cards**, most-recently-changed first
* **Load more** at the bottom if more cards exist

**Each card shows:**

* Contact name (or phone number if the name is blank)
* Phone number, formatted for your workspace
* Email, if known
* "About X hours ago" — when the contact last moved into this stage

**Click a card** to open the [Contact Detail](#contact-detail) page.

#### Moving cards between stages

Drag any card onto a different column to change its stage. Three behaviors:

* **Forward move** (e.g. Contacted → Qualified) — instant, no confirmation. Any logged-in user can do this.
* **Backward move** (e.g. Won → Qualified) — owners and admins only, with an **Undo** toast. Other users get a permission error.
* **Same column** — nothing happens.

{% hint style="info" %}
Moving a contact **backward** is recorded in its timeline as a manual change, and moving it out of Won or Lost automatically updates the matching won/lost close date.
{% endhint %}

<details>

<summary>Backward moves — for developers</summary>

Forward and backward moves fire the `contact.stage_changed` webhook. Backward moves use the `force_stage=true` path and are logged with `source: manual`. See the [API guide](/guides/crm-api.md) and [Webhooks](/guides/webhooks.md).

</details>

***

### Table View

Click the **Table** toggle (top-right of the Kanban) to switch to a flat, sortable, filterable table — handy for bulk operations or richer filtering.

<figure><img src="/files/r2wVKZtLlD4rgsoebETA" alt=""><figcaption><p>Contacts table view — sortable and filterable, with multi-select bulk actions</p></figcaption></figure>

* Sort by name, phone, last stage change, deal value, and more
* Filter by stage, campaign, source, or date range
* Multi-select for bulk actions (assign owner, archive, export CSV)

Ring Tonic remembers which view you used last.

***

### Contact Detail

Click any card or row to open the full contact detail page.

<figure><img src="/files/WpolHWOJT2rGfeYXRWTJ" alt="" width="563"><figcaption><p>Contact detail page — header, stage, deal value, and the timeline / tabs</p></figcaption></figure>

#### Header

* Contact name as the page title
* Current **Stage** badge
* **Value** — the contact's deal value
* Phone, email, and company (whichever are known)

#### Tabs

* **Timeline** — a chronological feed of everything tied to this contact:
  * Stage changes (showing where each one came from — a manual edit, a call, a form, or an outside tool)
  * Form submissions
  * Calls (with a link to the call detail page)
  * Notes
  * Repeat events that didn't change anything (marked **(ignored)** — see below)
* **Custom fields** — your workspace's custom fields (see [Custom Fields](#custom-fields))
* **Notes** — free-form team notes
* **Calls** — call history for this contact only
* **Forms** — form submissions for this contact, showing everything that was submitted

#### Why some events say "(ignored)"

When the same event happens twice (for example, the same visitor submits a form more than once), the first one moves the contact to the new stage. Later repeats still appear in the timeline but are marked **(ignored)**, because the contact is already at that stage. This keeps a complete history without throwing off your pipeline counts.

***

### Custom Fields

Custom fields are your own typed fields that attach to every contact. They accept values from form submissions, the API, and manual edits.

<figure><img src="/files/1UOHj46atczVUnmX2JKV" alt=""><figcaption><p>Custom fields on a contact — edit each typed field and click Save</p></figcaption></figure>

**Field types you can add:**

| Type              | What it's for                                      |
| ----------------- | -------------------------------------------------- |
| **Text**          | Free-form notes, IDs, statuses                     |
| **Number**        | Lead scores, ticket counts, quantities             |
| **Date**          | Appointment dates, deadlines                       |
| **Single Select** | One choice from a fixed list (lead source, region) |
| **Multi Select**  | Several choices from a list (tags, interests)      |
| **Boolean**       | A simple Yes/No toggle                             |
| **URL**           | A link, e.g. a LinkedIn profile                    |

#### Defining a custom field

1. Go to **Settings** → **Custom Fields**
2. Click **Add custom field**
3. Choose a **key** (a lowercase identifier like `lead_score` — it can't be changed after saving), a display **label**, and a **type**
4. For **Single Select** / **Multi Select**, add the allowed options
5. Mark **Required** if the field must be set on every contact (enforced on manual create/edit only; form submissions and API calls may leave it blank)
6. Save

{% hint style="danger" %}
**The key can't be changed.** Once a custom field is saved, its key is fixed — existing contacts' values are stored under that key. You can rename the **label** any time, and you can archive a whole field (which hides it from forms but keeps the historical values).
{% endhint %}

#### Editing custom field values on a contact

You edit custom fields one at a time, right where you see them. Open a contact — either the quick-view panel (click a card or row) or the full detail page — and go to the **Custom fields** section.

1. Find the field you want to change and click its **Edit** control.
2. An inline editor opens with the right kind of input — a text, number, date, or link box; a dropdown for Single Select; checkboxes for Multi Select; or a Yes/No toggle.
3. Make your change and click **Save**.

Each field saves on its own, so editing one never touches the others. Validation runs the moment you save (type, required, allowed options), and anything that needs fixing shows a message right on that field.

***

### How Stages Get Set Automatically

Most of the time you won't move contacts by hand — events do it for you.

| Event                                                    | Sets stage to                  | Notes                                                       |
| -------------------------------------------------------- | ------------------------------ | ----------------------------------------------------------- |
| Form submission matched by phone or email                | **Form Submitted**             | First submission only; later ones just add timeline entries |
| Phone call auto-qualified by AI                          | **Qualified**                  | Driven by your workspace's AI auto-qualification rules      |
| An event sent via the [Postback API](/guides/crm-api.md) | Whatever stage was sent        | Used to connect outside tools (CRM, scheduler, automations) |
| Manual drag in the Kanban                                | Whatever column you dropped on | Owners/admins for backward moves                            |

Stage advancement is **forward-only** by default. If a call or an outside event asks to move a contact *backward*, it's recorded in the timeline but the contact doesn't actually move. Only an owner or admin can move a contact backward (or a developer using the API's force option).

***

### Won and Lost Tracking

Ring Tonic tracks Won and Lost separately so your analytics can compute close rates and lost-revenue baselines.

* When a contact moves to **Won**, Ring Tonic records the close date and locks in the deal value — keeping your close-rate and revenue reports accurate.
* When a contact moves to **Lost**, it records the close date and keeps the deal value, so you can see how much potential revenue slipped away.

Funnel analytics in the [Analytics](/guides/analytics.md) section roll these up by source, campaign, and date range.

***

### Plan Gating

| Feature                                                            | Plan                                                         |
| ------------------------------------------------------------------ | ------------------------------------------------------------ |
| Contact detail panel (quick-view)                                  | All plans                                                    |
| Kanban view, full detail page, timeline, custom fields, stage drag | Agency                                                       |
| Auto-creating contacts from form submissions                       | Agency (via [Form Submissions](/guides/form-submissions.md)) |
| Creating/updating contacts via the API                             | Agency (via [API](/guides/crm-api.md))                       |

If you open **Contacts** on a non-Agency plan, you'll see a pricing prompt. Existing contact records remain accessible via the table view and individual detail panels.

***

### Common Questions

<details>

<summary>Can I import contacts from a CSV?</summary>

Yes — **Contacts** → **Add contact** → **Import from CSV**. Required columns are `name` and at least one of `phone` or `email`. Custom field columns are matched automatically by their header to a custom field's key.

</details>

<details>

<summary>What happens to a contact's data if I archive a custom field?</summary>

The values are kept on the contact. The field just stops appearing in new contact forms and the Custom Fields tab. To bring it back, un-archive it from **Settings** → **Custom Fields**.

</details>

<details>

<summary>Can two workspaces share contacts?</summary>

No. Contacts are workspace-scoped. The same phone number can exist as a contact in multiple workspaces, but each workspace's funnel is independent.

</details>

<details>

<summary>How do duplicate contacts get merged?</summary>

Automatic merging isn't available yet. When a new call or form comes in, Ring Tonic matches it to an existing contact by checking, in order: a reference ID from your other tools, then phone number, then email. If a match is ambiguous, it doesn't guess — it flags it so you can decide. A manual merge tool is on the roadmap.

</details>

<details>

<summary>Can I create custom stages?</summary>

Not yet — the stages are a fixed set. Workspace-customizable stages are planned but not committed.

</details>

<details>

<summary>How are deleted contacts handled?</summary>

Deleted contacts are moved to the trash — they disappear from the Kanban and table, but their identifiers (reference ID, phone, and email) stay reserved. If the same lead comes in again later, it's restored instead of creating a duplicate.

</details>

***

### Related Guides

* [Form Submissions](/guides/form-submissions.md) — capture leads from a website
* [API](/guides/crm-api.md) — push contacts and conversions programmatically
* [Analytics](/guides/analytics.md) — funnel chart and revenue-by-source reporting
* [Webhooks](/guides/webhooks.md) — subscribe to `contact.stage_changed` and `conversion.recorded`
