Skip to main content
Concrete CMS → LinkedInIntegration guide

Connecting Concrete CMS to LinkedIn Ads

Concrete CMS is a self-hosted PHP CMS used by small organisations and agencies, typically with commerce added through an add-on rather than built in. LinkedIn is where B2B advertisers pay the highest cost per click in the industry, which makes an unmeasured conversion more expensive here than almost anywhere. The join between them succeeds or fails on one thing: whether the li_fat_id click identifier reaches the Concrete CMS order before the conversion happens, because LinkedIn can only match a conversion it can tie back to a click it recognizes.

Free30 minutesNo obligation

Specific to this pair

Concrete CMS lead forms to the LinkedIn Conversions API

For Concrete CMS sites selling to businesses, LinkedIn's conversion is a form-block enquiry. Write li_fat_id into a hidden field from the browser, then send the lead from a server-side submission listener with the hashed work email, sharing a browser-generated event ID if the Insight Tag also fires. Add a qualified-lead conversion from your CRM later.

Where LinkedIn makes sense on a Concrete site, the conversion is an enquiry, not an order. Agencies, professional services and membership organisations running Concrete sell to businesses and capture leads through the form block. Define the conversion in Campaign Manager as a lead, and send it from a server-side listener on the form submission rather than from a thank-you page that full page caching may serve without running your code.

Capture the li_fat_id in the browser and write it into a hidden field on the form. On a cached page, a hidden field filled by server-side template code will hold whatever value was cached, often empty, sometimes someone else's. The listener then sends the conversion with that identifier and the hashed work email. If the Insight Tag also fires a conversion on submission, the two need a shared event ID generated in the browser and submitted with the form; otherwise send from one side only.

A form fill is a weak signal at LinkedIn's prices. The better second step is a qualified-lead conversion sent once someone in your CRM marks the enquiry as real, matched on the same hashed email. Concrete stores the original entry, so that later event can be joined back without the browser. If the add-on handles consumer orders, keep those out of LinkedIn.

Concrete CMS → LinkedIn · what breaks

Why this join usually fails — Concrete CMS → LinkedIn

  1. 01

    The li_fat_id click identifier never reaches Concrete CMS

    Full page caching and the add-on ecosystem both interfere. Because commerce is an add-on rather than core, where the order is created differs by which add-on is installed.

  2. 02

    Commerce as an add-on, not a core feature

    Which add-on is installed determines the entire integration surface, so nothing transfers between two Concrete sites without checking first.

  3. 03

    Long B2B cycles against LinkedIn's windows

    LinkedIn's attribution windows are configurable and finite, while B2B deals close in quarters. A conversion that matters commercially frequently falls outside the window that LinkedIn will credit, and that gap has to be reported rather than argued about.

  4. 04

    Nothing reconciles afterwards

    Campaign Manager reports conversions against each defined conversion action with its own window. A successful API call is not a matched conversion — reconcile LinkedIn's reported conversions against your CRM for the same window, and expect a gap wherever your sales cycle exceeds the attribution setting.

Concrete CMS → LinkedIn · the fix

What working looks like — Concrete CMS → LinkedIn

  • The li_fat_id click identifier on every order

  • Conversions arriving in LinkedIn

    Conversions appear in Campaign Manager against the campaign, with the value you sent, and feed LinkedIn's optimization and its company-level reporting.

  • Reconciled against the source

Concrete CMS → LinkedIn · architecture

How Concrete CMS and LinkedIn actually connect

  1. 1

    Concrete CMS holds the truth

    Self-hosted means you own and can query the data directly, which makes reconciliation straightforward once the identifier is present.

  2. 2

    LinkedIn Ads needs a click to match

    LinkedIn matches server events on the click identifier where present and hashed user data otherwise. Conversions have to be defined in Campaign Manager before anything can be sent against them, and the definition includes the attribution window and counting rule.

  3. 3

    The identifier is the bridge

    The li_fat_id click identifier, captured at the visit and carried into the Concrete CMS order.

  4. 4

    The event source decides reliability

    Fire server-side. Page caching means the confirmation template may not execute.

  5. 5

    Deduplication at the destination

    LinkedIn deduplicates on an event identifier shared between the Insight Tag and the Conversions API. Running both without pairing them doubles every conversion, which on LinkedIn's cost per click is an expensive error to leave running.

Concrete CMS → LinkedIn · normal or broken

Working vs. broken, side by side — Concrete CMS → LinkedIn

Normal, not a fault

  • The li_fat_id click identifier present on the order

  • Sent from the order-completed event from your commerce add-on

  • Deduplicated correctly

    LinkedIn deduplicates on an event identifier shared between the Insight Tag and the Conversions API. Running both without pairing them doubles every conversion, which on LinkedIn's cost per click is an expensive error to leave running.

  • Reconciles with the source

Actually broken

  • The li_fat_id click identifier missing on most records

    Full page caching and the add-on ecosystem both interfere. Because commerce is an add-on rather than core, where the order is created differs by which add-on is installed.

  • Sent from the browser

    Which add-on is installed determines the entire integration surface, so nothing transfers between two Concrete sites without checking first.

  • Counted twice, or not at all

    LinkedIn's attribution windows are configurable and finite, while B2B deals close in quarters. A conversion that matters commercially frequently falls outside the window that LinkedIn will credit, and that gap has to be reported rather than argued about.

  • Nobody has reconciled it

Concrete CMS → LinkedIn · diagnose

Diagnostic order — Concrete CMS → LinkedIn

  1. 01

    Count orders carrying the li_fat_id click identifier

  2. 02

    Follow one real conversion end to end

  3. 03

    Identify which commerce add-on is in use

    That decides where the order is created and what events exist to hook.

  4. 04

    Confirm auto-tagging is on and the conversion is defined in Campaign Manager

    Two settings, both easy to miss, and either one missing means nothing matches.

  5. 05

    Read the match rate, not the success message

    Campaign Manager reports conversions against each defined conversion action with its own window. A successful API call is not a matched conversion — reconcile LinkedIn's reported conversions against your CRM for the same window, and expect a gap wherever your sales cycle exceeds the attribution setting.

Concrete CMS → LinkedIn · prove

How it gets proven — Concrete CMS → LinkedIn

Source of truth

Your own database's order records, at agreed states.

  • The li_fat_id click identifier confirmed present on a live order.
  • Auto-tagging confirmed enabled, the conversion defined in Campaign Manager, and deduplication verified on a real conversion.
  • Order attribute confirmed populated on a purchase through a cached page.

Concrete CMS → LinkedIn · free audit

What we check in the free audit

  • Count orders carrying the li_fat_id click identifier
  • Follow one real conversion end to end
  • Identify which commerce add-on is in use
  • Confirm auto-tagging is on and the conversion is defined in Campaign Manager
  • Read the match rate, not the success message

Checked against

Your own database's order records, at agreed states.

Get my free conversion tracking audit

Free30 minutesNo obligation

Concrete CMS → LinkedIn · when not to buy

When you don't need this — Concrete CMS → LinkedIn

  • Measure identifier coverage yourself first — pull your last hundred orders and count how many carry the li_fat_id click identifier.
  • If your Concrete site is brochure-only with enquiries by form, treat it as a lead-gen site rather than a commerce one.
  • If you are not selling to businesses, LinkedIn's cost per click is very hard to justify and no measurement work changes that arithmetic.

Concrete CMS → LinkedIn · what we deliver

What gets built — Concrete CMS → LinkedIn

  • Identifier capture into Concrete CMS

    Capture the identifier and persist it as order attribute data through an event listener, server-side.

  • Event source: the order-completed event from your commerce add-on

    Fire server-side. Page caching means the confirmation template may not execute.

  • Dispatch to LinkedIn

    Server events to the LinkedIn Conversions API with the click identifier, hashed user data and a matched event identifier.

  • Reversals where they exist

    Order state changes recorded by the add-on.

Written guarantee

95%+ tracking accuracy

Measured against Your own database's order records, at agreed states.. Miss it and we keep working at no cost.

Get my free conversion tracking audit

From $400 · See packages

FAQ

Concrete CMS → LinkedIn questions, answered

Hook the form submission server-side and post to the LinkedIn Conversions API with the hashed email and the li_fat_id captured in a browser-filled hidden field.

Free · 30 min

Get Concrete CMS and LinkedIn joined properly

Free30 minutesNo obligation