Outbound Webhooks Guide
Receive real-time call event notifications from MojaAI to your systems.
Outbound Webhooks Guide
Overview
Outbound webhooks allow MojaAI to send real-time notifications to your systems when call events occur. Configure webhook endpoints to receive instant updates about calls and conversions. For sending data to MojaAI (caller metadata, revenue updates, tags), see the Inbound Webhooks Guide.
What you can do with webhooks:
- Receive instant call event notifications
- Update your CRM in real-time
- Track conversions and revenue automatically
- Trigger workflows based on call duration milestones
Setting Up Webhooks
- Navigate to Webhooks > Outgoing in your MojaAI dashboard
- Click Create Webhook
- Enter your endpoint URL
- Select the event type you want to trigger on
- Define your request template (URL, headers, body) using
[TAG_NAME]placeholders - Choose body format (JSON or form data)
- Save the webhook
Sample Event Types
The following are common event types. For a complete and up-to-date list, see Webhooks > Outgoing in your MojaAI dashboard.
| Event | Description | When It's Sent |
|---|---|---|
call.incoming | A new inbound call has been received | When a caller dials a tracking number and the platform begins processing |
call.connected | The call has been answered | When the call connects to a target |
call.hangup | The call has been hung up | When either party ends the call |
call.failure | The call failed to connect | When the call cannot be connected to a target (e.g. busy, no answer, error) |
call.completed | Call processing is complete | After hangup, when all post-call processing (conversion evaluation, logging) is finished |
call.converted | The call met conversion criteria | When the system determines a call qualifies as a conversion (fires after hangup) |
call.on_5_secs_mark | Call reached 5 seconds connected | When the connected call duration hits 5 seconds |
call.on_15_secs_mark | Call reached 15 seconds connected | When the connected call duration hits 15 seconds |
call.on_30_secs_mark | Call reached 30 seconds connected | When the connected call duration hits 30 seconds |
call.on_45_secs_mark | Call reached 45 seconds connected | When the connected call duration hits 45 seconds |
call.on_60_secs_mark | Call reached 60 seconds connected | When the connected call duration hits 60 seconds |
New event types may be added as the platform evolves. Always refer to your dashboard for the current list of available events.
Webhook Payload
Outbound webhooks are fully configurable. When creating a webhook, you define your own request template — including the URL, HTTP method, headers, and body. MojaAI replaces [TAG_NAME] placeholders in your template with actual call data at dispatch time.
How It Works
- Create a webhook configuration in Webhooks > Outgoing
- Select an event type to trigger on
- Define your URL, headers, and body using
[TAG_NAME]placeholders - When the event fires, MojaAI replaces all placeholders with real values and sends the request
Supported Formats
- JSON — Request body sent as
application/json - Form Data — Request body sent as
application/x-www-form-urlencoded
HTTP Methods
Webhooks support: GET, POST, PUT, PATCH, DELETE
Example Template
Body template (configured in dashboard):
{
"call_id": "[CALL_ID]",
"caller": "[CALLER_ID]",
"campaign": "[CAMPAIGN_NAME]",
"duration": "[DURATION]",
"converted": "[CONVERTED]",
"revenue": "[REVENUE_PAID_OUT]",
"tags": {
"source": "[UTM_SOURCE]",
"state": "[CALLER_STATE]"
}
}Resulting payload (after placeholder replacement):
{
"call_id": "call_abc123def456",
"caller": "+13105559876",
"campaign": "Medicare Leads Q1",
"duration": "145",
"converted": "true",
"revenue": "35.00",
"tags": {
"source": "google_ads",
"state": "CA"
}
}Placeholders can also be used in the URL and query parameters. For example: https://your-api.com/webhook?call_id=[CALL_ID]&campaign=[CAMPAIGN_ID]
Sample Tags
The tags below are commonly used placeholders. For a complete and up-to-date list of available tags, see Webhooks > Outgoing in your MojaAI dashboard when creating or editing a webhook.
Use these [TAG_NAME] placeholders in your webhook URL, headers, query parameters, and body.
Call Identification
| Tag | Description |
|---|---|
[CALL_SID] | Internal call session ID |
[CALL_ID] | MojaAI call ID |
[FROM] | Caller's phone number (raw) |
[TO] | Dialed tracking number (raw) |
[CALLER_ID] | Caller's phone number (formatted) |
[CALLER_ID_NO_PLUS] | Caller's phone number without + prefix |
[CALLER_ID_NUMERIC] | Caller's phone number as numeric value |
[CALLER_ZIP] | Caller's ZIP code |
[CALLER_STATE] | Caller's state |
[STATE] | State (current, may differ from original if updated) |
[ZIP_CODE] | ZIP code (current) |
[ORIGINAL_STATE] | Original state at call start |
[ORIGINAL_ZIP_CODE] | Original ZIP code at call start |
[INBOUND_CALL_ID] | Inbound call session identifier |
[ORG_ID] | Organization ID |
Campaign & Publisher
| Tag | Description |
|---|---|
[CAMPAIGN_ID] | Campaign ID |
[CAMPAIGN_NAME] | Campaign name |
[PUBLISHER_ID] | Publisher ID |
[PUBLISHER_NAME] | Publisher name |
[PUBLISHER_NUMBER] | Publisher's tracking number |
[PAYOUT] | Publisher payout amount (formatted) |
[PAYOUT_NUMERIC] | Publisher payout amount (numeric) |
Target & Buyer
| Tag | Description |
|---|---|
[TARGET_ID] | Target ID |
[TARGET_NAME] | Target name |
[TARGET_TYPE] | Target type |
[BUYER_ID] | Buyer ID |
[BUYER_NAME] | Buyer name |
[TARGET_PAYOUT] | Target-level payout |
[PUBLISHER_PAYOUT] | Publisher payout for this call |
Conversion & Revenue
| Tag | Description |
|---|---|
[CONVERTED] | Whether the call converted (true/false) |
[REVENUE_PAID_OUT] | Buyer revenue amount |
[PUBLISHER_PAID_OUT] | Publisher payout amount |
[CALL_TERMINATION_BY] | Who terminated the call |
[DURATION] | Connected call duration (seconds) |
[INBOUND_DURATION] | Inbound leg duration (seconds) |
[OUTBOUND_DURATION] | Outbound leg duration (seconds) |
[CALL_CONVERTED_AT] | Timestamp when conversion was detected |
[EVENT_TIMESTAMP] | Timestamp of the event |
[CONFIGURED_PUBLISHER_PAYOUT] | Configured publisher payout (formatted) |
[CONFIGURED_PUBLISHER_PAYOUT_NUMERIC] | Configured publisher payout (numeric) |
[CONFIGURED_BUYER_REVENUE] | Configured buyer revenue (formatted) |
[CONFIGURED_BUYER_REVENUE_NUMERIC] | Configured buyer revenue (numeric) |
[OVERWRITTEN_BUYER_REVENUE] | Overwritten buyer revenue (if applicable) |
Landing Page & Attribution
These tags are populated for calls originating from Dynamic Number Insertion (DNI):
| Tag | Description |
|---|---|
[GCLID] | Google Click ID |
[FBCLID] | Facebook Click ID |
[UTM_SOURCE] | UTM source parameter |
[UTM_MEDIUM] | UTM medium parameter |
[UTM_CAMPAIGN] | UTM campaign parameter |
[UTM_CONTENT] | UTM content parameter |
[UTM_TERM] | UTM term parameter |
[KEYWORD] | Search keyword |
[VISITOR_ID] | Visitor identifier |
[LANDING_PAGE] | Full landing page URL |
[LANDING_PAGE_DOMAIN] | Landing page domain |
[LANDING_PAGE_PATH] | Landing page path |
[REFERRER] | Referrer URL |
[VISITOR_CITY] | Visitor's city |
[VISITOR_STATE] | Visitor's state |
[VISITOR_ZIP] | Visitor's ZIP code |
[VISITOR_COUNTRY] | Visitor's country code |
[VISITOR_IP] | Visitor's IP address |
[VISITOR_BROWSER] | Visitor's browser |
Custom Tags
Any custom tags you define are also available as placeholders using their tag key in uppercase. For example, if you create a custom tag with key lead_type, use [LEAD_TYPE] in your template.
Failed webhook deliveries are logged and visible in Webhooks > Outgoing Webhook Requests in your dashboard.
Best Practices
- Use HTTPS - All webhook endpoints should use HTTPS
- Handle duplicates - Use
[CALL_ID]to deduplicate if needed - Log payloads - Store raw payloads for debugging
- Monitor deliveries - Check Webhooks > Outgoing Webhook Requests for failed deliveries
Testing Webhooks
Use the Test Webhook button in your dashboard to send a sample payload to your endpoint. This helps verify your integration before going live.
Custom Headers
Add custom headers to authenticate requests to your endpoint:
{
"Authorization": "Bearer your-api-token",
"X-Custom-Header": "custom-value"
}Configure these in the webhook settings in your dashboard.
Troubleshooting
Problem: Webhooks aren't being received
- Solution: Verify your endpoint URL is correct and accessible. Check that your server isn't blocking requests from MojaAI IP addresses. Review delivery status in Webhooks > Outgoing Webhook Requests.
Problem: Placeholder tags not being replaced
- Solution: Ensure tag names in your template are uppercase and wrapped in brackets, e.g.
[CALL_ID]. Note that not all tags are available on every event type — for example, conversion-related tags like[CONVERTED]and[REVENUE_PAID_OUT]are not populated on early events such ascall.incoming. If a tag is not available for the event that fired, the raw placeholder text (e.g.[CONVERTED]) is returned in the payload instead of a value. Check the event type documentation in your dashboard to confirm which tags are available for each event.
Problem: Webhooks are timing out
- Solution: Return 200 OK immediately and process the webhook asynchronously. Your endpoint must respond within 10 seconds.
Need Help?
- Email: [email protected]
- Help Center: Available in your MojaAI dashboard
- Related: Inbound Webhooks Guide · API Reference