Skip to content
Migrated — not yet rewrittenCarried over from the previous help center on 28 August 2026. Content is accurate as published but has not been rewritten to the current article template.

Outbound Webhooks Guide


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.

  1. Navigate to Webhooks > Outgoing in your MojaAI dashboard

  2. Click Create Webhook

  3. Enter your endpoint URL

  4. Select the event type you want to trigger on

  5. Define your request template (URL, headers, body) using [TAG_NAME] placeholders

  6. Choose body format (JSON or form data)

  7. Save the webhook


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

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.

  1. Create a webhook configuration in Webhooks > Outgoing

  2. Select an event type to trigger on

  3. Define your URL, headers, and body using [TAG_NAME] placeholders

  4. When the event fires, MojaAI replaces all placeholders with real values and sends the request

  • JSON — Request body sent as application/json

  • Form Data — Request body sent as application/x-www-form-urlencoded

Webhooks support: GET, POST, PUT, PATCH, DELETE

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]


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.

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
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)
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
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)

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

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.


  1. Use HTTPS - All webhook endpoints should use HTTPS

  2. Handle duplicates - Use [CALL_ID] to deduplicate if needed

  3. Log payloads - Store raw payloads for debugging

  4. Monitor deliveries - Check Webhooks > Outgoing Webhook Requests for failed deliveries


Use the Test Webhook button in your dashboard to send a sample payload to your endpoint. This helps verify your integration before going live.


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.


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 as call.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.