Location: Custom Tags, inbound RTB / publisher ping fields, Call Flows, outgoing webhooks
Use case: Keep a field from a ping, webhook, or landing page on the call, then use it in routing or a postback
Custom Tags are fields you define. System tags such as [CALL_ID] and [CALLER_ID] already exist. Anything else — a publisher’s own call id, affid, lead token, or ping parameter — is dropped unless a Custom Tag with that key exists first.
Create the tag before traffic needs it. Attaching a call flow later will not recover inbound RTB ping fields that were never stored.
Create the tag
Open Custom Tags.
Create a tag whose key matches the inbound field name. Use the standard lower-case format, for example
call_idoraffid.Matching is case-insensitive. Existing mixed-case references still resolve. Use lower-case on new tags.
Save. The tag is now eligible to persist on calls and appear as
[CALL_ID]/[AFFID]style placeholders in webhooks and filters.
Do not create a Custom Tag named call_id. That key is reserved. Tag names are matched case-insensitively and normalized, so call_id, CALL_ID, and [CALL_ID] are the same field: Moja’s call id. A publisher’s own id must use a different key, such as pub_call_id or external_id. Create the Custom Tag with that name, have the publisher send that parameter, and map [PUB_CALL_ID] on the webhook. Use system [CALL_ID] only when the receiver wants Moja’s id.
How values get onto the call
Source | What to do |
Inbound RTB or publisher ping query/body | Create a Custom Tag whose key matches the ping field, and do not use a reserved system name. Inbound RTB uses the campaign call flow at ping time to choose a routing plan. After the number is claimed, the call follows the allocated destination. Persist ping fields with a Custom Tag before the ping; do not depend on a later flow node to copy them. |
Inbound | Send the field on the webhook. Create the Custom Tag first so it is available to the call flow and routing plan. |
Landing-page URL (DNI) | Parameters are stored under All URL Parameters. Create a Custom Tag if you need a standalone placeholder such as |
Voice agent collection | The Custom Tag must exist before the agent can persist it as an applied tag. |
Use the tag
Outgoing webhook: put
[TAG_KEY]in the URL or body. Example: publisher wants their id back → they sendpub_call_id, you create that Custom Tag, then mapcall_id=[PUB_CALL_ID]if their receiver still expects acall_idquery name.RTB request or Advanced Filter: map the tag after it exists and is populated. See Custom Tags with RTBs.
Call flow: inbound RTB dry-runs the attached flow at ping to resolve the routing plan. After claim, do not rely on a live flow node to copy ping fields. Create the Custom Tag first.
How to test
Confirm the Custom Tag exists before the test ping or call.
Send the field with the exact key you created.
Open the call in reporting / call details and confirm the tag value.
If a webhook should send it, open Outgoing Webhook Requests and confirm the placeholder was replaced — not blank, and not the raw
[call_id]text.
Troubleshooting
Postback field is empty
No Custom Tag for that ping key, the ping used reserved call_id (Moja’s id), or the webhook mapped the wrong placeholder. Check the live request body.
Ping shows the field, call does not
Inbound RTB always logs ping params. They become call tags only when a matching Custom Tag exists at claim time.
Flow was supposed to copy the value
The ping may have used the flow to pick a plan, but the claimed call does not re-run that copy step. Create the Custom Tag on a non-reserved ping key before traffic starts.
Filter or RTB field never matches
Tag was not populated before the request or filter ran. Confirm the value on the call first.
Related articles
