Outbound Webhooks Guide
Overview
Section titled “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.
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
Creating a webhook does not send traffic. After you save the webhook, attach it to each campaign under Campaign → Outgoing webhooks, or to a target / RTB formula. To send the same call to more than one receiver, see Send call data to more than one outbound webhook.
Setting Up Webhooks
Section titled “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
Section titled “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 |
Webhook Payload
Section titled “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
Section titled “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
Section titled “Supported Formats”-
JSON — Request body sent as
application/json -
Form Data — Request body sent as
application/x-www-form-urlencoded
HTTP Methods
Section titled “HTTP Methods”Webhooks support: GET, POST, PUT, PATCH, DELETE
Example Template
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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?
Section titled “Need Help?”-
Email: support@mojaai.com
-
Help Center: Available in your dashboard

