Overview
Injection of transactional data allows you to store order and purchase information in Mapp Engage. The injected data is saved as System Transactions and can be used for segmentation, automations, and personalization.
Transactional data can be stored independently or stored and sent together with a transactional email, for example, for order confirmations or shipping notifications.
Navigation Path
Administration > E-commerce > System Transactions
Injection Behavior
Multiple injection methods: transactional data can be injected via Mapp Connect integrations, automated imports, manual uploads, or REST API calls.
Optional email sendout: data can be stored without sending a message or stored and sent together with a transactional email.
Contact-based storage: transactions are stored only for existing contacts, unless using Mapp Connect, which can automatically create contacts.
Whiteboard event: transactions added by an automated or manual import do not trigger the Transaction Registered event in Whiteboard. Transactions from all other sources trigger it.
Reusable data: stored transactions remain available for segmentation, automations, and message personalization.
Injection Methods
Mapp Connect Integration
Mapp Connect supports automatic injection of transactional data from connected e-commerce platforms, including:
Magento (Adobe Commerce)
Shopware
Shopify
WooCommerce (via Zapier)
Other platforms are integrated via Zapier using an order event
When transactional data is injected via Mapp Connect, contacts that do not yet exist in the system are created automatically.
For details, see Mapp Connect Basics.
Automated Imports
Transactional data can be imported using scheduled automated jobs. These jobs are configured in the Whiteboard interface and allow recurring imports without manual intervention.
For details, see Import/Export.
Manual Import
Transactional data can also be imported manually.
Navigate to Administration > E-commerce > System Transactions.
Use the provided sample file to upload transaction records.
For details, see Manual Import & Search of eCommerce Data.
API-Based Data Injection
Transactional data can be injected via the REST API. Two different scenarios are supported.
Storing Transactional Data Without Email Sendout
Transactional data can be stored without sending a message. The following applies:
The contact is identified by its email address in the query parameter
userEmail.The request body contains a
transactionItemsarray with one entry per product. Send all values as strings.Each item requires the fields
orderId,timestamp,productSKU,productName,productPrice, andproductQuantity. You can add optional fields, such ascurrency, and up to five custom fields,customDetail1tocustomDetail5. For all fields, see System Transactions.
Endpoint: POST /ecommerce/registerTransaction
Example request:
POST /ecommerce/registerTransaction?userEmail=user@example.com
{
"transactionItems": [
{
"orderId": "1234567890",
"timestamp": "2026-01-01T12:00:00",
"productSKU": "XXX-123-ABC",
"productName": "Bicycle",
"productPrice": "150.00",
"productQuantity": "1",
"currency": "EUR"
}
]
}This method is typically used when transactional data is required for segmentation or later automation, but no immediate message should be sent.
Storing Transactional Data With Email Sendout
The request sends a prepared message to one contact and passes the order data to the message. Optionally, the same request stores the order data as system transactions.
Endpoint: POST /message/sendTransactionalWithEventDetails. For details, see this endpoint in the API documentation.
The request uses the following query parameters:
messageId: ID of the prepared messagerecipientId: ID of the contactexternalTransactionFormula: optional. Your transactional message ID (TMID), if your system creates it. Whether you pass a TMID depends on the Transactional Message Mode of the group. For details, see Sending Transactional Messages (API).
In the request body, parameters contains order-level data, such as the order total. eventDetails contains one entry per product, each with a list of itemDetails. Use the same structure for every product. Names are case-sensitive, for example eventDetails, not eventdetails.
By default, the request only sends the message. To also store the products as system transactions, add "transaction": true to the request body. Each itemDetails entry must then use the field names of System Transactions, for example orderId, timestamp, productSKU, productName, productPrice, and productQuantity. Without "transaction": true, you can use any names.
Example request that only sends the message and matches the template below:
POST /message/sendTransactionalWithEventDetails?messageId=12345&recipientId=67890&externalTransactionFormula=ORDER-1234567890
{
"parameters": [
{ "name": "billingAddress", "value": "Jane Miller, Main Street 1, 10115 Berlin" },
{ "name": "shippingAddress", "value": "Jane Miller, Main Street 1, 10115 Berlin" },
{ "name": "orderTotal", "value": "210.00" },
{ "name": "currency", "value": "EUR" }
],
"eventDetails": [
{
"itemDetails": [
{ "name": "productName", "value": "Chair C1" },
{ "name": "brand", "value": "Brand A" },
{ "name": "productPrice", "value": "60.00" },
{ "name": "productQuantity", "value": "1" },
{ "name": "productURL", "value": "https://www.example.com/chair-c1" },
{ "name": "imageURL", "value": "https://www.example.com/images/chair-c1.png" }
]
},
{
"itemDetails": [
{ "name": "productName", "value": "Table T1" },
{ "name": "brand", "value": "Brand B" },
{ "name": "productPrice", "value": "150.00" },
{ "name": "productQuantity", "value": "1" },
{ "name": "productURL", "value": "https://www.example.com/table-t1" },
{ "name": "imageURL", "value": "https://www.example.com/images/table-t1.png" }
]
}
]
}Warning
This request adds the contact to the group of the prepared message if the contact is not a member yet. This can subscribe or re-subscribe contacts unexpectedly. For details, see Contact unexpectedly added to the group after being sent a prepared or transactional message.
This approach is commonly used for order confirmations, shipping notifications, or payment confirmations.
Transactional Email Usage
When transactional data is injected alongside an email sendout, it becomes available in the email template.
Order-level data is accessed via parameters, such as
parameter.orderTotal.Product-level data is accessed with a
ForEachloop over${eventDetails}. Inside the loop, you access each value by its name, for example${product['productName']}. The name of the loop variable (productin the template below) is up to you.The
maxattribute limits the number of products shown. If the request contains more products, the first ones up to the limit are shown and the rest are ignored.
Example Transactional Email Template
<html>
<body>
<p>Dear <%user.firstname%> <%user.lastname%>,</p>
<p>Thank you for shopping with us! Please find your order details below:</p>
<table width="100%" cellpadding="10" cellspacing="0" border="0">
<tr>
<td valign="top">
<h3>Billing Information</h3>
<p><%parameter.billingAddress%></p>
</td>
<td valign="top">
<h3>Shipping Information</h3>
<p><%parameter.shippingAddress%></p>
</td>
</tr>
</table>
<%ForEach var="product" items="${eventDetails}" max="50"%>
<table width="100%" cellpadding="10" cellspacing="0" border="0">
<tr>
<td align="center">
<a href="<%${product['productURL']}%>">
<img src="<%${product['imageURL']}%>" width="280" />
</a>
<p><strong><%${product['brand']}%></strong></p>
<p><%${product['productName']}%></p>
<p>
Quantity: <%${product['productQuantity']}%>,
Price: <%${product['productPrice']}%>
</p>
</td>
</tr>
</table>
<%/ForEach%>
<h2>Total: <%parameter.orderTotal%> <%parameter.currency%></h2>
<p>Best regards,<br>The [Your Company Name] Team</p>
</body>
</html>The recipient receives a personalized transactional email displaying billing and shipping information, a list of purchased products, and the total order value.