Skip to main content

Outbound Webhooks Guide

D
Written by Denise Abdullah
Updated over a month ago

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.

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.

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

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

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

  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?


Did this answer your question?