Overview
Apps let you connect external platforms — such as telephony providers and communication tools — to Ender Turing. Once connected, Ender Turing can access call recordings, agent information, and other data from those platforms to power speech analytics and agent coaching.
The Apps section has two main areas:
Connected Apps — shows the integrations you have already installed, with their sync and connection status. This is the default landing view.
App Marketplace — lists all available integrations you can browse and install.
Who Can Access Apps
Only users with the Marketplace Configuration permission can access the Apps section. This permission controls the ability to browse, install, configure, and uninstall apps, as well as view monitoring details such as WebRTC observability.
How It Works
Browsing Available Apps
Open Apps from the main navigation. The default view is your connected apps.
Click the Visit App Marketplace button to see all available integrations.
Each app card shows the app name, a short description, and its current status:
If already installed, you see the installation date, a status indicator, and a Settings button that takes you to the app details page.
If not installed, an Install button is available.
Some apps also provide a Support button (to contact the app provider) and a Details button (linking to external documentation).
Installing an App
In the App Marketplace, click Install on the app you want to connect.
A setup dialog appears. The authentication method depends on the app:
OAuth apps — you sign in to the external service through a popup window.
Token-based apps — you enter API credentials (such as an API key, login, or domain) in a form.
Genesys apps — a specialized Genesys authentication flow is used. See Genesys app for the install form, the optional data-scoping panel, and optional outbound contact-list field enrichment.
Internal apps — no external authentication is required; you simply confirm.
After successful authentication, the app begins syncing data.
Viewing Connected Apps
Open Apps from the main navigation. The default view is Connected Apps.
Each connected app shows:
App name and icon
Status indicator — green for healthy, red for a connection issue
Last sync time — when data was last synchronized (or "not yet" if no sync has occurred)
Click on a connected app to open its details page.
Managing a Connected App
On the app details page you can see:
Installation date — when the app was first connected
Last synchronization and number of synchronized conversations (for apps that sync conversation data)
Connection status — a green or red indicator showing whether the connection is healthy
Last check — when the connection was last verified
If the connection has failed, click the help icon on the status chip to see the error message, a list of any failed accounts, and a Change app credentials shortcut.
Available actions (accessed through the actions menu):
Action | Description |
Change app credentials | Replace the API key or token the app signs in with. See Updating app credentials |
Update settings | Change configurable parameters for the app (only shown if the app has settings) |
Manage accounts | Add or remove accounts for multi-account apps |
Manage Genesys data fetching | Edit which conversations the app ingests and configure optional outbound contact-list field enrichment (shown when the app supports data scoping, e.g. Genesys) |
Sync more historical conversations | Pull in additional past conversations by specifying a number of days |
Uninstall | Remove the app from your system (requires confirmation) |
Updating app credentials
Apps that sign in with an API key or token — such as Fireflies.ai — let you replace those credentials at any time, whether or not the connection is currently healthy. This is what you use for a planned key rotation, after regenerating a key in the external service, or when a key has expired.
Open Apps from the main navigation and select the app under Connected Apps.
Open the Actions menu and choose Change app credentials.
The credentials dialog opens with the values already stored for this installation. Secret fields such as the API key or access token are never shown back to you — they appear masked as
******and are optional, so leaving one untouched keeps the key currently in use. Fill in a secret field only when you want to replace it.(Optional) Click Check to verify the credentials before saving. The check uses what is in the form, falling back to the stored secret for any masked field you left blank — so you can also use it to confirm that the existing key still works.
Click Save credentials. The button stays disabled until you actually change something, so re-opening the dialog and closing it cannot overwrite a working connection.
Change app credentials appears for apps that authenticate with a key or token and hold a single set of credentials. Apps that hold several accounts use Manage accounts instead, and apps that sign in through OAuth are re-authenticated by repeating their sign-in flow rather than by editing a form.
Uninstalling an App
Open the app's details page from Connected Apps.
Click Uninstall from the actions menu.
Confirm the removal in the dialog that appears.
Very Short or Empty Calls
For apps whose pre-recognition call duration is a reliable talk-duration, Ender Turing can skip speech recognition for calls shorter than 5 seconds. The call still appears on the All Conversations page as a processed record with the duration, the agent attribution, and any provider-supplied metadata. Because no transcript is produced, the record has no transcript-driven content such as speaker turns, words count, or AI summaries.
The skip applies only when all of these are true:
The conversation is a voice call. Chats and emails are not affected and continue to be ingested with their transcripts.
The app is on Ender Turing's allowlist of providers whose duration is verified before recognition. By default this list contains only Genesys.
The provider reported an explicit duration that is below 5 seconds. A call with no reported duration is treated as "unknown" and always goes through normal download and recognition.
For other conversation apps (such as Aircall, GoHighLevel, Zendesk Voice, or Zendesk Chat), short calls are not skipped — they go through normal download and recognition even if they turn out to be very brief.
For WebRTC, the browser extension reports the duration with each recording and applies the same idea independently: recordings shorter than 5 seconds, and unusually small recordings (for example, an empty audio file uploaded by the extension), are kept as records with recognition skipped.
Genesys app
The Genesys app uses a dedicated install dialog and supports scoping which conversations Ender Turing ingests by division and queue. You can pick this scope at install time and change it later.
Installing Genesys
In the App Marketplace, click Install on the Genesys card.
The credentials dialog opens. Fill in:
Client ID and Client Secret — issued by your Genesys OAuth client.
Region — pick your Genesys region from the dropdown.
Timezone — used when reading conversation times.
(Optional) Turn on Fetch selected outbound contact-list fields to enrich outbound conversations with custom fields from your Genesys contact lists. See Fetching outbound contact-list fields. If you enable it, you must select at least one field before you can save.
(Optional) Expand Filter by divisions & queues (optional) to choose which conversations to ingest. See Choosing which conversations to ingest. If you skip this panel, an inline warning reminds you that the integration will fetch conversations from every division in your Genesys organization.
Click Check at any time to verify the credentials and any selected scope.
Click Save credentials to install. The credentials and scope are stored together — there is no window in which an unscoped install runs.
Choosing which conversations to ingest
The data-scoping editor appears both in the Genesys install dialog and in the post-install Manage Genesys data fetching action. The behavior is the same in both places.
Each row is one filter. A filter selects:
a Division — either a specific division or Any division, and
a list of Queues — leave it set to All queues to keep the whole division, or pick specific queues to narrow it.
How filters combine:
All rows are combined (OR-ed): a conversation is ingested if it matches any row.
Each row is one division and its selected queues.
Leaving the editor empty (no rows with selections) means Ender Turing ingests every conversation in your Genesys organization. An inline warning makes this explicit.
Working with the editor:
Click Fetch divisions & queues to load the lists from Genesys. After a successful fetch, the row pickers show real division and queue names. The Division cell is a free-text combobox, so if you prefer not to fetch you can still type a division name or ID directly; the Queues cell only picks from the fetched list, so to scope by queue you must fetch first.
In each row, pick a Division (or leave Any division), then click the Queues cell to open the multi-select picker. The picker supports search, selecting all filtered results, and keeps your current selections pinned to the top.
Click Add division/queue to add another row. You cannot add a new empty row while an existing row is empty.
Click the × icon at the end of a row to remove it.
Validation that blocks Save:
A row that selects neither a division nor any queues (unless it is the only row, which means "ingest everything").
Two rows that target the same division — rows are combined, so a duplicate is always a mistake. After a successful fetch, a division ID and its name are recognized as the same target; rows entered before fetching are only deduplicated by their literal value, so fetch first if you want this check to cover name/ID pairs.
A typed division that does not match anything in the fetched lists is flagged with a warning icon on the row. (Queue values have no equivalent warning marker; stale saved queue selections — for example, a queue deleted after install — are shown without adornment, so verify them against the fetched list.) Save re-checks each value against Genesys: if a division or queue still does not resolve, the save is rejected with an "Unknown Genesys division/queue" error. (If Genesys is unreachable at save time the save goes through. The connection-status chip at the top of the app details page will then show the reachability or permissions error from the automatic post-save check; once Genesys is reachable again, re-open Manage Genesys data fetching and click Save to re-run the lookup, or use Update credentials → Check to validate the same scope without re-saving.)
What "ingest by division" and "ingest by queue" actually mean:
Both filters apply at the conversation level. A conversation matches if any of its segments touched a selected division or queue (for example, after a transfer or consult between divisions), and the whole conversation is then ingested — including legs that lived in other divisions or queues.
Filtering is not pruned per-recording: you receive every leg of the conversation, not only the legs that match.
As a result, a single conversation can belong to several divisions at once. Selecting one of them is enough to bring the whole conversation in.
If you see a conversation that looks unexpected for the division you configured, open the Session details dialog from the conversation page and check the Info section. For Genesys-ingested conversations you will find:
division_ids — every division the conversation as a whole was associated with. If the division you configured is in this list alongside others, the conversation was ingested by design (the call touched several divisions, your filter matched one of them). If the list contains only foreign divisions, the data filter is either misconfigured or empty — in which case Ender Turing ingests everything by design.
queue_division_id — the division of the queue that routed this specific recording leg, when the leg went through a queue. Useful for telling which division the leg itself belongs to, separate from the conversation-level list above.
These fields are populated as conversations are newly ingested; existing conversations from before this change do not carry them.
Managing data fetching after install
Open Apps from the main navigation and select your Genesys installation under Connected apps.
Open the Actions menu and choose Manage Genesys data fetching.
Edit the rows as described in Choosing which conversations to ingest. The same dialog also holds the outbound contact-list field enrichment controls.
Click Save. The new scope takes effect on the next sync.
Clearing every row and saving (no filters) returns the integration to ingesting every conversation in your Genesys organization.
Fetching outbound contact-list fields
Genesys outbound (dialer) conversations carry a link to a contact-list record that can hold custom columns your organization defined — for example a case type, a sub-type, or an internal identifier. When enabled, Ender Turing fetches an explicit, approved set of these columns for outbound conversations, stores them alongside each conversation, and publishes their values as CRM Status entries so you can see and filter by them.
This is an opt-in, best-effort feature. It is off by default, it never runs while disabled, and it only affects outbound campaign conversations — inbound and non-campaign conversations are untouched.
Who can configure it: the same users who can reach the Genesys app — those with the Marketplace Configuration permission. There is no separate per-user setting; the configuration applies to the whole Genesys installation.
Enabling and choosing fields
You configure enrichment in two places, with identical behavior: the Genesys install dialog, and the post-install Manage Genesys data fetching action.
Turn on Fetch selected outbound contact-list fields. A field editor appears.
Add the exact contact-list column names Ender Turing may store. You have two ways to fill the list:
Click Fetch fields to load the available column names from your accessible Genesys contact lists, then pick from the combobox. After a successful load, a {count} fields available note shows how many were found.
Type each column name manually into the combobox and press Enter. This is useful when field discovery is unavailable, or when you want to add a column that will exist later.
Names are matched exactly and case-sensitively. Surrounding spaces are trimmed and duplicates are removed automatically.
(Optional) Give each selected field a label in its CRM status prefix for {field} box. See Labeling the published values.
Save. If enrichment is on, you must have at least one field selected — otherwise the Save button stays disabled and an inline Select or enter at least one field message appears.
Only the fields you list are ever stored. To read them, Ender Turing retrieves the contact record from Genesys, which contains far more customer data (names, phone numbers, policy details, and so on); it immediately keeps only your approved columns and discards the rest, which is never stored or logged. Select only fields you are approved to store in Ender Turing.
A warning next to the field list reminds you that published values become visible as CRM statuses and filter choices across Ender Turing, and that you should avoid high-cardinality fields such as unique customer or policy identifiers. The CRM status choice list is organization-wide and unbounded, so selecting a column with one distinct value per customer would add one entry per value and make the filter hard to use.
Labeling the published values
Every selected contact field gets its own CRM status prefix for {field} text box, listed under the field selector. The prefix is the readable label that appears in front of the raw value wherever the CRM status is shown.
The prefix starts empty. An empty prefix publishes only the raw field value — the hint under each box states this.
Type any text you want, for example
Case Type:orGrupa TIA:. The prefix and the value are joined with one space, soCase Type:plusRENbecomesCase Type: REN.Surrounding spaces in both the prefix and the value are trimmed, and a prefix that contains only spaces behaves like an empty one.
Values are published exactly as Genesys returns them — no upper/lower-casing and no code translation.
Removing a field from the list discards its prefix. Adding the field again starts from an empty prefix.
Prefix boxes appear in both places you configure the fields: the Genesys install dialog and Manage Genesys data fetching.
Installations configured before prefixes existed keep working. Their fields start with empty prefixes, so they publish raw values until you set labels.
Where the published values appear
Published values behave exactly like any other CRM status in Ender Turing. Once conversations carrying them are ingested, you can:
see them as chips on the conversation card and in the conversation info panel
pick them in the CRM Status filter, including exclusion, on the Conversations page and in analytics; typing a prefix in the filter's search box narrows the choice list to that group
use them in saved filters, favourites, Enders, and exports
The raw values also stay available on each conversation: open the Session details dialog from the conversation page and check the Info section for genesys_outbound_contact_data. Nothing is lost if you change a label later.
Genesys permissions
Field enrichment uses two Genesys permissions, and they are needed at different moments:
Action | Required Genesys permission |
Fetch fields (loading selectable column names) | Outbound > Contact List > View |
Retrieving the selected values during ingestion | Outbound > Contact > View |
Loading field names is an explicit action you take while configuring the form, so a customer that does not use this feature never needs either permission. If Fetch fields fails, a warning appears reminding you to check Outbound > Contact List > View or to enter names manually — you can still type field names by hand and save.
What to expect
Enable / disable is independent of the field list. Turning the feature off keeps your selected fields, so you can re-enable enrichment later without re-selecting them. Enabling with an empty list is rejected when you try to save.
Missing values never block a conversation. If a selected column is absent from a particular contact, that column is simply skipped. If the contact record cannot be retrieved at all (for example, it was deleted, or the retrieval permission is missing), the conversation is still ingested normally without the extra fields.
Stale selections stay visible. If a later Fetch fields no longer returns a column you selected earlier, your manual selection remains in the list so you can decide whether to keep it.
Enrichment applies going forward. Conversations are enriched as they are ingested after the feature is enabled, including subsequently run historical imports. Conversations already in Ender Turing are not retroactively updated.
Changing a prefix does not relabel history. Conversations keep the statuses they were stored with, and the old labels stay in the CRM status choice list. Agree on your prefixes before enabling the feature on production data.
Empty and missing values produce no status. A column that is absent from a contact, or that holds an empty value, is simply skipped for that conversation.
Wrap-up codes are not affected. The wrap-up-code statuses Genesys already writes keep their place; the contact-field statuses are added after them. A value that would repeat a status already on the conversation is not added twice.
All sessions from one conversation match. Every Ender Turing conversation produced from the same Genesys conversation receives the same generated statuses.
A saved selection does not follow future values. The CRM Status filter stores the specific values you ticked, so a saved filter, favourite, or Ender built today will not pick up a new value that appears later — reopen it and tick the new value.
Genesys settings
Use Update settings from the actions menu to change the following:
Setting | Description |
Do not process conversations without an agent involved | Drops individual recordings that Genesys marks as having no human participant (for example, an IVR-only leg of a multi-segment conversation). Conversations whose segments contain no |
Timezone | The timezone used when reading conversation times. |
Trunk-side vs station-side recordings
Genesys can record the same call from two perspectives:
Trunk-side — the external/customer perspective from the SIP trunk. The customer is on channel 0, the agent on channel 1. Trunk-side is Genesys's recommended primary recording method and includes IVR, queue-abandoned, and on-hold audio that station-side recordings omit.
Station-side — the agent's-phone perspective. The agent is on channel 0, the customer on channel 1. A transferred call produces one station-side recording per agent leg, each tied to the agent who actually served that leg.
Ender Turing ingests recordings from either perspective and assigns the agent to the correct channel automatically, so transcripts and analytics attribute speech to the right speaker regardless of which side Genesys recorded.
How Ender Turing picks which recordings to ingest depends on whether the call was transferred between agents:
Single-agent calls
When one agent handles the whole call — and that call has been recorded both trunk-side and station-side — Ender Turing keeps the trunk-side copy and skips the station-side duplicate. Trunk-side captures the same conversation plus IVR, queue, and hold audio that station-side omits. If the trunk-side recording is not playable (for example, archived, restoring, or in an error state), the station-side copy is kept instead so the call is not lost.
Calls that have only a station-side recording — such as internal or agent-to-agent transfers that never go through an external trunk — are still ingested. The single agent is attributed as expected.
Multi-agent transfer calls
When a call passes through more than one agent (a transfer chain) and every serving agent leg has its own station-side recording, Ender Turing keeps one station-side recording per leg — each attributed to the agent who actually served that leg — and drops the whole-call trunk copy. Each agent leg becomes its own conversation in Ender Turing, so a three-agent transfer shows up as three conversations, one per agent, with the correct name on each.
Dropping the whole-call trunk in this shape avoids a duplicate record of the same conversation and prevents the whole call from being attributed to only the last agent. The trade-off is that the pre-agent IVR / queue wait and customer-side on-hold audio the trunk alone carries are not part of the audio for these conversations; the routing context still survives on each conversation as metadata (queue, hold segments, flow).
The trunk is kept as a backstop when at least one serving leg is missing its station-side recording — that leg's audio only exists in the trunk, so dropping it would lose an agent's call. In that case, the whole call is ingested as a single conversation from the trunk, attributed to the last agent in the chain, matching the single-agent behavior above.
Legs where the agent only rang (and was never connected) and consult / internal handoff legs that never served the customer do not get their own conversation, even if a station-side recording exists for them. Only agents who actually served the customer are counted as separate legs.
Checking the recording perspective and agent source
To verify which perspective recorded a conversation, open the Session details dialog from the conversation page and check the Info section:
media_subtype — shows
TrunkorStation(omitted when Genesys does not report it).agent_source — shows how the agent on this conversation was chosen:
recordingmeans the agent was taken from the station-side recording's own leg (per-agent attribution);conversationmeans the agent was taken from the conversation as a whole (the last serving agent). This lets you see, at a glance, whether a transferred call was correctly split per agent or fell back to the whole-conversation last-agent rule.
Fireflies.ai app
The Fireflies.ai app ingests Fireflies meeting recordings — from Zoom, Microsoft Teams, and Google Meet — as transcript-first conversations. Each meeting becomes a conversation with one channel per Fireflies speaker ID. If the resolved agent appears under the same non-generic label on several IDs, those agent IDs are merged into one channel. The meeting's mixed recording is attached for playback when your Fireflies plan exposes it.
Installing Fireflies.ai
Before you install, get your Fireflies API key from your Fireflies.ai account. Sign in to Fireflies, open the developer/integrations area (the Fireflies API section, listed under Integrations or Developer settings), and copy the API key. This is the only credential Ender Turing needs.
In the App Marketplace, click Install on the Fireflies.ai card.
The Fireflies.ai credentials dialog opens. Paste your Fireflies API key into the only field.
(Optional) Click Check to verify that the key authenticates against Fireflies. The status line turns green on success or red with the Fireflies error message on failure.
Click Save credentials to install. Ender Turing starts pulling completed meetings into the conversations list.
After installing, set the Timezone you want meeting times shown in — see Fireflies.ai settings. Until you change it, meeting times are shown in UTC.
Fireflies.ai settings
Use Update settings from the app's actions menu to change:
Setting | Description |
Timezone | The timezone in which imported meeting start times are recorded. Defaults to UTC. |
Fireflies reports meeting times in UTC. Ender Turing converts each newly imported meeting's start time into the timezone you pick here, so the date and time you see on the conversation — in Conversations, in date filters, and in analytics — match your team's local clock instead of UTC.
To change it:
Open Apps from the main navigation and select your Fireflies.ai installation under Connected Apps.
Open the Actions menu and choose Update settings.
In the Configuration dialog, pick a timezone from the searchable Timezone list.
Click Save changes.
What to expect:
The setting applies going forward. Meetings imported before you changed it keep the start times they were stored with. Running Sync more historical conversations does not restate them either, because meetings already in Ender Turing are skipped rather than re-imported.
It does not change which meetings are picked up. Synchronization still discovers meetings by their UTC start time, so changing the timezone affects only the times you see, not the sync window or which meetings arrive.
It applies to the whole installation. There is no per-user timezone for imported meetings — everyone sees the same time on a Fireflies conversation.
Existing installations default to UTC. An installation that has never had settings saved opens the dialog with UTC preselected and keeps behaving as before until you pick another timezone and save.
What gets imported
For each completed Fireflies meeting in the sync window, Ender Turing creates one conversation with:
the meeting's start time — converted into the timezone configured for the app — and its duration, as reported by Fireflies
one channel per Fireflies speaker ID, in first-seen order — meetings with more than two participants are supported; if the resolved agent has the same non-generic label on several IDs, only those agent IDs are merged into one channel
the full meeting transcript, with each line carrying the speaker name and start/end timestamps
a link back to the original Fireflies transcript, visible from the conversation's Info section under the contact-center URL field
Each conversation is created as a call with Fireflies.ai as its queue name. Because the transcript already exists in Fireflies, Ender Turing does not re-run speech recognition — the imported transcript is what powers all transcript-based analytics.
Live meetings
A Fireflies meeting that is still being processed (the transcript is not finalized yet) is not imported during the sync that first sees it. The integration remembers the meeting and checks it again during each periodic synchronization, creating the conversation only after Fireflies marks the transcript as complete. If the meeting is later deleted in Fireflies, Ender Turing stops retrying it.
Meetings that show up in Fireflies late
Ender Turing's periodic synchronization looks for meetings by their start time, and Fireflies does not always publish a meeting the moment it starts — a long meeting, or one whose processing is queued, can only become visible some time after the fact.
To avoid missing those, each periodic synchronization does not resume exactly where the previous one stopped: it rewinds and re-scans roughly the last 8 hours of already-covered time. A meeting that Fireflies published only after Ender Turing had already scanned its start time is therefore picked up by a later run. Meetings that were already imported are recognized and not duplicated.
What this means in practice:
You do not need to do anything for a meeting that appears in Fireflies within a few hours of when it started. It arrives on its own, just later than a promptly published meeting.
A meeting that becomes available in Fireflies more than 8 hours after its start time falls outside the re-scanned window and is not picked up automatically. If you notice such a gap, use Sync more historical conversations from the app's Actions menu to re-scan the days concerned; meetings already in Ender Turing are skipped, so it is safe to run.
Rotating your Fireflies API key
If you regenerate your API key in Fireflies, or rotate it on a schedule, update it in Ender Turing through the Change app credentials action — you do not need to uninstall and reinstall the app, and you do not need to wait for the connection to start failing. See Updating app credentials for the steps.
Note that the stored key is never displayed back to you: the Fireflies API key field shows ****** and stays optional, so you can open the dialog, click Check to confirm the current key still authenticates, and close it without changing anything.
Playable audio
During synchronization, Ender Turing obtains the meeting's audio recording URL when the Fireflies plan exposes it. After the conversation is created, a background task downloads the recording, converts it into Ender Turing's standard playback format, and attaches it to the conversation. The audio player on the conversation page then plays this mixed recording.
If your Fireflies plan does not expose the audio URL — Fireflies requires a paid plan for this — the conversation stays transcript-only. The transcript, scoring, summaries, and other transcript-based features still work the same way; only the audio player is unavailable.
Speaker attribution
Fireflies lists who was invited to a meeting by email, and labels transcript speakers by name — but it never says which email belongs to which speaker. Ender Turing therefore decides two things separately for every imported meeting:
Which agent the meeting belongs to — chosen from the meeting's emails.
Which speaker in the transcript is that person — their agent channel, which is what makes scoring, talk-time, and agent analytics attribute the right half of the conversation.
Because the two are decided independently, a meeting can end up attributed to an agent whose channel could not be identified.
Choosing the agent
Ender Turing recognises your people by email. An email counts as one of your agents when it matches that agent's phone number, or one of the alternative numbers on their record under Agents and Teams. An email that only appears on a linked Ender Turing user account does not count. Several emails on the same agent record stay one person.
The meeting is attributed in this order:
Order | Who is chosen | When |
1 | The meeting organizer | The organizer is listed among the meeting's participants or invitees and matches one of your agents. |
2 | A colleague who actually spoke | The organizer matches one of your agents but cannot be found in the transcript, and exactly one other invited participant who matches an agent can be. This covers the common case of an organizer who booked the meeting but stayed silent — or never joined. |
3 | The Fireflies user the meeting was recorded for | The organizer is external, or is not listed among the participants. |
If the chosen email has no agent record yet, Ender Turing reads your Fireflies workspace users once per synchronization and creates an agent for each returned email, storing the email as the agent's phone number. Agents you already have are reused rather than duplicated — including deactivated ones, which are never reactivated or renamed by this. If your Fireflies plan does not expose workspace users, the meeting is imported with no agent.
If two agent records carry the same email — typically because one holds it as an alternative number, or because a deactivated record still has it — Ender Turing cannot tell which person is meant and imports the meeting without an agent. Leave that email on one record only, or merge the duplicates under Agents and Teams (see Merge duplicate agents), and later meetings resolve normally.
Merging keeps the result active only when both records were active, so if one of the duplicates was deactivated, the merged agent is deactivated too. Reactivate it after the merge — otherwise meetings do resolve to it, but are then discarded for the reason below.
Meetings attributed to a deactivated agent are not imported
This is worth checking first when a Fireflies meeting never appears in Conversations. If the agent chosen above is deactivated at the moment the meeting is imported, no conversation is created for it at all — the meeting is not imported with a different agent, and not imported without one.
The meeting is also recorded as handled, so it is not retried later: reactivating the agent afterwards and running Sync more historical conversations does not bring it back. When someone leaves, keep their agent active until their meetings have been imported.
Choosing the agent's channel
Once the agent is known, Ender Turing looks for them among the transcript speakers, in this order:
A clear, unique name match between the agent and one speaker label — the agent's name in Ender Turing, the name on the meeting invite, or their Fireflies name.
Elimination — speakers whose labels match the other known people in the meeting are ruled out. If exactly one speaker is left, that is the agent.
Closest remaining match — the one remaining speaker whose label is clearly closer to the agent's name or email address than any other.
A best guess — if the evidence still cannot separate the candidates, Ender Turing picks the most likely speaker rather than leaving the channel blank, and records that the choice was a guess.
So whenever Fireflies supplies at least one speaker, the meeting gets an agent channel. Only a meeting with no speakers at all keeps the agent with the channel left unset.
If the same person appears under several speaker IDs carrying the same label — which Fireflies does produce — those IDs are merged into a single agent channel. Generic labels such as "Speaker 1" or "Guest" are never merged this way, and only the selected agent's IDs are merged; other speakers keep one channel each.
Checking and correcting attribution
To see how a meeting was attributed, open the Session details dialog from the conversation and check the Info section. The fireflies entry contains an agent_resolution block recording which rule picked the agent (identity_match_type) and which rule picked the channel (channel_match_type). A channel_match_type of best_effort means step 4 above was used — the channel is a guess and is worth checking before you rely on that meeting for scoring.
To correct it, open Session details and click Edit. This requires permission to edit conversation details. The two decisions are corrected by two separate fields:
Agent — who the meeting belongs to. Changing it does not change the agent channel.
Agent channel — which speaker is that person. Pick the right channel here when the agent is already correct but the channel was guessed; until you do, talk time and scoring stay attributed to the wrong speaker.
A later synchronization will not overwrite your change, because meetings already in Ender Turing are not re-imported.
Binotel app
The Binotel app connects your Binotel cloud PBX to Ender Turing. Calls handled on your Binotel lines, together with their recordings, are pulled in on the regular synchronization schedule and appear in Conversations alongside conversations from every other source, ready for transcription, scoring and analytics.
This is a server-side integration that talks to Binotel directly. It is separate from the Binotel entry in the WebRTC app's Supported services list, which records the Binotel web workspace from the agent's browser instead. You do not need the browser extension to use this app.
Installing Binotel
Before you install, ask your Binotel administrator for the API credentials of your company account — an API key and an API secret. Both belong to the company as a whole, and the app has no per-line filter: it takes in the calls of every line on the account those credentials open. If part of your Binotel account should stay out of Ender Turing, use credentials for an account whose scope already matches what you want ingested.
In the App Marketplace, click Install on the Binotel card. The card has no logo — Binotel branding is not shipped yet — but it behaves like any other app card.
The credentials dialog opens. Fill in:
Binotel API key
Binotel API secret
(Optional) Click Check to verify the pair against Binotel before saving. The status line next to the button turns green on success and red when the credentials are wrong; the reason Binotel gave arrives separately, as an error notification.
Click Save credentials to install. Ender Turing starts pulling calls on the next synchronization.
Binotel has no configurable settings, so the Update settings action does not appear on its details page.
Installing does not bring in your existing Binotel history. Synchronization starts from the moment you install, and every run — the first one included — covers roughly the last 3 hours, so calls made before that never arrive on their own. To pull those in, use Sync more historical conversations from the app's Actions menu, described under Recordings that are still uploading.
What gets imported
For each Binotel call in the sync window, Ender Turing creates one conversation carrying:
the call start time and the talk duration reported by Binotel
the direction — incoming or outgoing
the customer's phone number
the internal number of the line that handled the call, when that line has a numeric extension — this is also how the conversation is attributed to an agent
the call recording, attached for playback
Lines that report a label instead of a numeric extension — typically queue and IVR lines — leave the internal number blank on the conversation; the label itself is not stored.
Binotel's own customer names and employee email addresses are not stored on the conversation either. The employee name reaches Ender Turing only through the agent record, and the email only serves to match a call to an agent you already have — see How agents are recognized.
Only calls that have a finished recording are ingested. Calls with nothing to listen to — unanswered, cancelled, or otherwise never connected — are skipped, so they never appear as empty conversations.
A call that matches an agent also needs that agent to be active, and what counts is whether the agent is active at the moment the call is imported — not whether they were active when the call was made. If the line's internal number or the employee's email matches an agent that is deactivated when the sync runs, the recording is fetched, discarded, and no conversation is created. Deactivating an agent therefore also keeps their older calls out of Sync more historical conversations. A call dropped this way still counts as handled, so reactivating the agent and re-running the resync does not bring it back. If calls from one person are missing, check that their agent record is active before you resync — and when someone leaves, keep their agent active until the calls you need have been imported.
This applies only to calls that match an existing agent. A call that matches nobody — a queue or IVR line whose label is not an extension, reported with an employee email that belongs to no agent in Ender Turing — is imported normally, as a conversation with no agent attached.
Binotel recordings carry both parties on separate channels, with your side on the left channel. Ender Turing uses this, so transcripts attribute speech to the operator and the customer correctly without relying on voice separation.
How agents are recognized
Each Binotel line is ingested as its own agent, identified by the line's internal number. You do not have to maintain a list of numbers: a line that Ender Turing has not seen before gets an agent record created for it automatically the first time one of its calls arrives, named after the employee Binotel reports for that line.
Because the line is the unit, one person who works from several lines — for example a softphone and a mobile SIM — shows up as several agents. To report on them as one person, select both records under Agents and Teams and use the Merge action; see Merge duplicate agents. Merging is deliberately left to you, because it cannot be undone once done.
The employee name Binotel reports is also used to fill in a blank agent name. If a call matches an agent record that has no name yet — whether matched by number or by email — that record is given the Binotel employee name. Agents that already have a name keep it, so a name you set in Ender Turing is never overwritten by Binotel.
Lines whose internal number is not a plain number — queue and IVR lines report a label rather than an extension — do not get an agent created for them. Their calls are still ingested, and are attributed to an existing agent when the email Binotel reports matches one.
Recordings that are still uploading
Binotel publishes a call as soon as it ends, but its recording can take longer to finish uploading. A call whose recording is not ready yet is left alone rather than imported without audio.
To catch these, each synchronization rewinds and re-reads roughly the last 3 hours of already-covered time instead of resuming exactly where the previous run stopped. A recording that finished uploading after Ender Turing first saw its call is therefore picked up by a later run. Calls already imported are recognized and not duplicated.
What this means in practice:
You do not need to do anything for a recording that becomes available within a few hours of the call. It arrives on its own, just later than a promptly uploaded one.
A recording that only becomes available more than 3 hours after the call started falls outside the re-read window and is not picked up automatically. If you notice such a gap, use Sync more historical conversations from the app's Actions menu to re-scan the days concerned; calls already in Ender Turing are skipped, so it is safe to run.
Sync more historical conversations re-scans whole days counting back from today: choosing N days covers today and the N − 1 days before it. The slider stops at 90, so the oldest day this action can reach is 89 days before today. Note that the start date shown in the dialog is one day earlier than the oldest day actually re-scanned, so pick a value with a day to spare when your gap is near the limit. A gap older than that cannot be filled from this action — if you need those calls, contact Ender Turing support.
Rotating your Binotel credentials
If your Binotel API key or secret is reissued, update it in Ender Turing through the Change app credentials action — you do not need to uninstall and reinstall the app. See Updating app credentials for the steps.
The stored secret is never displayed back to you: the Binotel API secret field shows ****** and stays optional, so you can change the key alone, or open the dialog, click Check to confirm the current pair still works, and close it without changing anything.
WebRTC App Settings
The WebRTC app records calls and meetings straight from the agent's browser, using the Ender Turing call recorder browser extension. After installing the app, you can configure the following settings through the Update settings action on the app details page:
Setting | Description |
Services to record | The platforms the extension is allowed to record on. See Choosing which services to record. |
Timezone | The timezone used when storing call recording timestamps. |
Enable extension log ingestion | When turned on, diagnostic logs from agents' browser extensions are collected for troubleshooting. Disabled by default. |
Choosing which services to record
Services to record is the list of telephony and meeting platforms your agents' extensions may record on. The extension attaches its recorder only on the platforms selected here — on any other site it stays idle, even if the extension is installed and connected.
To change the list:
Open Apps from the main navigation and select your WebRTC installation under Connected apps.
Open the actions menu and choose Update settings.
Click the Services to record field and tick the platforms you use. The field is searchable, and each selected service appears as a chip you can remove with its ×.
Click Save changes.
The setting applies to the whole organization — there is no per-agent list — and takes effect without reinstalling the app or the extension. Keep at least one service selected: with an empty list the extension has no platform to attach to, so nothing is recorded for anyone.
Supported services
Service | What it covers |
Zendesk Talk | Your Zendesk agent workspace (any |
High Level | The GoHighLevel app on |
Google Meet | Google Meet calls. |
Binotel | The Binotel web workspace. |
Genesys Cloud | The Genesys Cloud agent apps in every Genesys region, including the Americas, EMEA, Asia-Pacific, and the US government and EU sovereign clouds. |
NICE CXone | NICE CXone and legacy NICE inContact workspaces, including the government cloud. |
Five9 | Five9 workspaces on the US, EU, and Canadian domains. |
Talkdesk | The Talkdesk agent workspace and sign-in domain. |
Amazon Connect | Amazon Connect agent workspaces on both the newer instance domains and the older AWS apps domains. |
Twilio Flex (hosted) | Twilio-hosted Flex only. Flex deployed on your own domain is not covered. |
Webex Contact Center | The Webex Contact Center agent desktop and management portal in the supported Cisco regions. |
RingCentral | The RingCentral app, service portal, and meetings, including the UK service portal. |
Zoom | Zoom meetings, including Zoom for Government. |
Microsoft Teams | Teams on the web, including the personal ( |
8x8 | 8x8 workspaces and 8x8 meetings. |
Dialpad | The Dialpad web app. |
Aircall | The Aircall web phone. |
Salesforce | Salesforce and Lightning Experience, including the government cloud. |
Zendesk is covered by Zendesk Talk — there is no separate Zendesk entry.
What to expect
Nothing turns on by itself. Installations that already exist keep exactly the services they had selected. New services become active only after someone ticks them.
Agents still need to be set up. An agent records only when their Ender Turing user is linked to an active agent record and their browser extension is connected. See the WebRTC extension installation guide for the agent-side steps.
Agents need a current extension. The extension is separately restricted to the sites it is allowed to run on. If nothing is recorded after you enable a platform, check that agents are running an up-to-date version of the Ender Turing call recorder extension.
Confirm each platform with a real call. Selecting a service means the extension will try to record there. Platforms differ in how they handle audio in the browser, so make one test call per newly enabled platform and check that it appears in Conversations.
Very short recordings are kept without a transcript. See Very Short or Empty Calls.
WebRTC Observability
For the WebRTC app, a dedicated monitoring view helps you track the health of agents using WebRTC for calls.
Accessing WebRTC Observability
Open the WebRTC app from Connected Apps.
On the app details page, click the observability chip that shows the agent health ratio (for example, "8/10 ok").
The WebRTC observability details page opens.
Reading the Dashboard
At the top, a summary displays:
Health ratio — how many agents are healthy out of the total (e.g., "8/10 ok")
Summary counters — the number of agents that are not OK and the number that are muted
Below the summary, a table lists each agent with the following columns:
Column | Description |
Agent | Agent name |
Phone | Phone number |
Email address | |
Last ping | When the agent's WebRTC extension last reported in (highlighted in amber if stale). Click the cell to open the connectivity history dialog. |
Paused | Whether the agent's extension is currently paused or unpaused. Only shown when the agent has reported at least once. Click the cell to open the pause status history dialog. |
Version | The version of the agent's WebRTC browser extension. |
Last recorded call | When the agent's most recent call was recorded (highlighted in amber if stale) |
Current issues | Active problems affecting the agent, or "No active issues" |
The Paused column is informational only — it does not affect the health summary chip or the not-OK agent count.
Viewing Telemetry History
Click the Last ping or Paused cell for any agent to open a telemetry history dialog. The dialog shows historical data for that agent in the selected mode:
Connectivity history (opened from the Last ping cell) — shows when the agent's extension was online or offline.
Pause status history (opened from the Paused cell) — shows when the agent's extension was paused or unpaused.
The dialog contains:
Date range selector — defaults to the last 3 days. Use the date picker to choose a different range. If you select a range that ends today, the data is capped at the current time to avoid showing misleading future gaps.
Stepped chart — a visual timeline showing the agent's state over the selected period. For connectivity mode the chart shows online/offline; for pause mode it shows paused/unpaused.
Interval table — lists each continuous interval with its state, start time, and end time. For connectivity history, offline intervals are derived from gaps between the extension's periodic check-ins within the selected range.
If no telemetry data exists for the selected date range, the behavior depends on the mode. In connectivity mode, the entire range is treated as offline and shown in the chart and table. In pause mode, the dialog shows an empty state message. If the data fails to load, you can retry from within the dialog.
Filtering and Searching
Use the Active / Muted toggle to switch between agents that are actively monitored and agents you have muted.
Use the search field to find agents by name, phone number, or email.
Click the Agent, Last ping, or Last recorded call column headers to sort the table.
Adjust the number of rows per page (10, 25, 50, or 100).
Understanding Issues
The Current issues column shows issue codes that describe what is going wrong for an agent. Common issues include recording failures, invalid tokens, script injection failures, and permission failures.
When an issue includes a related service name, it is displayed alongside the code (for example, "recording_failed (ServiceName)").
Viewing Recording Failure Details
When a recording failure issue includes additional diagnostic metadata, a button appears next to the issue. Click it to open a dialog titled Recording failure metadata, which displays technical details about why the recording failed. This information can help you diagnose and resolve the problem.
Muting and Unmuting Agents
To temporarily suppress alerts for an agent, click Mute in that agent's row. The agent moves to the Muted list.
To resume monitoring, switch to the Muted view and click Unmute on the agent.
Muting does not fix the underlying issue — it only hides the agent from the active list so you can focus on other agents that need attention.
