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
- Sign in to the CleverTap dashboard.
- Go to Settings > Engagement > A/c Info (Account Info).
- 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 code | Data centre |
|---|---|
us1 | United States |
in1 | India |
eu1 | Europe |
sg1 | Singapore |
aps3 | Asia-Pacific |
mec1 | Middle 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
| Field | Required | Description |
|---|---|---|
account_id | Yes | Your CleverTap Account ID (Project ID). Sent as the X-CleverTap-Account-Id header. |
passcode | Yes | Your CleverTap Account Passcode. Sent as the X-CleverTap-Passcode header. |
region | Yes | Your account’s data region: one of us1, in1, eu1, sg1, aps3, mec1. Sets the API host. |
Management UI Setup
- Go to Integrations > Add Integration > CleverTap.
- Choose the Default preset.
- Enter your
account_id,passcode, andregion. - Select consent categories (typically
marketing). - Click Save.
API Endpoint
POST https://{region}.api.clevertap.com/1/uploadRequired headers:
X-CleverTap-Account-Id: {account_id}
X-CleverTap-Passcode: {passcode}
Content-Type: application/json; charset=utf-8Events 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 event | CleverTap evtName | Preset |
|---|---|---|
page | Web Page Viewed | Default |
search | Searched | All |
view_item_list | Category Viewed | Retail |
view_item | Product Viewed | Default, Retail |
add_to_wishlist | Added to Wishlist | Default, Retail |
add_to_cart / remove_from_cart | Added to Cart / Removed from Cart | Default, Retail / Retail |
view_cart | Cart Viewed | Retail |
begin_checkout | Checkout Started | Default, Retail |
purchase | Charged (Amount, Currency, Charged ID, Items) | All |
refund | Refunded | Retail |
sign_up / login | Signed Up / Logged In | All |
content_viewed, content_completed, content_shared, video_played, subscription_renewed, subscription_cancelled | Content Viewed, Content Completed, Content Shared, Video Played, Subscription Renewed, Subscription Cancelled | Media |
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
- Trigger an event on your site (e.g. complete a test order).
- In the CleverTap dashboard, open the user’s profile (search by the
identityyou sent) and confirm the event appears under Events. - 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
| Problem | Solution |
|---|---|
401 Unauthorized | Check 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 profile | The 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 response | Inspect the unprocessed array — usually a missing identity, an invalid property value (max 512 bytes), or a reserved/over-limit event name. |
429 Too Many Requests | You have exceeded the 15 concurrent requests per account limit. Reduce delivery concurrency for the integration. |
| Purchase revenue not showing | purchase maps to Charged with Amount; check the event carries value (or the legacy revenue). |