Files
twenty/packages/twenty-apps/public/call-recorder
nitin f893b214e2 Make the call recorder transcript provider an application variable (#23789)
## What

Post-call transcription was locked to Gladia by a frozen constant
(#23532). It is now a `CALL_RECORDER_TRANSCRIPT_PROVIDER` application
variable that a workspace admin picks in app settings.

## Changes

- **Recall.ai transcription (`recallai_async`) is the default.** It is
the only provider that needs no third-party key in the Recall dashboard,
so a fresh install transcribes without extra setup. Gladia
(`gladia_v2_async`) stays available with code switching for
mixed-language calls, and still requires a Gladia API key in the Recall
dashboard per region.
- Providers name their language options differently (`recallai_async`
takes `language_code`, `gladia_v2_async` takes
`language_config.code_switching`), so the variable holds a Recall
provider id and the app owns the per-provider payload in
`RECALL_ASYNC_TRANSCRIPT_PROVIDERS`. Unset or unrecognized values fall
back to the default, matching how `getBotImageBackground` and
`isCallRecordingSummaryEnabled` read their variables.
- `SETUP.md` now frames the Gladia key as conditional on that selection
rather than a hard requirement, and lists the new variable alongside the
other application variables.
- App bumped to 1.7.0. No new server capability is needed, so
`engines.twenty` stays at `>=2.26.0`.

## Upgrade note

Existing installs run on Gladia today through the old constant, and move
to Recall.ai transcription on upgrade unless the variable is set.
Workspaces that rely on code switching for mixed-language calls should
select Gladia after deploying.

## Tests

533 unit tests pass, typecheck and lint clean.

- `recall-bot-api.test.ts` asserts the `create_transcript` request body
for both the default and a Gladia selection.
- `get-recall-async-transcript-provider.test.ts` covers the default, the
fallback for an unsupported provider, and a drift guard asserting the
manifest's SELECT options match the keys of the provider map, so adding
a provider to one without the other fails.



<!-- This is an auto-generated description by cubic. -->
<a
href="https://cubic.dev/pr/twentyhq/twenty/pull/23789?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
2026-08-05 11:51:44 +00:00
..
2026-06-26 17:51:01 +02:00

Call Recorder

Record, transcribe, and save every meeting — right inside your CRM.

What you get

  • Recordings on every meeting
  • A Call Recording tab
  • A per-meeting on/off switch
  • AI meeting summaries
  • Built for AI & automation

💳 Billing

Metered in Twenty credits based on the bot's actual recording time, prorated by duration — $1.00 per recording-hour (1 credit). No recording — opted out, canceled, or no-show — means no charge.

AI summaries use workspace AI credits, billed on the model's token usage — the cost scales with how much was said in the meeting, typically $0.02$0.06 per meeting on default models. Set the CALL_RECORDER_SUMMARY_ENABLED app variable to false to turn summaries off.

🎥 Supported meeting platforms

The recording bot can only join meetings on these platforms:

  • Google Meet
  • Zoom
  • Microsoft Teams
  • Webex
  • GoTo Meeting

Events whose conference link points to any other platform (e.g. ro.am, Daily, Whereby) or that only have a dial-in number are ignored — no bot is scheduled, since it can't join the call.

📌 Heads up

  • Needs a synced calendar + video link — ad-hoc calls that were never on your Google, Outlook, or CalDAV calendar aren't recorded.
  • Your copy is yours — Twenty stores its own video, audio, and transcript, so they stay available after the source media expires.