| title | Voice Provider Troubleshooting |
|---|---|
| description | Common custom voice provider problems |
Error example:
voice provider not found: mango
Check:
- File exists: /usr/local/lib/incidentrelay/voice_providers/mango.py
- Channel config has: "provider": "mango"
- File name contains only letters, numbers and underscore
- IncidentRelay was restarted after adding the file
Error example:
voice provider mango must define Provider(BaseVoiceProvider)
Check that your module contains:
class Provider(BaseVoiceProvider):
...The class name must be exactly:
Provider
Error example:
mango config requires: api_url, api_token
Check provider_config in channel config.
If you use:
"api_token": "${VOICE_API_TOKEN}"Check that the environment variable exists for the IncidentRelay process.
For systemd:
sudo systemctl show incidentrelay --property=EnvironmentOr check your service unit / environment file.
Check:
- Alert status is firing.
- Alert severity is listed in notify_on_severities.
- Alert has an assignee with phone number.
- Channel is enabled.
- Route points to the voice channel.
Check:
- Callback URL contains the correct channel_id.
- Callback URL contains the correct callback secret.
- Channel type is voice_call.
- Channel config has the expected provider.
- Provider sends JSON or form data supported by parse_callback().
Check:
- Provider sends event_type=dtmf or equivalent data that parse_callback() maps to dtmf.
- Provider sends digit.
- Channel config dtmf_actions contains this digit.
- The digit maps to acknowledge or resolve.
- call_id matches the original VoiceCallResult.call_id.
Check:
- Provider returned call_id from place_call().
- Provider sends the same call_id in callbacks.
- IncidentRelay stored external_message_id for the notification.
- Callback is sent to the same channel_id that created the call.
Check:
- All HTTP requests have timeouts.
- Provider API endpoint is reachable from IncidentRelay.
- DNS resolution works.
- Firewall allows outbound provider traffic.
Good:
requests.post(url, json=payload, timeout=10)Bad:
requests.post(url, json=payload)Before enabling a provider in production:
1. Create a test voice channel.
2. Set test_phone.
3. Configure only one test severity, for example critical.
4. Trigger a test notification.
5. Check IncidentRelay logs.
6. Check provider-side logs or dashboard.
7. Confirm that call_id is returned.
8. Confirm that call status callbacks are received.
9. Confirm that DTMF callback with digit 1 acknowledges the alert.
10. Confirm that DTMF callback with digit 2 resolves the alert.
11. Confirm that provider errors are visible in IncidentRelay logs.
12. Confirm that secrets and full phone numbers are not logged.
13. Enable the provider for real alert routes.