Skip to main content
Concrete CMS → Microsoft AdsIntegration guide

Connecting Concrete CMS to Microsoft 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. Microsoft Ads reaches an older, higher-income, more desktop-weighted audience than Google, and it is routinely the cheapest qualified traffic a B2B advertiser can buy. The join between them succeeds or fails on one thing: whether the MSCLKID reaches the Concrete CMS order before the conversion happens, because Microsoft Ads can only match a conversion it can tie back to a click it recognizes.

Free30 minutesNo obligation

Specific to this pair

Concrete CMS to Microsoft Ads offline conversions with the msclkid

Capture msclkid in the browser into a first-party cookie, since cached Concrete CMS pages may skip server code, and save it on the order or form entry. A scheduled job on your server can then upload offline conversions through file import or the Microsoft Advertising API: enquiries at modest value, paid outcomes for bidding once volume allows.

Self-hosting is the advantage here. Once the msclkid is stored against the order or form entry, a scheduled job on the same server can query the database and produce Microsoft's offline conversion upload directly, with no middleware. Check whether Microsoft's scheduled import from a file URL suits you, or push through the Microsoft Advertising API. Either way the goal has to exist as an offline conversion type before the first row will match.

The capture step is where Concrete sites lose clicks. Check whether your full page cache keys on the query string: if a cached copy is served for URLs carrying ?msclkid=, any server-side code that would read the parameter never runs. Capture it in the browser, write a first-party cookie, and have the add-on's order event or the form listener read that cookie when the record is created.

Many Concrete sites are lead generation for local organisations and professional services, which suits Microsoft's older, desktop-heavy searchers. Send two goals: the enquiry at a modest value, and the signed or paid outcome when it happens, matched to the same msclkid. Only the second should drive bidding once you have enough of them; until then, bid on the enquiry and report the outcome.

Concrete CMS → Microsoft Ads · what breaks

Why this join usually fails — Concrete CMS → Microsoft Ads

  1. 01

    The MSCLKID 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

    Auto-tagging switched off

    Microsoft auto-tagging is frequently disabled in accounts that were set up quickly or imported from Google, and without it no MSCLKID arrives at all — so the entire offline import has nothing to match against and fails silently.

  4. 04

    Nothing reconciles afterwards

    Microsoft Ads reports offline conversion uploads with rows accepted and rejected. A successful upload is not a matched conversion — check that conversions actually appear against campaigns afterwards.

Concrete CMS → Microsoft Ads · the fix

What working looks like — Concrete CMS → Microsoft Ads

  • The MSCLKID on every order

  • Conversions arriving in Microsoft Ads

    Conversions appear against the campaign, ad group and keyword that produced the click, with the value you sent, and become usable for automated bidding.

  • Reconciled against the source

Concrete CMS → Microsoft Ads · architecture

How Concrete CMS and Microsoft Ads 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

    Microsoft Ads needs a click to match

    Microsoft matches uploaded conversions to clicks using the MSCLKID, and the conversion goal must be created as an offline conversion type. The click has to fall inside Microsoft's import window — verify the current limit in your account rather than assuming it matches Google's.

  3. 3

    The identifier is the bridge

    The MSCLKID, 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

    Microsoft deduplicates on the combination of click identifier, conversion name and conversion time. Uploading the same click against a second conversion goal counts twice, which is the usual cause of inflated numbers here.

Concrete CMS → Microsoft Ads · normal or broken

Working vs. broken, side by side — Concrete CMS → Microsoft Ads

Normal, not a fault

  • The MSCLKID present on the order

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

  • Deduplicated correctly

    Microsoft deduplicates on the combination of click identifier, conversion name and conversion time. Uploading the same click against a second conversion goal counts twice, which is the usual cause of inflated numbers here.

  • Reconciles with the source

Actually broken

  • The MSCLKID 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

    Microsoft auto-tagging is frequently disabled in accounts that were set up quickly or imported from Google, and without it no MSCLKID arrives at all — so the entire offline import has nothing to match against and fails silently.

  • Nobody has reconciled it

Concrete CMS → Microsoft Ads · diagnose

Diagnostic order — Concrete CMS → Microsoft Ads

  1. 01

    Count orders carrying the MSCLKID

  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 enabled and check the upload diagnostics

    One account setting decides whether any of this works. Then read the per-row errors on the upload rather than the success count.

  5. 05

    Read the match rate, not the success message

    Microsoft Ads reports offline conversion uploads with rows accepted and rejected. A successful upload is not a matched conversion — check that conversions actually appear against campaigns afterwards.

Concrete CMS → Microsoft Ads · prove

How it gets proven — Concrete CMS → Microsoft Ads

Source of truth

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

  • The MSCLKID confirmed present on a live order.
  • Auto-tagging confirmed on, and the accepted count reconciled against conversions appearing in campaign reporting.
  • Order attribute confirmed populated on a purchase through a cached page.

Concrete CMS → Microsoft Ads · free audit

What we check in the free audit

  • Count orders carrying the MSCLKID
  • Follow one real conversion end to end
  • Identify which commerce add-on is in use
  • Confirm auto-tagging is enabled and check the upload diagnostics
  • 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 → Microsoft Ads · when not to buy

When you don't need this — Concrete CMS → Microsoft Ads

  • Measure identifier coverage yourself first — pull your last hundred orders and count how many carry the MSCLKID.
  • 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 running Microsoft Ads at meaningful spend, skip it — though for B2B the traffic is often cheaper and better qualified than people expect, which is worth testing before dismissing.

Concrete CMS → Microsoft Ads · what we deliver

What gets built — Concrete CMS → Microsoft Ads

  • 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 Microsoft Ads

    Offline conversion import through the Microsoft Advertising API or a scheduled upload.

  • 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 → Microsoft Ads questions, answered

Store the msclkid on the order, then upload a scheduled file or API batch of orders against an offline conversion goal. A cron job on your server can build it straight from the database.

Free · 30 min

Get Concrete CMS and Microsoft Ads joined properly

Free30 minutesNo obligation