# Changelog (/docs/changelog)

> For the complete documentation index, see [llms.txt](https://docs.tandemcx.ai/llms.txt). Any page on this site can be fetched as Markdown by appending `.md` to its URL.

<Callout type="info">
    Each entry is dated when the change reached the platform. Some features are enabled per
    organization, so a change listed here may not be in your sidebar yet — the page documenting it
    says so where that applies.
</Callout>

## 2026-11-12

- **Added** — Call Logs labels the number an inbound voice call came in on **Toll-free** or
  **Local**, the kind of number its call minutes are billed as, and lists a browser test call as
  **Browser test call**. On the Billing page's **Usage** tab, a note explains that one call can
  bill several lines, with a **View by Conversation** button. See [Call
  Logs](/docs/workflows/insights-and-reporting#one-row-per-conversation).
- **Added** — Route a SIP trunk number straight to a voice agent. A trunk number's sidebar on
  **Admin → Phone Numbers** and each number in the trunk editor on **Admin → SIP Trunks** now
  have a **Workflow** or **Agent** choice, and the trunk's **Default Route** can be an agent
  too. An agent's **Phone Numbers** card also lists trunk numbers, and unchecking one returns it
  to its trunk's default route. The **Create SIP Trunk** dialog has the same **Default Route**
  choice. See [Route a trunk's calls](/docs/overview/sip-trunks#route-a-trunks-calls).
- **Added** — A choice of MAIL FROM subdomain on **Admin → Email Domains**. **MAIL FROM
  Subdomain** in the **DNS Records** dialog moves the `MX` and `TXT` records off `mail.`, for a
  domain where that name is already in use. The **DNS Records** list also now shows the MAIL
  FROM name Amazon SES has on file. See [Choose the MAIL FROM
  subdomain](/docs/overview/email-domains#choose-the-mail-from-subdomain).
- **Changed** — When a workflow's **Transfer to External** node sends an inbound call to an
  outside number, its call minutes up to the transfer are now billed, beside its IVR time. Before,
  it billed IVR with no **Local call** or **Toll-free call** line. See [How a call is
  billed](/docs/overview/billing#how-a-call-is-billed).
- **Changed** — Tandy chats are now kept on Tandem's servers, per user and per organization, so a
  chat you start on one device is there on every other. A chat is deleted 90 days after its last
  message, and an attached file 30 days after you upload it. After that the file's chip shows
  **Expired**, and Tandy is told the file is gone. **Delete** on a chat and **Delete All** remove
  chats from the server immediately. Chats already in your browser move to the server the first
  time Tandy opens after this update. A very long chat keeps its most recent 500 messages or
  200,000 characters, and its old attachments keep their names but not their files. A member you
  remove or disable in [Manage Users](/docs/overview/manage-users) loses their Tandy chats in that
  organization, and in any sub-tenant the disable removed them from. A member removed anywhere
  else loses them after 90 days. The browser now keeps only whether the Tandy dock is open. See
  [Tandy](/docs/overview/building-with-ai#tandy).

## 2026-11-05

- **Added** — Call results and **Needs Follow-up** on the scheduling **Bookings** page. Each
  callback's badge says what happened to its call: **Upcoming**, **Due now**, **Call started**,
  **Call failed**, **Not called**, **Call status unknown**, **No call made**, **Handled**, or
  **Cancelled**. **Call started** means the calendar's workflow started, not that the customer
  answered. The **Needs Follow-up** status filter lists callbacks whose call failed or never
  happened, and **Mark Handled** and **Reopen** in a callback's sidebar clear and restore them.
  Rescheduling a callback clears its call result. The time pickers in **New Callback** and
  **Reschedule** show one day's open times at a time under a row of days. See [Needs
  Follow-up](/docs/agents/scheduling#needs-follow-up).
- **Changed** — The agent editor no longer locks a published version. You can edit it as you
  would a draft; **Save as New Draft** (and ⌘S) saves the edits as a new version, and the
  published one is not changed. A rename is the exception: the name isn't versioned, so it applies
  when you save. This matches the workflow editor. See
  [Versioning](/docs/agents/voice-agents/versioning).
- **Added** — Coach on an earlier message on the Supervisor page. Hover a message from the agent
  or the customer and click the coach icon. The note is sent with that message quoted, and shows
  the quote in the transcript. See [Coaching the
  agent](/docs/agents/live-conversations#coaching-the-agent).
- **Added** — Open times on the scheduling **Bookings** calendar. With one calendar selected,
  open times are tinted and full times are greyed, a calendar with several seats per time shows
  notes such as `2 of 3`, and only an open time starts **New Callback**. Grid rows follow the
  calendar's slot length. A callback's sidebar now has **Cancel Callback**. On a phone or a
  narrow window, Bookings lists callbacks as cards, the calendar shows the day as a list with
  **New Callback** on each open time, and **Calendars** shows each calendar as a card. See
  [Open times on the calendar](/docs/agents/scheduling#open-times-on-the-calendar).
- **Added** — **Schedule callbacks** on an agent's **Built-in Tools** row. The agent checks a
  calendar's open times and books a callback for the caller, in a voice call or website chat. It
  never books **As soon as possible** or a time less than 15 minutes away, and books at most one
  callback per conversation. On a test call it always asks for a callback number. Callbacks it
  books show **Booked By** **Agent**.
  See [Schedule callbacks](/docs/agents/voice-agents/built-in-tools#schedule-callbacks) and
  [Booking from an agent](/docs/agents/scheduling#booking-from-an-agent).
- **Changed** — The **Pricing** panel on the Billing page is regrouped: AI first, with the tokens
  included per conversation and the overage rate, then calls, messaging, phone numbers, seats, and
  compliance costs. Calls and text messages show the inbound and outbound price side by side, and
  the half-minute rounding is said once at the top instead of under each row. The panel no longer
  says each charge is rounded up to the nearest cent, because individual charges aren't rounded.
  See [What things cost](/docs/overview/billing#what-things-cost).
- **Changed** — The Billing page's **Usage** tab shows what usage cost, at your contract's rates,
  with a rate and cost on every row. **By Product** totals each product for the range, and the
  range's total shows how much was paid from credits and from your balance. **By Day** lists each
  product per day. **Filters** narrows by category and product, the range starts at **This
  month**, and **Export** downloads the rows as a CSV file. **Group by** is removed.
  **By Conversation** lists each conversation with what it used and cost, and a conversation's
  page in Call Logs shows its cost. See [Usage](/docs/overview/billing#usage) and
  [What a conversation cost](/docs/workflows/insights-and-reporting#what-a-conversation-cost).
- **Changed** — Digital AI and token overage are now charged. A web chat is charged for
  Digital AI once, when an AI agent first replies, and a chat no AI agent replies to is not
  charged. Tokens past a conversation's allowance are charged in whole thousands, with one
  allowance per conversation on calls and web chats: as a web chat goes, and on a call when the
  AI agent hands it on or the call ends. Until now neither was charged. See
  [How AI is priced](/docs/overview/billing#how-ai-is-priced) and
  [Fair use](/docs/overview/billing#fair-use).
- **Changed** — Voice AI time is now charged at the per-minute rate on the Pricing panel. It
  counts only while an AI agent has the call, and stops when the agent hands the call to a
  workflow, when a transfer connects, or when a supervisor takes over. A call's voice AI time is
  added up and then rounded up to the next half minute. Until now no voice AI charge was applied.
  See [How AI is priced](/docs/overview/billing#how-ai-is-priced).
- **Changed** — In a website chat, agents no longer ask visitors to spell or read back what they
  typed. The `collect-code` and `verify-identity` platform skills and the data-collection field
  guidance use chat wording, and `read-back-values` is skipped in a chat. Calls are unchanged.
  See [Platform skills](/docs/agents/voice-agents/skills#platform-skills).
- **Changed** — Call time, IVR time and voice AI time now round up to the next half minute. Any
  part of a half minute bills as a whole one, so a 13-second call bills as half a minute and a
  65-second call as a minute and a half. Before, they rounded to the nearest half minute, and a
  call under 15 seconds was not billed. See
  [How time is rounded](/docs/overview/billing#how-time-is-rounded).
- **Fixed** — A call that ends because of a system error is no longer billed. That covers a call
  turned away because the platform was busy, a call whose workflow failed to start, and a call
  dropped because its AI agent could not be connected. See
  [Billing](/docs/overview/billing#included-at-no-charge).
- **Changed** — The scheduling booking page now opens on the open times, with a **Call me now**
  card above them when **As soon as possible** is on. Nothing is selected to start with, and the
  **Continue** button names the choice. The confirmation shows **You're booked**, **Add to
  calendar** for a picked time, and what happens next, including whether a confirmation message
  can be sent. When none can be, it says so and offers **Copy link**. The callback's own page
  shows the same lines. The form and the inline embed now fit phone screens, and the inline
  embed's height can shrink between steps. See [Callback
  scheduling](/docs/agents/scheduling#what-customers-see) and [Sharing and
  embedding](/docs/agents/scheduling/sharing-and-embedding).
- **Fixed** — On a phone, the scheduling booking page's arrows skipped days. A phone shows about
  three day cards, and the right arrow loaded the next set of days, so days past the edge were
  reachable only by swiping. The arrows now move through the hidden cards first and select the
  first new day. Long names, emails, and reasons on the confirmation and the callback's own page
  now wrap instead of running off the screen. See
  [What customers see](/docs/agents/scheduling#what-customers-see).
- **Added** — **Number customers see** on a calendar's **Call** tab. It sets the number shown on
  the confirmation as `The call comes from {number}`. It does not change the caller ID the
  workflow dials from. See
  [Calls](/docs/agents/scheduling/calls#number-customers-see).
- **Changed** — **Pricing** on **Admin → Billing** now shows the prices on your account's
  billing contract, including any prices agreed for your account. Before your account has a
  contract it shows the standard rates and says so. A price the contract does not set is no
  longer listed. `GET /v1/billing/rates` now returns each product's name and price, in cents or
  as tiers, with a `source` field saying where the rates came from. See
  [Billing](/docs/overview/billing#what-things-cost).
- **Added** — Request and response details on tool calls. An integration tool's row in a
  transcript now shows the HTTP status its endpoint answered with, as a chip beside the outcome.
  A `404` still reads **Succeeded**, because the tool got an answer. Admins can expand the row for
  **Request**, **Response**, and **Agent saw** tabs, with bodies cut at 64 KB. Details are kept
  for 90 days, and on a call or chat they are deleted with the transcript. They appear on the **Supervisor** board,
  under **Recent Calls**, in a preview call, and in test results. The Spark MCP's
  `get_conversation_transcript` returns the same fields under the same check. See [Request and
  response details](/docs/agents/live-conversations#request-and-response-details).
- **Changed** — Phone number labels and variables now have limits. Updating a number with
  `PUT /v1/routing/phone-numbers/{phoneNumberId}` returns a `400` when the label is over 200
  characters, or when the variables exceed 50 entries, 128 characters in a name, 2,000 characters
  in a value, or 64 KB in total. Requests over these limits used to be accepted, or failed with a
  `500` near the storage limit. An update sends the number's full set of variables, so a number
  that already has more than 50 must be brought under the limit in that same update, including
  an edit made in **Phone Numbers**.
- **Removed** — `/v1/messaging` is no longer part of the public API. It had no published
  reference here, and workflows and agents send texts with **Send SMS** as before. A request to
  `POST /v1/messaging/send` with an access token now returns `404`.
- **Added** — `GET /v1/billing/usage/costs` returns what your usage cost per product per day, at
  your contract's rates, and how much of each day was paid from credits and from your balance.
  Amounts are in cents and may be fractional. See
  [List usage costs](/docs/api/billing/billing/listUsageCosts).

## 2026-10-20

- **Changed** — Scheduling limits moved from **Admin → Scheduling** to **Limits** on the
  **Flows → Scheduled** page, and only an Owner or Admin can change them. A Member no longer sees
  **Limits**, and `PUT /v1/settings/scheduling-policy` now refuses a Member with `403 FORBIDDEN`.
  The old address redirects to **Scheduled**. See [Limits and
  defaults](/docs/workflows/scheduling-workflows#limits-and-defaults).
- **Changed** — Voice agents on Claude Haiku 5.5 can turn on **Reasoning**, and the thinking
  budget picks an effort level. With **Reasoning** off, which is the setting every existing
  Claude Haiku 5.5 agent has, the model no longer thinks before it answers, so replies start
  sooner. Turn **Reasoning** on to keep the thinking. See [Claude Haiku
  5.5](/docs/agents/voice-agents/brain#claude-haiku-55).
- **Added** — **Scheduling → Bookings** can book callbacks: **New Callback**, **Schedule
  Follow-up** from any callback, and a click on an empty half hour of the calendar. Drag a
  callback on the calendar to reschedule it. The customer gets the same confirmation and
  reminders as when they book. See [The Bookings page](/docs/agents/scheduling#the-bookings-page).

## 2026-10-16

- **Changed** — The app, the webhook alert email, and these docs say Tandem where they still said
  Spark. An account top-up shows as `Tandem account top-up` on the Stripe checkout page, and the
  users export is named `tandem-users-<date>.csv`. Webhook header names such as
  `Spark-Signature`, the chat widget's embed code, and access-token prefixes are unchanged, so
  existing integrations keep working.
- **Changed** — **Editing with Tandy** moved to
  [/docs/agents/voice-agents/editing-with-tandy](/docs/agents/voice-agents/editing-with-tandy).
  The old address redirects there.

## 2026-10-15

- **Added** — **Insights → Call Logs** has a **Handled by** column showing the workflows and AI
  agents that took each conversation, and **Type** and **Agent** filters. See [Who handled a
  conversation](/docs/workflows/insights-and-reporting#who-handled-a-conversation).
- **Added** — **Scheduling → Bookings** has a calendar view: a week or day grid of callbacks in
  your time zone, with each calendar's color. Click a callback to open its details. See [The
  Bookings page](/docs/agents/scheduling#the-bookings-page).
- **Added** — A parent organization's Audit Log and Call Logs include its sub-tenants' events
  and conversations, with an **Organization** column and filter. See [See a sub-tenant's
  activity from the parent](/docs/overview/sub-tenants#see-a-sub-tenants-activity-from-the-parent).
- **Added** — The **Contacts** page can list your Zendesk end-users. Switch to **Zendesk**, or to
  **All** to see them under your contacts, then page and search them and open any one in a
  read-only sidebar. Needs a Zendesk integration with `users:read` in its scopes. See [Your
  Zendesk users](/docs/agents/contacts#your-zendesk-users).
- **Changed** — On **Contacts**, open a contact with **Edit** on its row; clicking the row no
  longer opens it.
- **Changed** — A calendar's **Delete Calendar** moved from the editor's header to the bottom of
  **Basic Info**, and the **Calendars** list can delete one from its row. On **Bookings**,
  **Reschedule** and **Cancel Callback** are icons in the **Actions** column. See [Pausing or
  deleting a calendar](/docs/agents/scheduling#pausing-or-deleting-a-calendar).

## 2026-10-14

- **Changed** — Tandy's page moved from `/ask-sparky` to `/ask-tandy`. Old links and bookmarks,
  including deeper ones like `/ask-sparky/history`, redirect to the same place. Opening the app
  at its root address now draws the Tandem logo, with the name sliding out beside it, before
  going to Tandy's page; reduced motion skips it.
- **Changed** — The left navigation groups Agents, Flows and Integrations under **Automations**.
  Agents, Workflows and Integrations are rows in it, with their pages indented beneath them:
  Knowledge Base and Coaching under Agents, Scheduled and Audio Files under Workflows. Page
  addresses and the breadcrumb are unchanged.
- **Changed** — Tandy has its own icon: a sparkle with two of the Tandem logo's lanes in its
  corner, in place of the generic sparkle.
- **Added** — IVR usage: time a call spends in a workflow is charged per minute, rounded to the
  nearest half minute. Time with an AI agent or a person is not included. See [How IVR is
  priced](/docs/overview/billing#how-ivr-is-priced).

## 2026-10-13

- **Changed** — Tandem has a new look across the app and these docs: a new logo, new colors,
  and the Plus Jakarta Sans typeface. The product is now called Tandem. A chat widget with no
  **Brand Color** set now uses violet (`#a875ff`) with black text, where it used indigo with
  white. To keep indigo, set **Brand Color** to `#4f46e5`. See
  [Brand color](/docs/agents/chat-widget#brand-color).
- **Changed** — The in-product assistant, Sparky, is now called Tandy. It works the same way.
- **Changed** — Where the chat widget uses your **Brand Color** as text (the selected tab, links,
  and **Start a new conversation**), a color that is too light to read on the white panel is shown
  darker, until it reaches the 4.5:1 contrast minimum. Fills such as the header are unchanged.
- **Added** — An agent in a website chat can hand the conversation to a workflow with a **Workflow
  (Handoff)** tool and take it back when the workflow finishes, as on a call. Being rolled out per
  organization. See [Handoffs in website chat](/docs/agents/voice-agents/tools#handoffs-in-website-chat).
- **Added** — **Linked Records** on a contact. Link a contact to the same person in your Zendesk
  by pasting their profile link or user id, and open their Zendesk profile from the contact.
  Needs a Zendesk integration. See [Linking a contact to
  Zendesk](/docs/agents/contacts#linking-a-contact-to-zendesk).
- **Changed** — Voice AI time is billed to the nearest half minute, the same as call time. The
  **AI Voice** rate in **Pricing** on **Admin → Billing** now says so. See
  [Billing](/docs/overview/billing).

## 2026-10-12

- **Added** — Agent tests can set a caller number, a contact, keypad entries, workflow variables,
  and a returning caller's memory, so `capture_dtmf`, `set_workflow_variable`, `update_contact`,
  `lookup_contact`, and `transfer_to_voice_agent` can be tested. The contact and memory exist only
  in the test. A new check, **Sets a workflow variable**, checks what the agent recorded. See
  [Call inputs](/docs/agents/voice-agents/tests#call-inputs).
- **Changed** — Tests that check or stub `capture_dtmf`, `set_workflow_variable`, or
  `transfer_to_voice_agent` are now valid, because tests offer those tools. A saved test with a
  **Tool not called** check on `update_contact` or `lookup_contact` and no caller now reads
  **Invalid**. A test whose agent transfers to another agent now ends **Handed off**.
- **Fixed** — Saving an agent test now refuses a tool name that isn't a tool, such as a setting's
  name, and names the tool you meant. Suggested and recommended tests use the agent's real tool
  names. A **Tool not called** check on a tool the version doesn't have now reads **Invalid**
  instead of passing. See [Agent tests](/docs/agents/voice-agents/tests).
- **Changed** — Tests on agents with keypad capture, **Keypad Input**, or Set Workflow Variable
  now see those tools (and the keypad sentence in the prompt), so their results can change.
- **Changed** — A website chat, and the chat preview in the chat widget editor, no longer offer
  an agent's **Workflow (Handoff)** tools, which told the visitor they were being transferred
  without transferring them. Calls are unchanged.
- **Changed** — On an agent's Tests page, select a test's row, or **View Results** in its **⋮**
  menu, to open its latest result; a test that hasn't run opens with **Run Test**, and a repeated
  test opens on its first attempt that didn't pass. A finished run shows how many tests passed or
  failed, with **View Results**, and each criterion in a result is marked **AI judged**. Enabled
  per organization with tests. See [Run tests](/docs/agents/voice-agents/tests#run-tests).

## 2026-10-08

- **Added** — **Schedule Workflow** and **Cancel Scheduled Workflow** nodes run a published
  workflow once at a later time, from a workflow or an AI agent, and cancel it by key. Being
  rolled out. See [Scheduling workflows](/docs/workflows/scheduling-workflows).
- **Changed** — Scheduled runs now use the version published when they fire, and every
  organization has scheduling limits an admin can change on **Admin → Scheduling**. See
  [Limits and defaults](/docs/workflows/scheduling-workflows#limits-and-defaults).
- **Added** — **Recommend Tests** on an agent's Tests page writes up to 3 tests from the version's
  setup and recent calls for you to review. Suggested tests, including coaching's, now also appear
  on the Tests page, with **Accept All**. The **Agents** list gains a **Tests** column with each
  agent's result on its published version. Enabled per organization with tests. See [Recommend
  tests](/docs/agents/voice-agents/tests#recommend-tests).
- **Fixed** — An agent whose tests were all edited after their last run showed "Passing 0/N". It now
  shows **Not run**.
- **Added** — In the workflow editor, a **+** beside each exit that isn't connected yet adds a
  node there and connects it to that exit. **Add Node** now leads the controls at the bottom of the
  canvas, and an empty workflow shows it in the middle of the canvas. See [Adding
  nodes](/docs/workflows/flow-basics#adding-nodes).
- **Fixed** — On the Coaching page's **Decided** tab, an applied recommendation said "Changed since
  this was recommended". Decided recommendations now show the change as it was recommended, under
  **What Changed** or **What Was Proposed**. See [What a recommendation
  contains](/docs/agents/coaching#what-a-recommendation-contains).
- **Fixed** — In a narrow window, the Coaching page squeezed an agent's recommendations until they
  overflowed or disappeared. The agent list and the agent now take turns there, and **Apply** and
  **Dismiss** stay on each recommendation whenever it has room. See [The agent
  list](/docs/agents/coaching#the-agent-list).
- **Added** — **Recognize texters**, under **Admin → Contact Attributes → Settings**. With it on,
  the texts your workflows send are matched to a contact by phone number, and a number no contact
  holds gets a new contact. Texts your phone numbers receive are matched once inbound texting on
  your account has moved to the current messaging service; ask support whether yours has. Off by
  default. See [Text messages](/docs/agents/contacts#text-messages).
- **Added** — **Agent tests.** Write scripted or simulated conversations that check an agent's
  tool calls, disposition, and replies, run them against any version, and see the results in the
  publish dialog. Enabled per organization. See [Tests](/docs/agents/voice-agents/tests).
- **Added** — Three more ways to write agent tests: **Make a Test** on a conversation in Call Logs
  drafts one from what was said, Tandy writes and runs tests with your approval
  (`/writing-agent-tests`), and coaching suggests tests from the calls it reviews and after you
  apply a recommendation. The MCP server gains eight agent-test tools. Enabled per organization
  with tests; suggestions also need coaching. See [Make a test from a
  conversation](/docs/agents/voice-agents/tests#make-a-test-from-a-conversation).
- **Changed** — Deleting a contact now asks whether to also delete the person's conversation
  history: call records and transcripts, and website chat conversations. The box is checked by
  default; cleared, the contact and what your voice agents remember about the person are deleted
  and the history stays. See [Deleting a contact](/docs/agents/contacts#deleting-a-contact).
- **Changed** — The contacts API's delete takes `history=keep` to keep the conversation history,
  and `GET` and `PUT /v1/contacts/settings` read and change **Recognize texters**.

## 2026-10-07

- **Added** — Callback scheduling: booking pages where customers pick a callback time in their
  own time zone, or ask to be called as soon as possible. Set each calendar's hours, capacity,
  and booking form under **Scheduling → Calendars**, see what was booked under
  **Scheduling → Bookings**, and share the page by link or embed it on your website. Customers
  get a confirmation, reminders, and change notices by email and text, and each calendar can
  send signed webhooks for every booking event. Enabled per organization. See
  [Callback scheduling](/docs/agents/scheduling),
  [Booking messages](/docs/agents/scheduling/messages), and
  [Webhooks](/docs/agents/scheduling/webhooks).
- **Added** — Callback scheduling can call the customer: at the booked time, Tandem runs a
  published workflow you choose on the calendar's **Call** tab. See
  [Calls](/docs/agents/scheduling/calls).
- **Changed** — A customer who texts STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, or QUIT to any of
  your numbers no longer gets texts from your organization's workflows: a **Send SMS** node to
  their number takes its fallback exit. START or UNSTOP undoes it, and HELP texts back what the
  messages are. Any of these words texted on its own no longer reaches a workflow, including a
  **Send SMS** node waiting for a reply, so a workflow that asks customers to reply CANCEL needs a
  different word. Tandem acts on these words once inbound texting on your account has moved to
  the current messaging service. See
  [STOP, START, and HELP](/docs/agents/scheduling/messages#stop-start-and-help).
- **Added** — **Test** in the workflow editor runs the saved version as a browser voice call, a
  run with starting variables, or a first SMS or chat message. The test stays on the canvas,
  which shows the path the run takes, and a run panel shows each node's exit, response, and
  variables. Being rolled out. See [Test a
  Workflow](/docs/workflows/test-a-workflow-with-a-browser-call).
- **Changed** — During a test, a Send SMS node in the workflow under test records the message it
  would have sent instead of sending it. This applies to **Call Workflow** browser test calls as
  soon as it deploys, whether or not **Test** is rolled out to your organization. An AI Voice
  Agent's workflow tools and Send SMS node tools still send real texts during a test call. See
  [Text messages aren't
  sent](/docs/workflows/test-a-workflow-with-a-browser-call#text-messages-arent-sent).
- **Added** — **Import CSV** on the Contacts page creates and updates contacts from a CSV file of
  up to 20 MB and 50,000 rows. Match each column to a contact field, then follow the import while
  it runs. A row that matches an existing contact fills in only what that contact is missing,
  and a row whose phone number and email address belong to two contacts flags them as possible
  duplicates to merge. Enabled per organization with Contacts. See [Importing
  contacts](/docs/agents/contacts#importing-contacts).

## 2026-10-06

- **Added** — On the Coaching page, a recommendation written against a setting that has since
  changed, for example because another recommendation for the same setting was applied, is
  labelled **Outdated** with a **Refresh** button beside it. Refresh rewrites it against the
  current value. **Apply All** leaves outdated recommendations out. See [When a recommendation is
  outdated](/docs/agents/coaching#when-a-recommendation-is-outdated).
- **Changed** — Coaching's agent changes now come only from calls a supervisor coached or took
  over, unless you turn on **Automatic reviews** for the agent on the Coaching page, which also
  reviews all of its calls every 10, 25, or 50 calls. Automatic reviews are off for every agent
  until you turn them on, so an agent that was reviewed every 25 calls no longer is. **Review Now**
  moved from the agent's Safety card to beside that setting. Each card now says who coached the
  calls it's built on, or, from an automatic review, how many of the calls it read it cites. See
  [What triggers a review](/docs/agents/coaching#what-triggers-a-review).
- **Fixed** — Applying a coaching recommendation to an agent on versioning no longer fails with
  "Changed since this was recommended" when nothing had changed. Neither does **Apply All** after
  you have applied another recommendation for the same agent.
- **Added** — Merge two contacts. A contact with a **Possible duplicate** badge lists the records
  it was flagged against in its sidebar, and **Merge into this contact** folds one of them into
  the contact you have open: identifiers move over, notes and tags combine, and its conversations
  and caller memory follow. Merging can't be undone. Enabled per organization with Contacts. See
  [Merging two contacts](/docs/agents/contacts#merging-two-contacts).
- **Added** — **Let the agent look up contacts** on a voice agent's **Contacts** card. It gives
  the agent `lookup_contact`, which finds a contact by phone number or email address, up to three
  lookups per agent session. It needs **Recognize callers** on, and works on voice calls only.
  Off by default; pair it with the `verify-identity` skill. See [Let the agent look up
  contacts](/docs/agents/voice-agents/contacts#let-the-agent-look-up-contacts).
- **Changed** — Deleting a contact now also deletes every contact merged into it, the website chat
  conversations and transcripts for its chat visitor ids, and its history in reporting. Reporting
  still keeps its record of every call, text, and chat, with the number it came in on. See
  [Deleting a contact](/docs/agents/contacts#deleting-a-contact).
- **Changed** — `lookup_contact` is now a reserved tool name. If one of your agents already has a
  custom tool named `lookup_contact`, rename it. Until you do, that agent keeps running its own
  tool in place of the built-in, **Let the agent look up contacts** does nothing on it, and the
  agent can't be saved again. A tool by that name on a connected MCP server is no longer offered
  to the agent.
- **Changed** — Joining a call from the Supervisor board lets the agent finish the sentence it's
  on, for up to 4 seconds, and waits up to 10 seconds for the caller to finish speaking before the
  agent tells them a colleague is joining and hands over. The agent no longer cuts off
  mid-sentence. Being rolled out with the take-over. See [After a supervisor takes a call
  over](/docs/agents/live-conversations#after-a-supervisor-takes-a-call-over).
- **Fixed** — A microphone that stops during a call you've taken over, a headset disconnecting
  say, no longer leaves the caller hearing silence without you knowing: another microphone is
  picked up if there is one, and otherwise a message says the caller can't hear you, with **Try
  Again**. **Join** also says when there's no microphone, or another app is using it, instead of
  asking you to allow access. Being rolled out with the take-over. See [After a supervisor takes
  a call over](/docs/agents/live-conversations#after-a-supervisor-takes-a-call-over).

## 2026-10-02

- **Added** — A contact's sidebar lists every conversation the contact had under
  **Conversations**, newest first, on every channel. That includes calls to an IVR workflow from
  one of the contact's phone numbers. Click a row to open it in Call Logs. Enabled per
  organization with Contacts. See
  [A contact's conversations](/docs/agents/contacts#a-contacts-conversations).
- **Added** — In **Insights → Call Logs**, a call from one of your contacts shows the contact's
  name in the **Source** column. Click it to open the contact on the **Contacts** page. Enabled
  per organization with Contacts. See [From Call Logs](/docs/agents/contacts#from-call-logs).
- **Changed** — A name or tag search on the **Contacts** page covers every contact in your
  organization and pages with **Previous** and **Next**. It used to look through recently active
  contacts only and return one page. Enabled per organization with Contacts. See
  [Finding a contact](/docs/agents/contacts#finding-a-contact).
- **Changed** — The ElevenLabs integration now requires the Text to Speech permission.
  **Test Connection** and saving the key both check it, and a key without it is rejected with
  ElevenLabs' message naming `text_to_speech`. A key that is already saved isn't changed, but it
  can't be saved again until the permission is added. See
  [ElevenLabs](/docs/workflows/integrations/elevenlabs#setup).
- **Fixed** — A voice agent whose ElevenLabs voice failed at the start of a call could skip its
  greeting. When the agent switches to its Amazon Polly standby voice, it now speaks the greeting
  in that voice instead.
- **Fixed** — [Creating a sub-tenant](/docs/overview/sub-tenants) could fail with
  `Request timed out.` even though the sub-tenant was created. It now waits for the result. If no
  answer arrives, it tells you to check the **Sub-Tenants** list before trying again, so you don't
  create a duplicate.

## 2026-10-01

- **Added** — Monitoring on the Supervisor board. One supervisor at a time monitors a
  conversation and can act on it, and everyone else who opens it views it read-only. Being rolled
  out. See [Monitoring and viewing a
  conversation](/docs/agents/live-conversations#monitoring-and-viewing-a-conversation).
- **Added** — A call's transcript carries on after a supervisor takes it over, with the caller and
  the supervisor labelled apart. Caller memory and coaching take that part in, and Call Logs shows
  it. Being rolled out. See [After a supervisor takes a call
  over](/docs/agents/live-conversations#after-a-supervisor-takes-a-call-over).
- **Changed** — A call a supervisor coached the agent on starts a coaching review as soon as it
  ends, rather than waiting for the agent's next 25 calls. See
  [Coaching](/docs/agents/coaching#what-triggers-a-review).
- **Removed** — The **ElevenLabs Agent** workflow node. A workflow that still contains it ends
  the call with an error when it reaches the node, and can't be saved until the node is removed.
  To hand a call to an AI agent, use the **AI Voice Agent** node instead. See
  [Using an Agent in a Workflow](/docs/agents/voice-agents/using-in-workflows). The ElevenLabs
  integration stays: voice agents use it for ElevenLabs voices and pronunciation dictionaries.

## 2026-09-29

- **Added** — ElevenLabs pronunciation dictionaries for voice agents. Pick up to 3 dictionaries
  from your ElevenLabs workspace under the ElevenLabs voice character settings, and the agent
  applies them to every line it speaks. See
  [Voice and speech](/docs/agents/voice-agents/voice-and-speech#pronunciation-dictionaries).
- **Added** — **Gemini 3.8 Flash** and **Gemini 3.5 Flash-Lite** for voice and chat agents,
  for organizations that have connected a Gemini account. The **Thinking budget** picks a
  Gemini 3 thinking level. See [Brain](/docs/agents/voice-agents/brain#gemini-models).
- **Removed** — **Gemini 2.5 Flash** and **Gemini 2.5 Pro**, which Google is limiting to
  existing users. An agent saved on either now runs on Gemini 3.8 Flash, opens in the editor
  with it selected, and keeps its other settings.

## 2026-09-28

- **Added** — `create_workflow_version` and `publish_workflow_version` on the MCP server. An AI
  tool can now change a published workflow end to end: copy it into a new draft, edit the draft,
  and publish it, with no trip to the workflow editor. See
  [Building with AI](/docs/overview/building-with-ai).
- **Added** — `publish_voice_agent_version` on the MCP server, for publishing an agent made with
  `create_voice_agent` or rolling an agent back to an earlier version.
- **Added** — Two ElevenLabs engines for voice agents: **v3 Conversational** (Eleven v3) and
  **v4 Turbo** (Eleven v4, English voices only). Both read only **Stability** from the voice
  character settings, and each call on either holds one ElevenLabs dialogue session. See
  [Voice and speech](/docs/agents/voice-agents/voice-and-speech#voice-engine).
- **Changed** — Tandy can make any change the MCP server offers, not only the ones it has a
  dedicated card for. Each such change waits on an approval card that names the action and every
  value it will send, and nothing runs until you press **Approve**. See
  [Building with AI](/docs/overview/building-with-ai#tandy).
- **Fixed** — The MCP documentation said an agent from `create_voice_agent` is live at once. It
  is saved as an unpublished version `0.1` and answers no calls until a version is published.
- **Removed** — **Turbo v2.5** is no longer offered as a **Voice Engine** for ElevenLabs voices.
  ElevenLabs has deprecated it in favor of **Flash v2.5**, which it describes as equivalent with
  lower latency. An agent already using Turbo v2.5 keeps it and can still be saved and published;
  choosing another engine removes it from that agent's list.
- **Fixed** — A voice agent using a Polly voice now speaks a sentence containing `&` or `<`,
  such as "AT&T". Polly used to reject the sentence, and the caller heard nothing for it.

## 2026-09-25

- **Added** — A voice agent can recognize its caller as a contact. Turn on **Recognize
  callers** on the agent's **Contacts** card and a call is matched to a contact before the
  greeting, on the caller's number, creating one when nothing matches. The agent is told the
  name and what is already on the record, and caller memory is filed under the contact rather
  than the number the caller called from — so once both of a person's numbers are on one contact,
  their calls read as one history. Off on every existing agent until you turn it on. See
  [Contacts on an agent](/docs/agents/voice-agents/contacts).
- **Added** — `update_contact`, a built-in tool the same card switches on. On a call, the agent
  can set the caller's name, append a note, add tags, and fill in the attributes marked **Agent
  can edit**. It cannot add a phone number or an email address, and it cannot reach any contact
  other than the one on the phone. See
  [Built-in Tools](/docs/agents/voice-agents/built-in-tools#update-the-contact).
- **Added** — A returning website chat visitor is matched to a contact, and their conversation
  is attached to it. A visitor arriving for the first time is matched to nothing. The agent is
  not told who a chat visitor is; that part is voice only. Text messages still neither create a
  contact nor attach themselves to one.
- **Added** — A completed call carries `contactId` in the voice-agents API. See
  [Get a call](/docs/api/voice-agents/calls/getCall).
- **Changed** — Deleting a contact now also erases what your agents remember about that person,
  for the contact itself, for every phone number it held, and for every chat visitor id it held,
  along with the dropped-call state, call records, and stored transcripts for those phone numbers.
  It is not a completed right to erasure: website chat conversations stay, and reporting keeps its
  own records for its retention period plus a marker under the deleted contact's id. See
  [Deleting a contact](/docs/agents/contacts#deleting-a-contact).
- **Changed** — The **Invoke Lambda** node takes `fallback` when your function throws or runs
  past its own configured Lambda timeout. It used to take `default`. The message is the
  function's `errorType: errorMessage`, or `errorType` alone, with no stack trace. See
  [AWS](/docs/workflows/integrations/aws#when-the-function-fails).
- **Changed** — The **Integration** node's **Timeout** is capped at 25 seconds. With **Fire &
  Forget** on, the node now waits up to its Timeout for the request to go out before it moves on.
  It used to move on at once, and a request could be lost.
- **Changed** — The **SharpenDB UPDATE** and **DELETE** nodes refuse a query with no condition,
  a condition with a blank value, a LIKE pattern of only `%`, or a NOT IN list holding an empty
  value, and take `invalidInput` with the reason. A blank value used to be dropped, so the query
  ran against more rows than intended, up to the whole table. In any SharpenDB condition, IS NULL,
  IS NOT NULL, IS TRUE, and IS NOT TRUE need no value, and a value typed into one is ignored.
- **Changed** — A SharpenDB query is given 20 seconds, and one that gets no answer takes the
  node's `timeout` exit, or `fallback` when `timeout` is not wired. The node's Timeout field is
  not applied. See
  [Error Handling](/docs/workflows/error-handling#timeouts-on-external-calls).
- **Changed** — Changes on **Email Domains** (domains, **Check Status**, senders, and **Email
  Settings**) are enforced as administrator-only on the server. Every role issued today carries
  the administrator role. A domain claim left unverified for more than 7 days can now be taken
  over by another organization that adds the same domain. See
  [Email Domains](/docs/overview/email-domains#add-a-domain).
- **Changed** — A secret's value echoed back in an integration's response is replaced with
  `[REDACTED]`, and a direct call to the integrations API that references a secret needs the
  administrator role. See [Secrets &
  Variables](/docs/overview/secrets-and-variables#a-secret-echoed-back-by-your-api).
- **Changed** — A SIP trunk refuses a phone number another organization already routes to
  Tandem, with `Already in use by another organization`.
- **Changed** — Loading an MCP server's tools no longer follows a redirect. Save the final URL.
- **Changed** — Tandy's chat history is kept separately for each user and each organization,
  so the next person to sign in on a shared browser, or you in another organization, no longer
  sees it. It is cleared from the browser when you click **Log Out**, or when Tandem finds on its
  next request that your session has expired.
  Existing Tandy history is cleared once when this update reaches your browser, because it was
  stored without an owner.
- **Fixed** — Opening another workflow from inside the workflow editor, for example from a link
  in a Tandy proposal, kept the previous workflow's steps on the canvas when both were at the
  same version, and saving wrote those steps into the workflow you had opened.
- **Fixed** — Saving in the workflow editor while a version was still loading, or after it failed
  to load, could overwrite that version with an empty or stale canvas. A save before the version
  loads is now refused with `This version has not loaded, so it cannot be saved.`, and a failed
  load shows **This version couldn't be loaded** with **Try Again** and **Back to Workflows** in
  place of the canvas.
- **Fixed** — Clicking **Restart** on a [preview call](/docs/agents/voice-agents/preview-calls)
  could leave the new call unable to end: **Hang Up** did nothing and the microphone stayed on.
- **Fixed** — In the chat widget, opening another conversation from history or starting a new one
  while a reply was still arriving wrote that reply into the conversation you switched to.
- **Fixed** — Duplicating a workflow whose steps could not be read or copied created a copy with
  no steps and reported success. It now shows an error instead.
- **Fixed** — The Workflows page could fail with `Request timed out.` for an organization with
  enough workflows to span several pages of the list, even when every page loaded.
- **Changed** — **Disable** on **Admin → Manage Users** now removes the person from your
  organization instead of switching off their Tandem account, so it no longer locks them out
  of other organizations. An Owner's disable also removes them from each sub-tenant the Owner
  owns, and their access tokens are revoked everywhere they were removed. **This can't be
  undone from the page**: there's no **Activate** option any more. To restore access, invite
  them again. An account disabled before this change still shows as **Disabled**; contact
  support to re-enable it. See [Disable a user](/docs/overview/manage-users#disable-a-user).
- **Changed** — Only an Owner can invite someone as an Owner, make someone an Owner, change an
  Owner's role, or disable or remove an Owner. Anyone else gets `Owner access required`, and the
  Users page no longer offers those actions to them. The same rule applies to invitations sent
  through Tandy.
- **Changed** — A person's name can't be edited, and **Last Seen** shows **Never**, for someone
  who also belongs to an organization outside yours and its sub-tenants. Inviting such a person
  doesn't change their name either.
- **Changed** — Creating a personal access token needs current, active membership in the
  organization. A removed, disabled, or still-pending member gets `403`. See
  [Authentication](/docs/api/introduction/authentication#creating-one).
- **Fixed** — Adding a file document to a knowledge base without a completed upload failed with a
  server error and left a document stuck in **Pending**. It now fails with `400` and
  `No uploaded file found for this docId`, and nothing is created.
- **Fixed** — Deleting a knowledge base whose documents couldn't all be deleted answered a generic
  server error. It now keeps the knowledge base and answers `500` with the code `PARTIAL_DELETE`
  and how many documents failed. Delete it again to finish.
- **Fixed** — A Media API request that reached the service with no organization answered `500`.
  It now answers `401` with the code `UNAUTHORIZED`. Replacing a prompt's audio file now deletes
  the previous recording, and a JSON prompt update that sends `name`, `friendlyName`, or
  `language` as anything other than a string is refused with `400` and
  `<field> must be a string`.
- **Fixed** — An agent that ends the call without a closing line now hangs up about 2 seconds
  after its turn, where it could previously leave the caller on the line for up to a minute. A
  farewell that's still playing when the agent ends the call is played to the end. If the idle
  timer runs out while the call is ending, the agent no longer speaks the idle prompt over its
  goodbye, and the disposition the agent chose is kept rather than replaced by the idle
  **Disposition**.
- **Fixed** — When the caller interrupts while a tool is running, the agent no longer treats the
  tool as failed. If the tool's result has come back by the caller's next turn, the agent is given
  it; otherwise it's told the outcome is unknown and not to run the tool again unless the caller
  confirms. A tool that finished alongside the interrupted one keeps its result. A linked agent
  that doesn't answer in time is reported the same way: the agent is told its actions may have
  completed and not to retry without checking with the caller.
- **Changed** — An **Integration** node refuses to send a request when a variable's value holds a
  `{{secrets.name}}` reference, including one assembled from several variables. Before, a caller's
  reply or an API response carrying that text was sent with the secret filled in. The run now ends
  with the error `a variable value may not contain a {{secrets.*}} reference`, and the node does
  not take its `fallback` exit. An escaped `\{{secrets.name}}` typed into the node is refused the
  same way. See [In a workflow: the Integration
  node](/docs/overview/secrets-and-variables#in-a-workflow-the-integration-node).
- **Changed** — A **Logic+ Subroutine** node whose called workflow fails takes its `fallback`
  exit. It used to take `default`, as if the called workflow had succeeded. An unwired `fallback`
  goes to an enclosing Try / Catch or Loop Group. With neither, the calling workflow ends with an
  error, and an AI agent that handed the call to it is told the workflow failed. This is the same
  whether the called workflow failed straight away, after pausing, or inside a subroutine of its
  own. A called workflow that cannot start also ends this way when nothing handles the
  `fallback`: one that is not found, has no published version, has no starting node, calls
  itself or its caller, or cannot be loaded. Before, the calling workflow ended as a success.
- **Changed** — **Regex Replace** and **Regex Replace All** refuse more patterns prone to
  exponential backtracking, such as `(a|aa)+` and `(\d+)+`. The check runs when the node runs:
  a workflow using one still saves and publishes, and the Set Variable node takes its `fallback`
  exit. See [Patterns Regex Replace
  refuses](/docs/workflows/variables-and-data#patterns-regex-replace-refuses).
- **Fixed** — An Integration node sends a top-level `timeout` field in its **Request Body** as you
  wrote it. It was multiplied by 1000, and a non-numeric value became `null`. The node's own
  timeout setting is unchanged.
- **Fixed** — **Slice** with a range ending in `0`, such as `0:0`, returns an empty string. It
  returned the whole value.
- **Fixed** — A caller number listed in `devAnis` on more than one workflow version runs the
  highest of those versions, compared as numbers, so `0.10` wins over `0.9`. Versions were
  compared as text, which picked `0.9`.
- **Fixed** — **Flows → Scheduled** lists a queued run that is waiting to start. It listed only
  delayed runs.
- **Changed** — `POST /v1/workflows/{workflowId}/execute` with `queue` and `sync` both `true`
  answers `202` when the run is still going after the five-minute wait, and the run carries on.
  It used to answer `500` and tear the run down. The `202` body has `workflowId`,
  `conversationId`, `workflowInstanceId`, `workflowType`, and `jobId`, with no `response` and no
  `position`. A run that fails still answers `500`.
- **Changed** — Executing or scheduling a workflow with a `conversationId` that another
  organization is using answers `404` with `Conversation not found.`, from both
  `/v1/workflows/{workflowId}/execute` and `/v1/workflows/{workflowId}/schedule`. Before, the run
  started on that conversation.
- **Changed** — `POST /v1/workflows/{conversationId}/resume` with `sync` set to `true` answers
  `200` only when the paused run resumed. It answers `404` when the run is no longer paused by
  the time it resumes, and `409` when another resume of the same conversation got there first or
  the run is paused on a node that does not take this `type` of resume. Before, all three answered
  `200`, though the request resumed nothing.
- **Changed** — `PUT /v1/organizationLimits` is removed. To change your organization's limits,
  contact support.
- **Changed** — An organization's node-execution limits have a ceiling: 5,000 node runs per
  conversation, 250 runs of the same node per conversation, and 5,000 node runs per workflow run.
  A limit set higher than that runs at the ceiling.
- **Changed** — An agent no longer follows redirects from an MCP server. A server that answers
  with any redirect, including one that only adds a trailing slash, fails to connect and the call
  or chat runs without its tools, so set the integration's **Server URL** to the address the
  server answers on directly. See
  [Add an MCP tool](/docs/agents/voice-agents/tools#add-an-mcp-tool).

## 2026-09-17

- **Changed** — One call now has **one conversation id** from start to finish. An AI agent that
  invokes a workflow, a hand-off from a workflow to an agent and back, and a switch from one agent
  to another all keep the id the call arrived with, instead of minting a new one part-way through.
  A web chat reports under a single id the same way.
- **Changed** — **Everything on a call now shares one set of variables.** What an agent captures is
  readable by the workflow it invokes, and what a workflow sets is readable after a hand-off. The
  consequence to design around: two workflows on one call that write the **same variable name**
  overwrite each other, where previously each had its own set. Different names never collide. See
  [Scope](/docs/workflows/variables-and-data#scope).
- **Changed** — Call Logs is **one row per conversation**, however many workflows it ran. The
  **Workflow** and **Workflow ID** columns are replaced by **Handled by**, which names the agent
  and the workflows in the order they took the call. Expanding a row lists every hop on the call in
  order — agent started, workflow invoked, handed off, transferred, ended — with each workflow's
  step timeline underneath it, and **View in Flow** now sits on the workflow you want to open
  rather than on the row. The log carries no variable values, tool arguments, tool results or
  transcript text. Conversations from before this change keep their existing rows and show no hop
  list. Being rolled out per organization. See [Call
  Logs](/docs/workflows/insights-and-reporting#call-logs).

## 2026-09-15

- **Added** — `update_workflow_nodes` on the MCP server, for changing individual steps of a
  workflow. `update_workflow` replaces every step, so an AI tool had to read a whole workflow and
  send it all back to change one setting. This one takes a list of operations — `setFields`,
  `setExits`, `add`, `remove`, `rename` — applied in order and merged on the server, and checks
  the whole workflow before writing. `rename` repoints every exit aimed at the old name. See
  [Building with AI](/docs/overview/building-with-ai).
- **Added** — `find_nodes` on the MCP server: which step plays a given prompt file, which
  steps transfer to a queue, what leads to a given step. It matches a case-insensitive
  substring over a step's settings, nested ones included, and names the setting that matched
  rather than returning the step whole. See
  [Building with AI](/docs/overview/building-with-ai).
- **Added** — `get_workflow` can return less. `include="outline"` gives each step's name, type
  and exits without its settings, and `names` returns only the steps you ask for. Reading a large
  workflow to find one step no longer costs the whole thing.

## 2026-09-14

- **Changed** — Voice agent call transcripts are stored by default. They used to be kept only
  for an agent with post-call analysis switched on; now every voice agent stores one unless you
  turn off **Store conversation transcripts** on its Safety card, and an agent that also redacts
  caller PII stores none until you turn that switch on yourself. Post-call analysis still stores
  a transcript regardless of the switch. Transcripts are kept for 90 days either way. See
  [Transcript retention](/docs/agents/voice-agents/safety#transcript-retention).
- **Added** — Agent-change recommendations on **Agents → Coaching**: Tandem reads a voice agent's
  recent phone calls and proposes a specific configuration change, backed by the conversations it
  read, for you to apply or dismiss. Applying one on an agent that has been moved to versioning
  publishes a new version, so it can be rolled back; on an agent that hasn't, it edits the live
  configuration directly. Enabled per organization. See
  [Coaching](/docs/agents/coaching#agent-changes).
- **Changed** — A chat widget pointed at a workflow now starts the run when the visitor **opens
  the panel**, rather than waiting for their first message. The workflow runs until it reaches a
  **Send Chat Message** with **Wait for Reply** switched on, or until the conversation ends, so it
  can ask the first question itself. The widget's own **Greeting** still greets, above whatever
  the workflow says. See
  [Answering with a workflow](/docs/agents/chat-widget#answering-with-a-workflow).
- **Fixed** — A field that names a variable to save into — **Store Reply In** on **Send Chat
  Message** and **Send SMS**, **Item Variable** on a loop, the **Variables** rows on Invoke
  Lambda, Integration, the Sharpen DB nodes, PortX and Slack — no longer resolves its own
  contents. Picking a variable from the editor rather than typing its name used to write
  `$(name)` into the field, which resolved to an empty name at run time: the value was saved
  nowhere, every later reference printed nothing, and no exit or error said so. Existing
  workflows are repaired without being re-saved — a `$(name)` or `{{name}}` already stored in
  one of these fields is read as `name`. The field itself is now a plain text box.
- **Changed** — The chat widget editor's preview now runs a workflow's opening move too. A
  workflow target shows a **Start chat** button in place of the message box until it has run, so
  the preview shows what a visitor sees rather than a conversation only an author could have. It
  is a button, not automatic: a workflow preview is a real run, and picking one in the target list
  still costs nothing.
- **Changed** — **Disconnect** now ends a web chat as well as a phone call. In a chat it closes
  the conversation and nothing wired after it runs; on a call it still hangs up and lets
  subsequent nodes finish non-voice work. Reaching it from a chat used to take the node's
  `fallback` exit.
- **Added** — `get_workflow` and `update_workflow` on the MCP server. `get_workflow` returns a
  workflow's settings and the steps of one version, reporting `published` as its own field.
  `update_workflow` changes the settings, the steps, or both; settings merge, a published
  version cannot be updated, and passing `observed_updated_at` refuses a write composed against
  a stale read instead of overwriting someone's editor save. See
  [Building with AI](/docs/overview/building-with-ai).
- **Fixed** — `build_workflow_draft` could not return a node graph for a workflow of more than
  one step, and rejected the exits a Time Control event or a Switch evaluation creates. Both
  now work, so an AI client can draft a real flow rather than a single step.
- **Added** — `build_workflow_draft` now warns when a step names a prompt file, queue, or
  integration your organization does not have. A workflow copied from another organization
  keeps the original's IDs, which used to validate cleanly and then fail on a live call.

## 2026-09-09

- **Added** — Channels on an agent. An agent now declares whether it answers phone calls, website
  chat, or both, in the create dialog and on its **Persona** card. Both are on by default, so
  nothing changes for an agent that already exists. Switching one off hides that channel's settings
  in the editor rather than marking them **Voice only**, and a chat-only agent needs no voice: the
  voice fields aren't shown for one, and no save asks for them. See
  [Channels](/docs/agents/voice-agents/persona#channels).
- **Changed** — A chat widget can only be pointed at an agent whose published configuration
  includes the `chat` channel. Saving one against a voice-only agent is refused with
  `agent_not_chat` and a message naming the agent as the thing to change. An agent with nothing
  published yet is still accepted. See
  [Create a chat widget](/docs/api/voice-agents/chat-widgets/createChatWidget).
- **Added** — `channels` on the agent configuration API: an array of `voice` and `chat`, defaulting
  to both, which must not be empty. `slots.tts` is required only while `voice` is present, so a
  chat-only draft publishes with no voice; a voice that is set is still validated on either channel.

## 2026-09-08

- **Added** — Tool calls in agent transcripts. What the agent did — looking something up,
  capturing keypad digits, transferring — now appears as a collapsed row in the transcript, in
  the place it happened, carrying how it turned out (**Succeeded**, **Failed**, **Running**, or
  **No result**) and, where the platform timed it, how long it took. Expand a row for the
  arguments the agent sent and, on a failure, the reason the tool gave. What a tool returned is
  never shown. Rows appear on the live **Supervisor** board for both calls and chats, on a
  finished call under **Recent Calls**, and on a preview call; a finished chat's transcript stays
  text-only. The board and **Recent Calls** are enabled per organization; a preview call always
  shows them. See
  [What the agent did](/docs/agents/live-conversations#what-the-agent-did).

## 2026-09-03

- **Added** — **Agents → Coaching**, one page for the changes Tandem recommends to your agents'
  resources, each accepted or rejected in place. Suggested FAQs are its first source and have
  moved there from the knowledge-base page, so one list now covers every knowledge base rather
  than one panel per knowledge base. See [Coaching](/docs/agents/coaching).

## 2026-09-02

- **Added** — **Contacts**: one record per person your organization talks to, holding the
  phone numbers, email addresses, and ids they reach you on, a name, tags, and notes. You
  create every record yourself in this release — no call, text, or chat produces one or
  attaches itself to one. Enabled per organization. See [Contacts](/docs/agents/contacts).
- **Added** — **Admin → Contact Attributes**: define the fields every contact can hold beyond
  a name, each with a kind that decides what the service accepts. Enabled per organization
  with Contacts. See [Attributes](/docs/agents/contacts#attributes).

## 2026-09-01

- **Added** — Versioning for voice agents, over the API. An agent's configuration can live on
  numbered versions under `/v1/agent-media/agents/{agentId}/versions`: save up to 20 drafts,
  then publish the one you want live. The published version is the configuration every call
  runs, and it stays immutable until you publish a different one. A 21st version is rejected
  with `version_limit_reached`; delete one you no longer need. Saving an agent's first version
  also retires that agent's configuration `PUT` (see the next entry). See
  [List an agent's versions](/docs/api/voice-agents/agent-versions/listAgentVersions) for the
  endpoints.
- **Changed** — `PUT /v1/agent-media/agents/{agentId}` stops accepting a configuration once the
  agent holds any version, published or draft. From that point the only keys it takes are `name`
  and `sourceTemplateId`; a body carrying anything else is rejected with
  `409 config_put_retired` and nothing is saved. Save the configuration to a draft with
  `PUT /v1/agent-media/agents/{agentId}/versions/{version}` and publish it instead.

    Every agent created from this release is in that state from the moment it exists, because a
    create writes its configuration to a `0.1` draft. Saving or publishing a version of an older
    agent puts that agent there too, as does Tandem's migration of the agents an organization
    already had, which runs one organization at a time. An integration that writes configurations
    should use the version endpoints unconditionally: `publishedVersion` is absent on an agent
    that holds drafts only, so branching on it does not tell you whether the agent `PUT` still
    takes a configuration.

- **Added** — Versioning in the agent editor. A version number sits at the top of the
  configuration, **Manage Versions** lists an agent's versions and deletes the ones you no longer
  need, **Publish** moves the pointer, and **Save as New Draft** branches the version you're
  looking at. A published version opens read-only and readable — its Advanced groups are expanded
  and the list editors still open — so the live configuration can be inspected without being
  editable. See [Versioning](/docs/agents/voice-agents/versioning).
- **Changed** — Every picker that attaches an agent to a caller — phone numbers, both chat-widget
  surfaces, `transfer_to_voice_agent`, and the agent-kind tool target — marks an agent with no
  published version as `not published — can't answer calls` and won't let you choose it. That
  label reads the agent's published version and nothing else, so until your organization is
  migrated it also appears on agents that predate versioning, which keep answering calls
  regardless. The **AI Voice Agent** workflow node's picker says nothing about publish state and
  still allows any selection.
- **Changed** — Creating a voice agent now saves its configuration as version `0.1`, a draft, and
  publishes nothing: the editor opens a new agent editable, **Save Configuration** keeps revising
  that draft, and you publish when the agent should start answering. Until then it answers no
  calls. This applies to `POST /v1/agent-media/agents` and to instantiating an agent template.

- **Changed** — `POST /v1/agent-media/agents` no longer overwrites an existing agent. Supplying
  an `agentId` that already exists is rejected with `409 create_upsert_retired`, whatever
  versions that agent has. A create writes identity to the agent record and the configuration to
  a `0.1` draft, so repeating one over a live agent would take that agent's configuration off its
  record and publish nothing in its place, giving no sign it had gone. A create with no
  `agentId`, or with one that is genuinely new, is unaffected. To change an existing agent, write
  a draft with `PUT /v1/agent-media/agents/{agentId}/versions/{version}` and publish it.
- **Added** — **Pricing** on **Admin › Billing**. The page now shows what you are charged
  for — platform, AI usage, telephony and messaging, fair use, compliance pass-throughs, and
  what is included at no charge. Metered rates are read live, so they always match what your
  charges are priced against. See [Billing](/docs/overview/billing).
- **Changed** — Local call minutes, inbound and outbound, are now **$0.015 per minute**.
  Charges already recorded keep the amount they were charged — a rate change is never applied
  retroactively.
- **Changed** — AI pricing is now **published** per voice minute and per digital conversation,
  with tokens charged only as an overage past a per-conversation ceiling. While that model is
  being rolled out, **no per-token AI charge is applied**. See
  [Billing](/docs/overview/billing).

## 2026-08-28

- **Added** — **Channels in Insights.** Every conversation now records the medium it happened
  over — voice, web chat, SMS, MMS, or email — and each Insights page has a Channel filter.
  Conversations that ran no workflow, such as a web chat handled entirely by an agent, are
  counted and listed rather than omitted. Some SMS conversations previously counted as calls
  have been re-labeled. See [Insights & Reporting](/docs/workflows/insights-and-reporting).
- **Changed** — Suggested FAQs are collected from web chat as well as from calls. See
  [Coaching](/docs/agents/coaching#suggested-faqs).

## 2026-08-27

- **Added** — **Goal**, a single objective a voice agent works toward across a call,
  re-surfaced on a cadence you set in caller turns. Voice only. See
  [Persona](/docs/agents/voice-agents/persona#goal).
- **Added** — Chat widget: a visitor can reach their earlier conversations from a back arrow,
  expand the panel to full height, and the launcher stays on the page while the chat is open.
  See [Chat Widget](/docs/agents/chat-widget).
- **Added** — Chat widget branding: brand color, launcher position and icon, avatar, and a
  live preview that updates as you type.
- **Added** — Personal access tokens are accepted on the API. See
  [Authentication](/docs/api/introduction/authentication).
- **Changed** — The Stripe billing email is editable and follows the organization email. See
  [Billing](/docs/overview/billing).

## 2026-08-25

- **Added** — **Turn detection** on a voice agent: a smart turn model that predicts
  end-of-turn from how the caller sounded, as an alternative to silence timers. Also **Words
  before interrupting**, so a cough or an "mhm" no longer stops the agent. See [Voice &
  Speech](/docs/agents/voice-agents/voice-and-speech#turn-detection).
- **Added** — The Supervisor transcript reports the post-call caller-memory write, so you can
  see whether it saved. See [Live
  Conversations](/docs/agents/live-conversations#after-the-call-caller-memory).

## 2026-08-24

- **Added** — **Live Conversations** under Supervisor: every agent conversation in progress
  right now, across calls and website chats, with a live transcript you can read as it
  happens. See [Live Conversations](/docs/agents/live-conversations).
- **Added** — The **chat widget**: an embeddable script that puts one of your existing agents
  on your website. See [Chat Widget](/docs/agents/chat-widget).
- **Added** — **Admin → Email Domains**: verify a domain you own, configure sender addresses,
  and send email from a workflow or an agent with the **Send Email** node. See [Email
  Domains](/docs/overview/email-domains).
- **Added** — **Suggested FAQs**: questions callers and visitors asked that the knowledge base
  couldn't answer, clustered and offered for you to answer. See
  [Coaching](/docs/agents/coaching#suggested-faqs).
- **Added** — **Conversation history** and model-retry controls on a voice agent's Brain card.
  See [Brain](/docs/agents/voice-agents/brain#conversation-history).
- **Added** — A **caller language recognition** override, and per-provider voice character
  controls for Polly and ElevenLabs. See [Voice &
  Speech](/docs/agents/voice-agents/voice-and-speech#voice-character).
- **Added** — Agent settings that do nothing in a chat are marked **Voice only** in the editor.

## 2026-08-20

- **Added** — **`/security-review`**: ask Tandy to review a voice agent's configuration for
  risks a caller could exploit, and apply the recommended settings from one confirmation card.
  See [Security Review](/docs/agents/voice-agents/security-review).
- **Added** — **Admin → Billing**: a prepaid balance, a transaction history, and card top-ups
  through Stripe. See [Billing](/docs/overview/billing).
- **Added** — **Agent tools**: a voice agent can consult another of your agents as a tool. See
  [Tools](/docs/agents/voice-agents/tools#add-an-agent-tool).

## 2026-08-19

- **Added** — Insights reads live reporting data: Usage Reports, Call Logs with an execution
  replay, and Voice Trends. See [Insights & Reporting](/docs/workflows/insights-and-reporting).
- **Added** — **Access Tokens**, in the user menu: create a personal access token for the API.
  See [Authentication](/docs/api/introduction/authentication).

## 2026-08-17

- **Added** — The **Conversation** card on a voice agent: idle behavior, call-duration limits
  with a spoken warning, and failure-handling tuning. See
  [Conversation](/docs/agents/voice-agents/conversation).
- **Added** — Nested **object** parameters on an integration tool, so a tool can build a
  structured request body. See [Tools](/docs/agents/voice-agents/tools#nested-request-bodies).

## 2026-08-14

- **Added** — The **read-back-values** platform skill, which has the agent speak codes,
  numbers, and dates digit by digit. See [Skills](/docs/agents/voice-agents/skills).
- **Added** — A **Timezone** picker on the current-time built-in tool. See [Built-in
  Tools](/docs/agents/voice-agents/built-in-tools#tell-the-caller-the-current-time).

## 2026-08-13

- **Added** — **Post-call analysis**: a second pass over a finished call's transcript that
  extracts sentiment, an outcome, a summary, and any fields you define, with a **Recent Calls**
  panel to read the results. See [Post-Call
  Analysis](/docs/agents/voice-agents/post-call-analysis).
- **Added** — **Transfer to another voice agent** as a built-in tool, with a carry-over choice
  and a hop budget. See [Built-in Tools](/docs/agents/voice-agents/built-in-tools#the-transfers).
- **Added** — **Secret references** in an integration tool's headers, body, and request path,
  resolved as the request leaves and restricted to organization administrators. See [Secrets &
  Variables](/docs/overview/secrets-and-variables).

## 2026-08-12

- **Added** — **Agent templates**: start an agent from a curated or organization template, or
  save one of your own agents as one. See
  [Templates](/docs/agents/voice-agents/templates).
- **Added** — **Transfer to an outside number** as a built-in tool, restricted to destinations
  you name. See [Built-in Tools](/docs/agents/voice-agents/built-in-tools).

## 2026-08-11

- **Added** — **Skills**: named procedures you switch on per agent, with three that ship with
  Tandem. See [Skills](/docs/agents/voice-agents/skills).

## 2026-08-07

- **Added** — **Admin → Manage Users**: invite people, change roles, disable an account, and
  remove someone who has left. Tandy can draft an invitation or a removal for you to confirm.
  See [Manage Users](/docs/overview/manage-users).
- **Added** — The **Slack integration**: post messages into your workspace from a workflow,
  using your own Slack app. See [Slack](/docs/workflows/integrations/slack).

## 2026-08-05

- **Added** — Self-service sign-up. You can create an account and your own organization
  from the sign-in page without an invitation. See
  [Creating an Account](/docs/overview/creating-an-account).
- **Added** — **Admin → Organization**, where an admin can rename the organization, change
  the address we send account notices to, and find the organization ID to quote to support.
  See [Organization](/docs/overview/account-admin).
