---
title: "Call Logs & Timeline"
url: https://flexie.io/resources/phone/call-logs-and-timeline
description: "Where every call goes after it ends. What the call record holds, how it links to customers, where to find recordings, and how calls show up on the customer's timeline."
---

# Call Logs & Timeline

Last updated 26 May 2026

![A Flexie customer timeline interleaving phone calls, emails, SMS, WhatsApp, and notes, with a recording playback control on each call event](https://flexie.io/image/resources/phone-call-logs-and-timeline.png)

Every completed call leaves a record behind: who spoke, for how long, the recording if there is one, and a link to the customer it belongs to. The same record powers both the call-history list and the per-customer timeline.

On a customer's timeline, every call linked to that customer appears interleaved with email, SMS, WhatsApp, notes, and other events.

## What's in a call record

Each completed call leaves behind a record that holds:

| Field                | What it holds                                                                                  |
| -------------------- | ---------------------------------------------------------------------------------------------- |
| **Direction**        | Incoming or outgoing.                                                                          |
| **From / To**        | The two phone numbers in international format.                                                 |
| **Started at**       | When the call began.                                                                           |
| **Duration**         | Talk time after answer.                                                                        |
| **Outcome**          | Answered, Busy, No answer, Cancelled by caller, Declined, Failed. See the outcomes list below. |
| **Recording**        | A link to the recording (if recording is on for the channel).                                  |
| **Agent**            | The user who handled the call.                                                                 |
| **Linked customers** | The records this call has been attached to.                                                    |

### Call outcomes

The same outcome labels apply to both channels:

| Outcome                 | Meaning                                                 |
| ----------------------- | ------------------------------------------------------- |
| **Answered**            | The other side picked up; talk time was recorded.       |
| **Ringing**             | The call is still ringing (only visible on live calls). |
| **Busy**                | The other side was on another call.                     |
| **No answer**           | Rang through without being picked up.                   |
| **Cancelled by caller** | The caller hung up before the callee picked up.         |
| **Declined**            | The callee actively rejected the call.                  |
| **Failed**              | Network or routing failure, couldn't complete.          |

## How call records link to customers

Both channels run the same matching rule at the moment a call ends:

1. **Normalise** the other side's number to international format.
2. **Search every phone field** across leads, contacts, accounts, deals, cases, and users.
3. **For every match**, link the call to that record.

Concretely:

* Outbound to `+14155551212` matches a Contact's _Mobile_ field, so the call is linked to the contact (and to its account or open deals, if those records reference the same person).
* Incoming from `+14155551212` matches a Lead's _Phone_ field, so the call is linked to that lead.
* If `+14155551212` matches both a contact _and_ a separate lead, both get linked. The call appears on both timelines.
* If nothing matches, the call is logged but not linked. It still shows in **Call logs**; it just doesn't have a customer.

> Adding a phone field to **every** record type that might own the number (Contact, Lead, Account) is what makes the cross-record linking work. See [Custom records & fields](https://flexie.io/resources/customization/custom-records-and-fields) for the field types.

## Recordings

Recording is opt-in. On Twilio, the **Record calls** flag on the account turns it on for every call placed through that account. On a self-hosted PBX, recording is configured on the PBX itself, Flexie just stores the link the PBX hands back.

**Where the file lives:**

* **Twilio**: on Twilio's servers. The link in Flexie streams the recording directly from there.
* **Self-hosted PBX**: wherever your PBX puts recordings. Often a local network share, an object store, or a per-tenant subdomain.

**Playback:** on the call-log list, each row has a play button that opens an inline audio player. The same player appears on the customer's timeline when you expand the call event.

**Compliance:**

* Recording typically requires the caller's consent. Set up your greeting or IVR to announce recording, or your jurisdiction's equivalent.
* A user with view-only access can listen to recordings but not download them. A user with full access can download (the link to the audio file is exposed).

## On the customer's timeline

Every call that's linked to a record shows up on that record's timeline, interleaved with the other channels:

Each call event expands to show: direction and duration, the other party's number, the agent who handled it, the outcome, the recording (if any), and any notes added via the post-call modal.

The same timeline view interleaves email, SMS, WhatsApp, tasks, cases, and field changes, so the call sits in the right _moment of context_.

## Filtering and search in the call-log list

The call-log list supports the usual controls:

* **Search** by number, agent, or matched customer.
* **Filter** by direction (incoming or outgoing), date range, outcome, recorded vs. not recorded, has-note vs. no-note.
* **Sort** by date (default desc), duration, direction, or agent.
* **Export to CSV** uses the same export pipeline as everywhere else in Flexie (filtered and sorted view exported).

A user's access role determines what's visible. See-own vs. see-everyone is the typical split, configured under the standard **Roles** model.

## Manually mapping a past call to a customer

If you spot a call in the log that didn't auto-link to anyone (e.g. because the number wasn't on file at the time), open the call, click **Link to record**, search for the customer, save. The link appears on the customer's timeline retroactively.

A bulk version of this for backfilling history is the **Match past calls to this record** action, see [Workflows](https://flexie.io/resources/phone/workflows-and-automation#match-past-calls-to-this-record).

## Gotchas

* **Incoming and no-answer.** A ringing-but-unanswered call still creates a call record, with the outcome set accordingly. Use this for "called but didn't reach them" workflows.
* **Outgoing and no-answer.** Same, a row is written. The duration reflects what actually happened (zero, in this case).
* **Recording stops at hangup.** Whichever side hangs up first ends the recording, including if the customer hangs up after you've already said "this call is being recorded".
* **Linked-record performance.** A call against a phone that appears on many records (e.g. an account whose main number is also 200 contacts' work number) writes a lot of links. It works, but the timeline rendering is per-record, so each contact sees just the one event.

## Next

* [Live monitor](https://flexie.io/resources/phone/live-monitor): supervising the calls that are happening _right now_.
* [Workflows](https://flexie.io/resources/phone/workflows-and-automation): using a completed call as a workflow trigger.
