Perfcopilot

Phone (Aircall / RingCentral)

Phone signals capture call volume, duration, direction, and outcomes for roles where phone activity is a meaningful work signal — support teams, SDRs, inside sales. Headline metric: total_calls. Supports Aircall and RingCentral; one provider per org.

Volume only. This integration pulls call metadata and outcome signals. For transcript-based quality analysis — per-call scores, notable moments, rubric evaluation — see the Call Quality integration, which is a separate opt-in feature.

What we pull

Each call lands as a RawSignal(source="phone", event_type="call") row with:

  • call_id — provider's unique call identifier
  • directioninbound or outbound
  • duration_sec — call duration in seconds
  • status — call result (e.g. done, missed, voicemail for Aircall; Call connected, Accepted for RingCentral)
  • after_hours — whether the call started before 8AM or after 6PM UTC
  • escalated — whether call notes or tags contain escalation keywords (escalat, urgent, manager, complaint, refund)
  • resolved — whether call notes contain resolution keywords (resolved, fixed, satisfied) or status indicates completion

Escalation detection is keyword-based. For Aircall, the ingester scans call notes and tags. For RingCentral, no tags are available in the call log — escalated is always false for RingCentral calls. This is a known gap.

Connecting

Phone is an org-wide install.

Aircall

  1. Go to /admin?tab=integrations, find the Aircall card.
  2. Enter your Aircall API ID and API Token (from Aircall → Admin → API Keys). These are stored encrypted.
  3. Map each employee's Aircall user ID (numeric, visible in Aircall → Users or via the Users API).

Aircall uses HTTP Basic auth with API_ID:API_TOKEN. The ingester paginates the /calls endpoint at 50 calls per page.

RingCentral

  1. Find the RingCentral card under "Org-wide" integrations.
  2. Enter your JWT token and account ID (from RingCentral Developer Console).
  3. Map each employee's RingCentral extension ID.

RingCentral uses Bearer JWT auth against the Platform API v1.0 /call-log endpoint, filtering for type=Voice and direction=All.

What hits a review

[PHONE DATA]
total_calls:          187
inbound_calls:        112
outbound_calls:        75
avg_duration_sec:     243
after_hours_calls:     14
escalated_calls:        8
resolved_calls:       149

Plus cohort medians for total_calls in the [BASELINES] block.

Troubleshooting

"Phone signals show zero calls"

  1. No user ID mapped. The ingester filters by user_id in the Aircall API or extension/{user_id} in RingCentral. A missing mapping returns no calls.
  2. Wrong API credentials. Aircall returns a 401 for bad credentials. Check the API ID and token in the integration card — the token is different from the API key shown in the Aircall UI.
  3. RingCentral account ID wrong. The RingCentral adapter uses ~ as the default account ID, which resolves to the authenticated account. If your org uses a specific account ID, set it in extra_config.account_id.

"Call counts are lower than expected"

The Aircall adapter's since_days lookback is used when no cycle window is specified. If you're viewing a past cycle, the sync may have been scoped to that cycle's window. Check the cycle's period_start/period_end — calls outside that range won't appear even if they're in the general lookback.

"escalated count is always zero (RingCentral)"

This is expected. RingCentral's call log API doesn't expose tags or disposition notes. Escalation detection isn't available for RingCentral. Track escalations in a separate tool or CRM and weight the escalated signal to zero in the skill preset for RingCentral orgs.

Privacy notes

  • Call content (audio) is never accessed by this integration.
  • For Aircall, call notes and tags are scanned for keyword matching to compute escalated and resolved. The notes themselves are not stored — only the boolean result.
  • Call metadata (direction, duration, timing) is stored in raw_signals.payload and visible to managers.