Mapp
Datafly Signal delivers events to Mapp Engage server-to-server using the Mapp Connect Integration Event API: abandoned-cart and wishlist entries, orders in the Transactions eCommerce table and (retail preset) Product Catalog updates. Each cart, wishlist or order event is matched to an Engage contact by email or mobile number and drives segmentation, Whiteboard automations and personalised messaging.
Because delivery happens from your own Signal endpoint, no Mapp pixel or browser SDK is required, and the events are not affected by ad blockers or third-party cookie restrictions.
Why route Mapp through Datafly Signal
- Profiles are updated from the server, not the browser. Events reach Mapp even when a tracker blocker or a failed page unload would have dropped a client-side call, so the profile reflects what actually happened.
- One consent decision governs every destination. Mapp is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Prerequisites
- A Mapp Engage account with API access enabled.
- A system user with the API or Hybrid role (Administration > Users). HTTP Basic authentication uses this user’s email and password.
- An Integration created in Engage (Administration > Integrations). Note its numeric Integration ID.
- Your Engage host — the host portion of your login URL (for example, if you log in at
https://email.acme.mapp.com/home/login.jsp, the host isemail.acme). - The contacts you reference must already exist in Engage. An event for an unknown contact is silently not saved, so pair this with your existing contact-import or registration flow.
Configuration
Collect the following before configuring Signal:
| Field | Where to find it |
|---|---|
| Engage Host | The host of your Engage login URL, without .mapp.com (e.g. email.acme). |
| Integration ID | Administration > Integrations — the numeric ID of your integration. |
| API User Email | The email of your API/Hybrid system user. |
| API User Password | That user’s password. |
Configure in Signal
- In the management UI, open Integrations and add Mapp.
- Enter the Engage Host, Integration ID, API User Email, and API User Password.
- Select the Default preset and attach it to your pipeline.
- Map your Signal events to the Mapp product fields (see Event Mapping).
- Save and enable the integration.
API Endpoint
Signal sends a POST request per event to the Engage Integration Event API:
POST https://{host}.mapp.com/api/rest/v19/integration/{integration_id}/event?subtype={subtype}Authentication is HTTP Basic. Signal builds the Authorization header by Base64-encoding {api_user}:{api_password}:
Authorization: Basic <base64(api_user:api_password)>
Content-Type: application/jsonThe subtype query parameter selects what Mapp stores: abandonedCart and wishlist (cart and wishlist events, deleted again with "delete": "true"), transaction (orders) and product (Product Catalog, retail preset). The request body is flat JSON; map the same field names in the Mapp Connect integration’s mappings. A Mapp login on a vanity domain is not supported yet (#1484).
Identity Signals
Server-side e-commerce events for Mapp Engage through the Mapp Connect Integration Event API: abandoned-cart and wishlist entries (abandonedCart and wishlist subtypes, removed again on remove_from_cart / remove_from_wishlist) and orders in the Transactions eCommerce table (transaction subtype), keyed to the Engage contact by email (plain text, trimmed and lowercased: Mapp matches the contact on the address and has no hashed key) or mobile number (E.164); the retail preset also keeps the Product Catalog current from view_item. Events with neither identifier are not sent.
| Field | Source | Notes |
|---|---|---|
email | traits.email | Plain text, trimmed and lowercased. Mapp matches the Engage contact on it and has no hashed key. |
mobileNumber | traits.phone | E.164. Used when there is no email match. |
userId | not sent | In Mapp this is the Engage Contact ID and is matched first; the Signal user ID must not fill it. |
Event Mapping
Blueprint 0.3.0, reviewed against the vendor’s documentation on 2026-09-23. Each preset maps the events below; every other event is dropped. Events use the canonical names from the event specs (transaction_id, value, items[], search_term); the legacy order_id, revenue and flat product fields are still read as a fallback.
Default (default)
Abandoned cart and wishlist entries (Mapp Connect abandonedCart and wishlist subtypes, deleted again on remove_from_cart / remove_from_wishlist) and orders in the Transactions eCommerce table (transaction subtype), each keyed to an existing Engage contact by email or mobile number. Map the same field names in the Mapp Connect integration’s mappings; an event for an unknown contact is not saved by Mapp (a transaction creates the contact).
| Datafly event | Vendor event / call | Fields |
|---|---|---|
add_to_cart | abandonedCart (abandoned_cart) | sku, createdAt, price, size |
remove_from_cart | abandonedCart (abandoned_cart) | sku, delete |
add_to_wishlist | wishlist (wishlist) | sku, createdAt, price, size |
remove_from_wishlist | wishlist (wishlist) | sku, delete |
purchase | transaction (transaction) | orderId, transaction_date, currency, items |
Retail / E-commerce (ecommerce)
Everything in the default preset, plus view_item keeping the Engage Product Catalog current (product subtype: SKU, name, price, URL, category in customAttribute1, brand in customAttribute2). The abandoned cart, wishlist and browse tables need each product in the Product Catalog. The catalogue call carries no contact identifier.
| Datafly event | Vendor event / call | Fields |
|---|---|---|
view_item | product | productSKU, productName, productPrice, productURL, customAttribute1, customAttribute2 |
add_to_cart | abandonedCart (abandoned_cart) | sku, createdAt, price, size |
remove_from_cart | abandonedCart (abandoned_cart) | sku, delete |
add_to_wishlist | wishlist (wishlist) | sku, createdAt, price, size |
remove_from_wishlist | wishlist (wishlist) | sku, delete |
purchase | transaction (transaction) | orderId, transaction_date, currency, items |
An identified purchase (preset default) is delivered as:
POST https://email.acme.mapp.com/api/rest/v19/integration/123456/event?subtype=transaction{
"currency": "GBP",
"email": "jane.doe@example.com",
"items": [
{
"name": "Helmet",
"price": 120,
"qty_ordered": 2,
"sku": "SKU_1"
},
{
"name": "Gloves",
"price": 199.99,
"qty_ordered": 1,
"sku": "SKU_2"
}
],
"mobileNumber": "+447700900123",
"orderId": "T-1001",
"transaction_date": "2025-09-23T04:00:00Z"
}Testing
- Send a test event from a page running Datafly.js, or replay one from the Event Debugger.
- Confirm Signal records a
2xxresponse from Mapp for the delivery. - In Engage, open the contact you targeted and verify the product event appears in their activity / behavioural data.
- If you have a Whiteboard automation listening for the integration event, confirm it triggers.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
401 Unauthorized | Wrong API user email/password, or the Basic header is missing. | Re-enter the credentials; confirm the user can log in. |
403 Forbidden | The system user lacks the API or Hybrid role. | Grant the API or Hybrid role in Administration > Users. |
404 Not Found | Wrong host or unknown Integration ID. | Re-check the host (login URL) and the numeric Integration ID. |
400 Bad Request | Missing identifier, or malformed JSON. | Ensure at least one of email / userId / mobileNumber is mapped. |
2xx but no data in Engage | The contact does not exist. | Events for unknown contacts are not saved — import or register the contact first. |
For full API reference see the Mapp Engage API documentation and Getting Started with Engage API.