Moja AIMoja AI

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

  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

Sample Event Types

The following are common event types. For a complete and up-to-date list, see Webhooks > Outgoing in your MojaAI dashboard.

EventDescriptionWhen It's Sent
call.incomingA new inbound call has been receivedWhen a caller dials a tracking number and the platform begins processing
call.connectedThe call has been answeredWhen the call connects to a target
call.hangupThe call has been hung upWhen either party ends the call
call.failureThe call failed to connectWhen the call cannot be connected to a target (e.g. busy, no answer, error)
call.completedCall processing is completeAfter hangup, when all post-call processing (conversion evaluation, logging) is finished
call.convertedThe call met conversion criteriaWhen the system determines a call qualifies as a conversion (fires after hangup)
call.on_5_secs_markCall reached 5 seconds connectedWhen the connected call duration hits 5 seconds
call.on_15_secs_markCall reached 15 seconds connectedWhen the connected call duration hits 15 seconds
call.on_30_secs_markCall reached 30 seconds connectedWhen the connected call duration hits 30 seconds
call.on_45_secs_markCall reached 45 seconds connectedWhen the connected call duration hits 45 seconds
call.on_60_secs_markCall reached 60 seconds connectedWhen 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

  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

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

TagDescription
[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

TagDescription
[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

TagDescription
[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

TagDescription
[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):

TagDescription
[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

  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

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

Need Help?

On this page