CleverTap

Datafly Signal delivers events to CleverTap server-to-server using the Upload Events API (POST /1/upload). Events are keyed on each user’s identity, matched to their CleverTap profile, and made available for segmentation, journeys, and omnichannel campaigns — without a client-side tag.

Why route CleverTap through Datafly Signal

  • Profiles are updated from the server, not the browser. Events reach CleverTap even when a tracker blocker or a failed page unload would have dropped a client-side call, so the profile reflects what actually happened.
  • Delivery is batched, rate-limited, and retried. Signal buffers to Kafka, respects the CleverTap rate limit, and retries on 429 or transient failure rather than dropping the event.
  • One consent decision governs every destination. CleverTap is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.

Prerequisites

Before configuring CleverTap in Signal you need a CleverTap account and its server-side API credentials.

Find your Account ID and Passcode

  1. Sign in to the CleverTap dashboard.
  2. Go to Settings > Engagement > A/c Info (Account Info).
  3. Note the Account ID (also called the Project ID) and the Passcode (the Account Passcode, or a user-scoped passcode if your organisation uses per-user passcodes).

Identify your region

CleverTap provisions every account in a single data region. The region determines the API host you must send to.

Region codeData centre
us1United States
in1India
eu1Europe
sg1Singapore
aps3Asia-Pacific
mec1Middle East

Your region is shown in the dashboard URL and under Settings. Sending to the wrong region results in authentication failures.

Configure in Signal

Configuration Fields

FieldRequiredDescription
account_idYesYour CleverTap Account ID (Project ID). Sent as the X-CleverTap-Account-Id header.
passcodeYesYour CleverTap Account Passcode. Sent as the X-CleverTap-Passcode header.
regionYesYour account’s data region: one of us1, in1, eu1, sg1, aps3, mec1. Sets the API host.

Management UI Setup

  1. Go to Integrations > Add Integration > CleverTap.
  2. Choose the Default preset.
  3. Enter your account_id, passcode, and region.
  4. Select consent categories (typically marketing).
  5. Click Save.

API Endpoint

POST https://{region}.api.clevertap.com/1/upload

Required headers:

X-CleverTap-Account-Id: {account_id}
X-CleverTap-Passcode: {passcode}
Content-Type: application/json; charset=utf-8

Events are sent as a JSON object with a d array. Up to 1,000 records may be sent per request, and CleverTap allows up to 15 concurrent requests per account. Signal batches and rate-limits automatically.

Identity Signals

identity is the Signal user ID, else the trimmed, lower-cased email (plain text: it is the profile’s identity in CleverTap). Events from visitors with neither are not sent.

Event Mapping

Each event is one record in d[]: type: "event", identity, ts (epoch seconds), evtName and scalar evtData.

Signal eventCleverTap evtNamePreset
pageWeb Page ViewedDefault
searchSearchedAll
view_item_listCategory ViewedRetail
view_itemProduct ViewedDefault, Retail
add_to_wishlistAdded to WishlistDefault, Retail
add_to_cart / remove_from_cartAdded to Cart / Removed from CartDefault, Retail / Retail
view_cartCart ViewedRetail
begin_checkoutCheckout StartedDefault, Retail
purchaseCharged (Amount, Currency, Charged ID, Items)All
refundRefundedRetail
sign_up / loginSigned Up / Logged InAll
content_viewed, content_completed, content_shared, video_played, subscription_renewed, subscription_cancelledContent Viewed, Content Completed, Content Shared, Video Played, Subscription Renewed, Subscription CancelledMedia

Product events take their fields from the first Signal item (Product ID, Product Name, Category, Brand, Price, Quantity); Charged carries all items in Items, the only nested value CleverTap accepts. Currency is upper-case. Profile updates from identify are not sent yet (#1499).

Testing Your Integration

  1. Trigger an event on your site (e.g. complete a test order).
  2. In the CleverTap dashboard, open the user’s profile (search by the identity you sent) and confirm the event appears under Events.
  3. Inspect the raw response in Signal’s event debugger — a clean delivery returns HTTP 200 with:
{ "status": "success", "processed": 1, "unprocessed": [] }
⚠️

CleverTap returns HTTP 200 even when individual records are rejected. A status of partial or fail (with entries in unprocessed) means the event was not stored — Signal treats only status: success as a successful delivery and will surface partials as errors.

Troubleshooting

ProblemSolution
401 UnauthorizedCheck the Account ID and Passcode, and confirm the region matches the account’s data centre. A wrong region looks like bad credentials.
Events stored under a new/empty profileThe identity sent does not match the value your CleverTap SDK uses. Align both on the same email or customer ID.
status: partial / fail in the responseInspect the unprocessed array — usually a missing identity, an invalid property value (max 512 bytes), or a reserved/over-limit event name.
429 Too Many RequestsYou have exceeded the 15 concurrent requests per account limit. Reduce delivery concurrency for the integration.
Purchase revenue not showingpurchase maps to Charged with Amount; check the event carries value (or the legacy revenue).