Ortto
Datafly Signal delivers your first-party events to Ortto server-side using the Custom Activity API. Each event upserts the person in Ortto (matched by email, with phone as a fallback) and records a timestamped custom activity against them, ready to drive journeys, segments, and reports.
Because delivery is server-to-server, no Ortto tracking pixel runs in the browser, and identity fields are sent from your own first-party data rather than scraped client-side.
Prerequisites
- An Ortto account with the Custom Activity API available on your plan.
- A custom (private) API key with activity write access. Create one in Ortto under Settings → API keys. This is not the public tracking-code key.
- One or more custom activity definitions created in Ortto (Activities → New activity). Each definition has an activity ID in the form
act:cm:<slug>(for exampleact:cm:order-completed). You will map your Signal events to these IDs. - Your Ortto instance region, which determines the API host (see below).
Configuration
| Field | Required | Description |
|---|---|---|
| Custom API Key | Yes | Ortto custom API key, sent in the X-Api-Key header. |
| API Host (region) | Yes | api.ap3api.com (default), api.au.ap3api.com (Australia), or api.eu.ap3api.com (Europe). |
| Merge Strategy | No | How to update an existing person: 1 append only, 2 overwrite existing (recommended), 3 ignore. Defaults to 2. |
Pick the host that matches the region your Ortto instance is pinned to. A mismatched region returns 401 or 404.
Configure in Signal
- In the Signal management UI, go to Integrations and add Ortto.
- Paste your Custom API Key and select the API Host for your region.
- Choose a preset (Retail or B2B / SaaS) or start from the default mapping.
- For each event in the preset, set vendor event name to the matching Ortto activity ID (
act:cm:<slug>) from your Ortto activity definitions. - Attach the integration to your pipeline and publish.
API Endpoint
POST https://api.ap3api.com/v1/activities/create
X-Api-Key: <your-custom-api-key>
Content-Type: application/jsonAustralia and Europe instances use api.au.ap3api.com and api.eu.ap3api.com respectively.
Identity Signals
Ortto creates or matches the person from the fields listed in merge_by:
- Email (
str::email) is the primary match key. - Phone (
phone::number, normalised to E.164) can be used as a fallback.
Email and phone are sent in plaintext: Ortto is a first-party customer-data platform and stores these directly, so no hashing is applied. Marketing consent (from your CMP, via Signal’s canonical consent category) is mapped to Ortto’s email-permission flag bol::p so opt-out states are respected on the person record. The visitor IP is sent as location.source_ip for Ortto’s geo enrichment.
Event Mapping
A Datafly.js purchase event:
datafly.track("Order Completed", {
order_id: "ORD-4821",
revenue: 153.00,
currency: "GBP",
coupon: "SUMMER10"
});with identity traits already set:
datafly.identify({
email: "billie.holiday@email.com",
first_name: "Billie",
last_name: "Holiday"
});is delivered to Ortto as:
{
"activities": [
{
"activity_id": "act:cm:order-completed",
"fields": {
"str::email": "billie.holiday@email.com",
"str::first": "Billie",
"str::last": "Holiday",
"bol::p": true
},
"attributes": {
"str:cm:order-id": "ORD-4821",
"int::v": 15300,
"str:cm:currency": "GBP",
"str:cm:coupon": "SUMMER10"
},
"location": { "source_ip": "203.0.113.7" }
}
],
"merge_by": ["str::email"],
"merge_strategy": 2
}Note that monetary value is sent to Ortto’s int::v field in cents (153.00 becomes 15300).
Event names follow Signal’s GA4-style snake_case convention (page, Product Viewed, Order Completed, Signed Up). Events not present in your mapping are dropped by default.
Testing
- Send a test event from a page running Datafly.js (or use the management UI Event Debugger).
- In Ortto, open People, find the person by email, and confirm the activity appears on their Activity timeline.
- Confirm the activity attributes (order ID, value, currency) are populated as expected.
- A successful call returns
200. A400usually means an unknownactivity_idor a missing required field;401/403indicate a bad or under-scoped key, or the wrong region host.
Troubleshooting
401/403— the API key is invalid, lacks activity write access, or you selected the wrong region host. Verify the key in Settings → API keys and confirm the host matches your instance region.400unknown activity — theactivity_idin your event mapping does not exist in Ortto. Create the activity definition first, then copy itsact:cm:<slug>ID into the mapping.- Person not matched — confirm the email trait is set before the event fires and that
merge_byisstr::email. Without a match key, Ortto cannot attach the activity to a person. - Activity missing despite a
200— Ortto limits activities to 50 per activity per contact per 24 hours. High-frequency events (such as page views) on a single contact can hit this cap; map noisy events sparingly. - Wrong currency amount —
int::vexpects an integer in cents. Make sure your value mapping multiplies by 100.