Skip to main content
Frappe Helpdesk supports telephony integration to enable phone-based customer support with automatic ticket creation from calls.

Overview

Telephony integration enables:
  • Click-to-Call: Initiate calls directly from customer or ticket records
  • Automatic Ticket Creation: Create tickets automatically from incoming calls
  • Call Logging: Track call history and duration
  • Ticket Linking: Associate calls with existing tickets
  • Supported Providers: Twilio and Exotel integration

Supported Telephony Providers

Frappe Helpdesk integrates with:
  • Twilio: Popular cloud communications platform
  • Exotel: Cloud telephony solution for businesses
Implementation: desk/src/stores/telephony.ts

Prerequisites

Before setting up telephony:
1

Install Telephony App

Telephony functionality is provided by the separate Frappe Telephony app:
bench get-app telephony
bench --site your-site.local install-app telephony
2

Get Provider Credentials

Sign up with Twilio or Exotel and obtain:
  • Account SID
  • Auth Token
  • Phone number
3

Configure Provider

In Frappe, go to Telephony Settings and add your provider credentials.
The telephony integration requires the separate Frappe Telephony app (see helpdesk/patches/add_telephony_app.py).

Telephony Store Integration

The telephony functionality is managed through a Pinia store that tracks:
// From desk/src/stores/telephony.ts
interface TelephonyState {
  isLoading: boolean
  isCallingEnabled: boolean
  isTwilioEnabled: boolean
  isExotelEnabled: boolean
  defaultCallingMedium: string
  callMethod: (params: MakeCallParams) => void
  linkDoc: {
    doctype: string
    docname: string
  }
}

Call Integration Status

Check if telephony is enabled:
// Fetch integration status
await fetchCallIntegrationStatus()

// Check if calling is enabled
if (isCallingEnabled) {
  // Show call buttons
}
Implementation: telephony.ts:41-54

Making Calls

Click-to-Call from Tickets

1

Open Ticket

Navigate to a ticket with a customer phone number.
2

Click Call Button

Click the call icon to initiate a call to the customer.
3

Call is Initiated

The system:
  • Uses configured telephony provider
  • Links call to the ticket
  • Starts call recording (if enabled)
4

Call is Logged

After the call:
  • Duration is recorded
  • Call log is added to ticket
  • Activity is tracked

Making Calls Programmatically

import { useTelephonyStore } from '@/stores/telephony'

const telephony = useTelephonyStore()

// Make a call to a number
telephony.makeCall({
  number: '+1234567890'
})

// Make a call linked to a ticket
telephony.makeCall({
  number: '+1234567890',
  doctype: 'HD Ticket',
  docname: 'TICKET-00001'
})

Call Method Configuration

Set up the call method handler:
// Set the call method
telephony.setMakeCall((params) => {
  // Your call implementation
  console.log('Making call to:', params.number)
})

// Set default calling medium
telephony.setDefaultCallingMedium('Twilio')
Implementation: telephony.ts:29-37

Linking Calls to Documents

Associate calls with specific tickets:
// Set document to link
telephony.setLinkDoc({
  doctype: 'HD Ticket',
  docname: 'TICKET-00001'
})

// Make the call
telephony.makeCall({
  number: customerPhone
})
This creates a record linking the call to the ticket for reference. Link calls to customer records:
telephony.setLinkDoc({
  doctype: 'HD Customer',
  docname: customer.name
})

Call Handling

Incoming Calls

When a call comes in:
  1. Caller Identification: System looks up phone number
  2. Customer Match: Finds existing customer record
  3. Ticket Creation: Creates new ticket if configured
  4. Agent Notification: Alerts available agents
  5. Call Routing: Routes to appropriate agent

Call Recording

If call recording is enabled:
  • Calls are automatically recorded
  • Recordings are stored with the call log
  • Playback available from ticket or customer record
  • Compliance with local recording laws required

Call Notes

Agents can add notes during or after calls:
  • During Call: Real-time note taking
  • After Call: Wrap-up notes and disposition
  • Ticket Update: Notes are added to ticket communication

Call Area Component

The UI includes a call area component for managing calls:
  • Call Status: Active, ringing, completed
  • Timer: Call duration tracking
  • Controls: Mute, hold, transfer, hang up
  • Notes: Quick note-taking interface
Component: desk/src/components/CallArea.vue

Configuration

Telephony Settings

Configure in Frappe Telephony Settings:
  1. Provider: Select Twilio or Exotel
  2. Credentials: Enter API keys and tokens
  3. Phone Numbers: Configure your telephony numbers
  4. Call Recording: Enable/disable recording
  5. IVR Settings: Set up interactive voice response

Helpdesk Integration

In Frappe Helpdesk:
  1. Enable Call Support: Activate telephony features
  2. Default Calling Medium: Set preferred provider
  3. Auto-Create Tickets: Configure automatic ticket creation
  4. Call Disposition: Set up call outcome categories

Checking Integration Status

Verify telephony is working:
1

Check Store State

const telephony = useTelephonyStore()
console.log('Calling enabled:', telephony.isCallingEnabled)
console.log('Twilio enabled:', telephony.isTwilioEnabled)
console.log('Exotel enabled:', telephony.isExotelEnabled)
2

Fetch Status

await telephony.fetchCallIntegrationStatus()
This calls the API: telephony.api.is_call_integration_enabled
3

Verify UI

Call buttons should appear in:
  • Ticket views
  • Customer records
  • Contact details

Best Practices

Call Handling

  1. Train Agents: Ensure team knows how to use telephony features
  2. Call Scripts: Provide templates for common scenarios
  3. Quick Notes: Encourage note-taking during calls
  4. Follow Up: Create follow-up tasks for complex calls
  5. Customer Verification: Always verify caller identity

Integration

  1. Test Thoroughly: Verify calls work before going live
  2. Monitor Quality: Track call quality metrics
  3. Recording Compliance: Ensure legal compliance for recordings
  4. Backup Plan: Have fallback for telephony outages
  5. Regular Testing: Periodically test integration

Performance

  1. Network Quality: Ensure stable internet connection
  2. Headset Quality: Use quality headsets for best experience
  3. Browser Compatibility: Test on supported browsers
  4. Load Testing: Verify system handles expected call volume

Troubleshooting

Calls Not Working

Issue: Unable to make or receive calls Solutions:
  1. Verify Telephony app is installed
  2. Check provider credentials are correct
  3. Ensure phone numbers are configured
  4. Check browser permissions for microphone
  5. Verify firewall allows WebRTC traffic

Integration Not Detected

Issue: isCallingEnabled is false Solutions:
  1. Check Telephony app is installed and enabled
  2. Verify provider is configured
  3. Call fetchCallIntegrationStatus() to refresh
  4. Check API endpoint is accessible
  5. Review server logs for errors

Call Quality Issues

Issue: Poor audio quality or dropped calls Solutions:
  1. Check internet connection speed and stability
  2. Use wired connection instead of WiFi
  3. Close bandwidth-heavy applications
  4. Test with different browser
  5. Contact provider for network diagnostics

Calls Not Linking to Tickets

Issue: Calls don’t appear on ticket records Solutions:
  1. Verify setLinkDoc() is called before makeCall()
  2. Check doctype and docname are correct
  3. Review call log creation
  4. Check permissions for call log creation

Limitations

  • Requires separate Frappe Telephony app installation
  • Limited to Twilio and Exotel providers
  • Browser must support WebRTC for browser-based calling
  • Recording storage depends on provider limits

Build docs developers (and LLMs) love