Marin Software
Datafly Signal delivers conversions to Marin Software server-to-server using the Marin Tracker conversion endpoint (tracker.marinsm.com/tp). Marin uses these conversions to attribute revenue across your paid-search and social channels and to feed publisher optimisation. Because delivery happens from your server, conversions are not lost to ad blockers or browser tracking prevention.
Marin Tracker is a click-and-conversion system. The ad click (action type 1) is still captured first-party on your landing page by your existing Marin Tracker snippet. Signal sends only the conversion (action type 2) and forwards the Marin UUID so Marin can stitch the two together.
Prerequisites
Before configuring Marin in Signal you need:
- An active Marin Tracker deployment on your site (the click-capture snippet on your landing pages). This sets the first-party
_msuuidcookie that links clicks to conversions. - Your Client Tracking ID (
cid) — the static alphanumeric value unique to your Marin account. It appears in your Marin Tracker snippet path (tracker.marinsm.com/tracker/async/<CLIENT-TRACKING-ID>.js). If you can’t find it, ask your Marin platform representative. - The Conversion Type ID (
convType) you want conversions recorded against. This is configured in Marin and is case-sensitive.
Step 1: Confirm the click snippet is live
Load a landing page and confirm in your browser’s developer tools that:
- The Marin async tracker script loads from
tracker.marinsm.com. - A first-party
_msuuidcookie is set. - A request to
tracker.marinsm.com/tpwithact=1fires (the click).
Step 2: Note your Client Tracking ID and Conversion Type ID
Record the cid value and the exact convType string. You will enter both in Signal.
Configure in Signal
Configuration Fields
| Field | Required | Description |
|---|---|---|
client_tracking_id | Yes | Your Marin client tracking ID (cid). The static alphanumeric value unique to your Marin account. |
conv_type_id | Yes | The Marin conversion type ID (convType) for your conversions. Case-sensitive; must match a conversion type configured in Marin. |
Management UI Setup
Add the integration
Go to Integrations > Add Integration > Marin Software.
Choose the preset
Select the Default preset. It delivers Order Completed (and Lead Generated) as Marin conversions.
Enter your configuration
Enter your client_tracking_id and conv_type_id.
Select consent categories
Select the consent categories that govern advertising/attribution (typically marketing or advertising). Conversions are only delivered when the visitor has granted the matching consent.
Save
Click Save.
API Endpoint
Signal delivers each conversion as a single HTTP GET to the Marin Tracker pixel:
GET https://tracker.marinsm.com/tp?act=2&cid={client_tracking_id}¤cy={currency}&trans={trans}&mu={uuid}| Parameter | Description |
|---|---|
act | Action type. Always 2 for a conversion. |
cid | Your Marin client tracking ID. |
currency | ISO currency code of the conversion (e.g. GBP). |
trans | Pipe-delimited transaction string (see Event Mapping). |
mu | The Marin UUID (_msuuid) that stitches this conversion to the originating click. |
The visitor’s IP address and User-Agent are forwarded as request headers (X-Forwarded-For, User-Agent) so Marin attributes the conversion to the real end user rather than to your server.
Identity Signals
Marin matches a conversion to its originating ad click using a single deterministic signal:
| Signal | Source | Description |
|---|---|---|
_msuuid (UUID) | First-party cookie | Set by the Marin click snippet on the landing page. Datafly.js reads it and Signal forwards it as the mu parameter. This is what links the conversion (action 2) to the click (action 1). |
| IP + User-Agent | Forwarded request headers | Help Marin attribute and de-duplicate the conversion. |
The Marin click snippet must be live on your landing pages, or there will be no _msuuid cookie to forward and conversions cannot be stitched to a click. Signal does not capture clicks.
Marin does not require hashed PII (email/phone) for this conversion endpoint — matching is based on the click UUID, so no personal data leaves your infrastructure for this integration.
Event Mapping
Only conversion events are sent to Marin. Page views and other engagement events are dropped (Marin captures the click first-party).
| Signal event | Marin action | Notes |
|---|---|---|
Order Completed | act=2 conversion | Revenue + line items become the trans string. |
Lead Generated | act=2 conversion | Lead value (optional) becomes the trans string. |
page | (dropped) | Not sent; clicks are captured first-party. |
The trans string
Signal builds Marin’s pipe-delimited transaction string from the event properties. It has one transaction (UTM:T) row followed by one item (UTM:I) row per product, separated by a newline:
UTM:T|<order-id>|<affiliation>|<total>|<tax>|<shipping>|<city>|<state>|<country>
UTM:I|<order-id>|<conv-type-id>|<product>|<category>|<price>|<quantity>Example: Purchase conversion
Datafly.js call:
datafly.track("Order Completed", {
order_id: "ORD-001",
revenue: 129.99,
currency: "GBP",
tax: 21.66,
shipping: 4.99,
products: [
{ product_id: "SKU-A", name: "Widget", category: "Tools", price: 49.99, quantity: 2 },
{ product_id: "SKU-B", name: "Gadget", category: "Tools", price: 30.01, quantity: 1 }
]
});Request Signal sends to Marin (query parameters shown decoded for readability):
GET https://tracker.marinsm.com/tp
?act=2
&cid=abc123def456
¤cy=GBP
&mu=2f1c9a4e-7b3d-4a10-9c52-1e8f6b0a7d33
&trans=UTM:T|ORD-001||129.99|21.66|4.99|||
UTM:I|ORD-001|Purchase|Widget|Tools|49.99|2
UTM:I|ORD-001|Purchase|Gadget|Tools|30.01|1(The newlines in trans are URL-encoded as %0A, and Purchase is your configured conv_type_id.)
Testing Your Integration
Fire a test click
Visit one of your landing pages so the Marin snippet sets the _msuuid cookie and records an act=1 click.
Trigger a conversion
Complete a test purchase (or fire datafly.track("Order Completed", { ... })) on the same browser session so Signal delivers an act=2 conversion carrying the same UUID.
Check Signal’s event debugger
In the Management UI, open the Event Debugger for the integration and confirm the outbound GET to tracker.marinsm.com/tp returns 200 and contains the expected cid, currency, trans and mu values.
Verify in Marin
In Marin, open the conversion / tracking report and confirm both an Action ID 1 (click) and an Action ID 2 (conversion) row appear for the same UUID, with the correct revenue.
Troubleshooting
| Problem | Solution |
|---|---|
| Conversion not appearing in Marin | Confirm the cid is correct and the act=2 request returns 200 in Signal’s event debugger. |
| Conversion has no matching click (orphaned) | The _msuuid cookie was missing — confirm the Marin click snippet is live on your landing pages and that the conversion happened in the same browser as the click. |
| Wrong / zero revenue | Check the revenue and currency properties on the Order Completed event; verify the trans string in the event debugger. |
| Conversion recorded under the wrong type | The conv_type_id (convType) is case-sensitive — make it match exactly the conversion type configured in Marin. |
400 responses | Malformed query string — inspect the trans value for stray ` |
Limitations
- Marin Tracker has no JSON ingestion or batch conversion API — delivery is one HTTP
GETper conversion to the pixel endpoint, so this integration does not batch. - Clicks are captured first-party, not by Signal. The Marin click snippet must remain on your landing pages.
- For bulk offline conversions (e.g. CRM-sourced sales matched by order ID), Marin’s file-based Offline Connect / Revenue Upload is the appropriate path — that is a separate workflow from this real-time conversion integration.