By Unwired Logic - a Storeganise marketplace add-on for Google Ads and Meta conversion tracking
Last updated: 25 August 2026, 00:25 UTC
Works with: Storeganise booking engine, marketing website, Google Ads, Meta Ads
About This Application
Google + Meta Ads Conversion Tracking is a Storeganise marketplace add-on for self-storage operators. Its purpose is to measure how well an operator's advertising performs: when someone clicks a Google Ads or Meta ad, lands on the operator's Storeganise booking website, and goes on to reserve or move into a storage unit, this Add-on reports that booking back to Google Ads and Meta as a conversion. This lets the ad platforms optimise the operator's campaigns toward real bookings and move-ins rather than just clicks.
For Google, the operator adds Unwired Logic's service account - a machine user - to their own Google Ads account. There is no Google Cloud project to set up and no key file to handle. That access is used only to upload these conversions - never to read campaigns or change settings. See What It Does below, and the FAQs for what data is sent and how it is protected.
Contents
How It Works
You run Google and Meta ads and take bookings on your Storeganise site - but the ad platforms only ever see the click. They never learn which clicks became real customers, so they keep optimising for cheap inquiries instead of signed leases.
This Add-on follows the journey from ad click through to reservation and move-in, and sends those real outcomes back to Google and Meta. Storeganise stays the single source of truth - there is no CRM to buy or maintain. Each stage of the booking journey maps to a signal the ad platforms understand (this is the starting model; you can change the mapping per account):
| Storeganise data | What it means | Sent back to ads as |
| Lead | Someone started a booking but didn't finish - our earliest real-intent signal | Lead |
| Move-in created | A unit gets reserved (the native Storeganise status, kept as-is) and value of booking | Reservation & Basket Size |
| Move-in started | The lease starts and value of the unit booked | Sale & Basket Size |
| Move-in completed | When customer moved in | Customer moved in & Basket Size |
What It Does
- Recognises a visitor from their first ad click and remembers them through the whole journey - visit, waitlist signup, reservation, move-in.
- Picks the outcome up from Storeganise, including the unit's value, and sends it back to Google and Meta so your ads learn which clicks become customers.
- Optimises for move-ins, not clicks - your budget chases signed leases and bigger units rather than cheap inquiries.
- Lets you map each Storeganise stage to your own Google Ads conversion actions and Meta events, and change that mapping whenever you want.
Instructions
About an hour end to end, in four parts:
- Storeganise - install the Add-on (step 1) and set your currency (step 3). A few minutes.
- Google Tag Manager - three tags on your booking site so the Add-on knows which ad each customer came from (step 2, then GTM Setup). About 30 minutes, and the part that needs the most care.
- Google Ads / Meta - grant access and create the conversion actions you want to fire (see Google Ads and Meta prerequisites). About 20 minutes.
- Back in Storeganise - paste the IDs, map the events, run a test booking (steps 4-6). About 10 minutes.
Enable Google, Meta, or both - any field you leave blank is simply skipped.
1. Install the Add-on
Install Google + Meta Ads Conversion Tracking from the Storeganise marketplace. Once installed, its settings appear under the Add-on's configuration in Storeganise admin.
2. Set Up Ad-Attribution Capture on Your Booking Site
The Add-on needs to know which ad each customer came from. Google Tag Manager (GTM) reads the ad parameters (utm_*, gclid, gbraid, wbraid, fbclid) from the landing URL and passes them to Storeganise.
- Storeganise-hosted booking site: follow the GTM Setup section below to install three small GTM tags (attribution cookie, waitlist capture, booking capture). Takes about 30 minutes.
- Your own booking site: contact support@unwiredlogic.com and we'll help wire up the capture.
3. Set Your Currency
Set Ads Currency Code (ISO 4217) to the currency your prices are in, e.g. HKD, USD, JPY. This is used whenever an action sends the booking value back to the ad platform.
4. Connect Google Ads
Before this step, give our service account access to your Google Ads account and create your conversion actions - both are covered in Google Ads Setup Prerequisites. There is no key file or password to paste for Google. In the Add-on settings, fill in:
- Google Ads Customer ID - the account that runs your ads. You can paste it in the XXX-XXX-XXXX form shown in Google Ads; the Add-on strips the dashes and spaces for you.
- Ads Consent When Unknown - Granted or Denied (blank = Denied). This applies only to customers whose consent could not be determined - it never overrides a real decision, and a refusal is permanent. Set it to Granted only where you have a lawful basis. Applies to both Google and Meta.
Then map each Storeganise event to a Google Ads conversion action ID (created in Prerequisites step 2). Leave an event blank to skip it:
- Lead - the waitlist signup / new-customer signal.
- MoveIn Created - a unit gets reserved.
- MoveIn Started - the lease starts.
- MoveIn Completed - the customer moves in (the typical sale conversion).
Each MoveIn event has an Include Value toggle. Set to Yes to send the rental's monthly price as the conversion value - typically Yes for MoveIn Completed.
5. Connect Meta Ads
In the Add-on settings, fill in your Meta credentials (see Meta Ads Setup Prerequisites for how to obtain the Pixel ID and access token):
- Meta Ads Pixel ID - your Pixel / Dataset ID (16-digit number) from Events Manager.
- Meta Ads Access Token - a long-lived Conversions API token from Events Manager > Settings > Conversions API.
- Meta Action Source - defaults to website; leave as-is unless your bookings come from another source.
- Meta Ads Test Event Code (optional) - set during testing so uploads show in Events Manager > Test Events. Leave blank in production.
Then map each Storeganise event to a Meta event name. Leave a stage blank to skip it:
- Lead - Lead
- MoveIn Created - InitiateCheckout
- MoveIn Started - Schedule
- MoveIn Completed - Purchase
These are Meta standard event names and plug straight into Meta's ad optimisation and reporting. Custom names work, but standard events are recommended.
Each MoveIn event has an Include Value toggle to send the rental's monthly price as the conversion value.
6. Verify It's Working
- Run a test booking through one of your live ads (or a link with utm_* / click-id parameters).
- For Meta, set a Test Event Code first and watch the conversion appear in Events Manager > Test Events within a few minutes.
- For Google Ads, the conversion appears against your conversion action within a few hours.
- Every successful upload is recorded back on the Storeganise customer, so the same conversion never fires twice. If an upload fails permanently it surfaces as an admin task rather than being lost silently.
GTM Setup
This section gets ad-attribution capture working on a Storeganise-hosted booking site in about 30 minutes. It assumes you can edit your Google Tag Manager (GTM) container.
What You'll Set Up
Three GTM tags work together to feed ad-attribution data into the Add-on:
- Attribution cookie - reads UTMs (utm_source, utm_medium, etc.) and ad-platform click IDs (gclid, gbraid, wbraid, fbclid) from the landing URL and stores them in a first-party cookie on the customer's first visit.
- Waitlist capture - when the customer clicks 'Join waitlist', posts the cookie + email to the Add-on. The Add-on attaches that ad data to the new customer the moment Storeganise creates them.
- Booking capture - on successful unit booking, does the same thing. The Add-on then uses that ad data when uploading the conversion to Google or Meta.
GTM Prerequisites
- A GTM container created at tagmanager.google.com. You'll need the container ID (format: GTM-XXXXXXX).
- Paste that container ID into Storeganise admin: Settings > Developer > Customer Portal integrations > Google Tag Manager ID. Storeganise injects the GTM snippet for you - no need to add script tags manually.
- Allowlist https://services.unwiredlogic.app in the booking-site Content Security Policy. In Storeganise admin: Settings > Developer > Custom CSP, add the URL to the connect-src field.
- Your businessCode. You type this into two of the tags below. It is the first part of your <businessCode>.storeganise.com address - that address still works even if you normally serve your booking site on your own domain - or ask us to confirm it.
- Custom domain? If your booking site is on your own domain rather than a storeganise.com address, email support@unwiredlogic.com with that domain so we can add it to the Add-on's allowlist. Until we do, every capture is rejected with 403 forbidden origin and no attribution is recorded.
⚠️ Consent and GDPR (do this first)
Required before you go live. The attribution cookie tag collects advertising data, so under GDPR / ePrivacy it must not fire until the visitor consents. Set up the consent handling in this section first - skipping it means collecting ad data without consent, which is a compliance breach, not just a missing feature.
The tags below store advertising identifiers (gclid, gbraid, wbraid, fbclid) in a first-party cookie and later send them, with the customer's email, to Google and Meta. Under GDPR / ePrivacy that needs the visitor's prior consent - first-party does not exempt it.
You are the data controller: the cookie banner (usually a consent tool such as Cookiebot or OneTrust) and your legal basis are your responsibility. The Add-on's job is to honour whatever that banner sets, in two places: GTM Consent Mode decides whether the cookie tag may run at all, and the capture tags report each visitor's own decision to the Add-on, which enforces it on upload. Two rules follow.
1. Default everything to denied. So that nothing fires until the visitor accepts, add a Custom HTML tag on the Consent Initialization - All Pages trigger:
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){ dataLayer.push(arguments); }
gtag('consent', 'default', {
ad_storage: 'denied',
ad_user_data: 'denied'
});
</script>
If your banner tool already supports Google Consent Mode (Cookiebot, OneTrust, Usercentrics, etc.) it sets these defaults for you and flips them to granted only after the visitor accepts - rely on it and skip this tag. What matters is that the banner really does set the Consent Mode signals: one that only hides itself leaves the cookie tag switched off.
One thing to get right when you build the consent variable.
"Denied" is also what the browser reports before the visitor has answered
anything - but the two must not be treated the same. A real refusal is recorded
permanently; "not answered yet" should fall back to your
Ads Consent When Unknown setting. The
cjs.ads_consent variable the capture tags rely on has to tell them
apart - the GTM setup guide's "Prerequisite: the cjs.ads_consent
variable" section shows how, and how to verify it in GTM Preview.
2. Gate Tag 1 only - and do not gate Tags 2 and 3. On Tag 1 (the attribution cookie) open Advanced Settings > Consent Settings > Require additional consent for tag to fire and add ad_storage. GTM then blocks the whole tag - the cookie is never written - unless consent is granted. That is the tag that writes a non-essential advertising cookie, so that is the tag that must be gated.
Tags 2 and 3 (the capture tags) must have no consent requirements, so they always fire. They report the visitor's own decision to the Add-on, which cannot act on a refusal it never hears about - blocking these tags would hide the refusal rather than honour it. They send nothing on their own account either: each reads the attribution cookie first and stops if it is not there.
What this gives you:
- Visitor declines up front: nothing is collected. Tag 1 never fires, so no cookie is written - and with no cookie both capture tags stop on their first check. No email, no capture record, nothing sent anywhere.
- Visitor accepts, then withdraws later: the cookie already exists, so the capture still fires - and reports denied. The Add-on records that refusal and permanently stops uploading conversions for that customer, on Google and Meta alike. This is exactly why the capture tags are not gated.
- No consent banner at all: with the default-denied above, Tag 1 never fires - the same outcome as a decline. A capture from an older cookie carries no consent value, and falls back to your Ads Consent When Unknown setting (Denied unless you change it).
- No partial mode: UTMs and click IDs share the one advertising cookie, so a decline blocks all of it, UTMs included. There is no "UTM-only" version - and an upload needs both a UTM source and a click ID anyway.
Step 1 - Create the URL Query Variables
In GTM: Variables > User-Defined Variables > New, type URL, component type Query.
Create eleven variables (variable name > query key):
| Variable Name | Query Key |
| url.utm_source | utm_source |
| url.utm_medium | utm_medium |
| url.utm_campaign | utm_campaign |
| url.utm_term | utm_term |
| url.utm_content | utm_content |
| url.gclid | gclid |
| url.gbraid | gbraid |
| url.wbraid | wbraid |
| url.fbclid | fbclid |
| url.captured_at | captured_at |
| url.landing_url | landing_url |
Step 2 - Tag 1: Attribution Cookie
Tags > New > Custom HTML. Name it cHTML.sg_attribution_cookie. Paste:
<script>
(function () {
var COOKIE = 'sg_attribution';
// EDIT ME (custom domains): leave '' if your ads land on the booking site
// itself. Set to '.example.com' when ads land on one subdomain
// (www.example.com) but the booking site is another (my.example.com) -
// otherwise the cookie set on the landing page is unreadable on the
// booking site and no attribution is ever captured.
var COOKIE_DOMAIN = '';
if (document.cookie.split('; ').some(function (c) {
return c.indexOf(COOKIE + '=') === 0; })) return;
var fields = {
utm_source: {{url.utm_source}},
utm_medium: {{url.utm_medium}},
utm_campaign: {{url.utm_campaign}},
utm_term: {{url.utm_term}},
utm_content: {{url.utm_content}},
gclid: {{url.gclid}},
gbraid: {{url.gbraid}},
wbraid: {{url.wbraid}},
fbclid: {{url.fbclid}}
};
var hasAny = Object.keys(fields).some(function (k) { return !!fields[k]; });
if (!hasAny) return;
fields.captured_at = {{url.captured_at}} || new Date().toISOString();
fields.landing_url = {{url.landing_url}} || location.href;
document.cookie = COOKIE + '=' + encodeURIComponent(JSON.stringify(fields))
+ (COOKIE_DOMAIN ? '; Domain=' + COOKIE_DOMAIN : '')
+ '; Path=/; Max-Age=' + (60 * 60 * 24 * 30) + '; SameSite=Lax'
+ (location.protocol === 'https:' ? '; Secure' : '');
})();
</script>
Trigger: built-in All Pages.
Consent Settings: require ad_storage (see Consent and GDPR).
Step 3 - Tag 2: Waitlist Capture
Triggers > New > Click - All Elements. Name it cl.join_waitlist.
- This trigger fires on: Some Clicks
- Condition: Click Element matches CSS selector #subscribe-form button[type="submit"], #subscribe-form button[type="submit"] *
- Condition: Page Path matches RegEx ^/sites/[^/?#]+/?$
Tags > New > Custom HTML. Name it cHTML.waitlist_capture. Paste:
Replace REPLACE_ME with your businessCode on the line marked EDIT ME. If you leave the placeholder in, the tag publishes and appears to work but captures nothing - check your browser console for [sg-capture] BUSINESS_CODE is not set.
Prerequisite - the cjs.ads_consent variable. Both capture tags call a readConsent() helper that reads a GTM Custom JavaScript variable named cjs.ads_consent. GTM has no built-in variable for this, so you create it yourself; what it contains depends on which consent platform your site runs. It must return 'granted', 'denied', or undefined - and never 'denied' for a state it simply could not read, because a refusal is recorded permanently. Create it before you publish these tags: without it every capture omits the consent field and every visitor falls back to your Ads Consent When Unknown setting. Full instructions, including a Google Consent Mode v2 example, are in the "Prerequisite: the cjs.ads_consent variable" section of the GTM setup guide.
<script>
(function () {
var COOKIE = 'sg_attribution';
var CAPTURE_URL = 'https://services.unwiredlogic.app/ads-conversions/storeganise/capture';
// EDIT ME: your Storeganise businessCode, e.g. 'acme-storage'.
// Hard-code it. Do NOT derive it from the hostname - on a custom domain
// that returns '' and silently disables this tag.
var BUSINESS_CODE = 'REPLACE_ME';
if (!BUSINESS_CODE || BUSINESS_CODE === 'REPLACE_ME') {
console.error('[sg-capture] BUSINESS_CODE is not set - edit this GTM tag');
return;
}
var raw = document.cookie.split('; ').find(function (c) {
return c.indexOf(COOKIE + '=') === 0; });
if (!raw) return;
var adData;
try { adData = JSON.parse(decodeURIComponent(
raw.split('=').slice(1).join('='))); } catch (e) { return; }
var emailEl = document.querySelector('input[id="siteDetail.subscribe.email"]');
var email = emailEl ? (emailEl.value || '').trim() : '';
if (!email) return;
// Returns 'granted', 'denied', or undefined. Undefined omits the field and
// the Add-on falls back to your "Ads Consent When Unknown" setting. Never
// return 'denied' for an unreadable state - a refusal is permanent.
function readConsent() {
try {
var c = {{cjs.ads_consent}};
return (c === 'granted' || c === 'denied') ? c : undefined;
} catch (e) {
return undefined;
}
}
try {
fetch(CAPTURE_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
businessCode: BUSINESS_CODE, email: email, adData: adData,
consent: readConsent() }),
keepalive: true,
}).catch(function () {});
} catch (e) {}
})();
</script>
Trigger: cl.join_waitlist (the trigger you created above).
Consent Settings: none - this tag must not have any consent requirements, because it has to fire whatever the visitor decided so that a refusal reaches the Add-on and can be enforced (see Consent and GDPR).
Step 4 - Tag 3: Booking Capture
Tags > New > Custom HTML. Name it cHTML.booking_capture. Paste:
Replace REPLACE_ME with the same businessCode you used in Step 3.
<script>
(function () {
if (window.__sgBookingCaptureInstalled) return;
window.__sgBookingCaptureInstalled = true;
var COOKIE = 'sg_attribution';
var API = location.origin + '/api/v1';
var CAPTURE_URL = 'https://services.unwiredlogic.app/ads-conversions/storeganise/capture';
// EDIT ME: the same businessCode literal you used in Step 3.
var BUSINESS_CODE = 'REPLACE_ME';
if (!BUSINESS_CODE || BUSINESS_CODE === 'REPLACE_ME') {
console.error('[sg-capture] BUSINESS_CODE is not set - edit this GTM tag');
return;
}
function readCookie() {
var raw = document.cookie.split('; ').find(function (c) {
return c.indexOf(COOKIE + '=') === 0; });
if (!raw) return null;
try { return JSON.parse(decodeURIComponent(
raw.split('=').slice(1).join('='))); } catch (e) { return null; }
}
// Returns 'granted', 'denied', or undefined. Undefined omits the field and
// the Add-on falls back to your "Ads Consent When Unknown" setting. Never
// return 'denied' for an unreadable state - a refusal is permanent.
function readConsent() {
try {
var c = {{cjs.ads_consent}};
return (c === 'granted' || c === 'denied') ? c : undefined;
} catch (e) {
return undefined;
}
}
function runCapture() {
var adData = readCookie();
if (!adData) return;
fetch(API + '/user', { credentials: 'include' })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (user) {
var email = user && user.email ? String(user.email).trim() : '';
if (!email) return;
return fetch(CAPTURE_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
businessCode: BUSINESS_CODE, email: email, adData: adData,
consent: readConsent() }),
keepalive: true,
});
})
.catch(function () {});
}
var origFetch = window.fetch;
window.fetch = function (input, init) {
var url = (typeof input === 'string') ? input : (input && input.url) || '';
var method = (init && init.method) || (input && input.method) || 'GET';
var promise = origFetch.apply(this, arguments);
if (String(method).toUpperCase() === 'POST' &&
url.indexOf('/units/orders') !== -1) {
promise.then(function (res) {
if (res && res.ok) setTimeout(runCapture, 500); },
function () {});
}
return promise;
};
})();
</script>
Trigger: built-in All Pages (NOT a path-restricted Page View - the booking site is a SPA and route changes don't refire Page View).
Consent Settings: none - like Tag 2, this tag must not have any consent requirements, because it has to fire whatever the visitor decided so that a refusal reaches the Add-on and can be enforced (see Consent and GDPR).
Step 5 - Test and Publish
- Open your site with a tagged URL: https://<your-business>.storeganise.com/sites/<siteId>?utm_source=google&utm_medium=cpc&gclid=test-AbCdEfGh-12345678
- Devtools > Application > Cookies - confirm sg_attribution is set with the values you passed.
- Submit the waitlist form. Devtools > Network - confirm the POST /storeganise/capture returns 200.
- Complete a test unit booking. Confirm another POST /storeganise/capture returns 200.
- In GTM, Submit > Publish.
Google Ads Setup Prerequisites
Connecting Google Ads (step 4) needs two things prepared beforehand: our service account added as a user on your Google Ads account, and a conversion action for each Storeganise event you want to track. The Add-on uploads through Google's Data Manager API using that access.
1. Add Our Service Account to Your Google Ads Users
Unwired Logic runs the service account that uploads your conversions, so there is no Google Cloud project to create and no key file for you to download, store, or rotate. You only grant it access to your Google Ads account.
- In Google Ads, go to Admin > Access and security > Users, then click +.
-
Enter the Unwired Logic service-account email:
ads-conversions-uploader@ul-sg-ads-conversions.iam.gserviceaccount.com - Set the access level to Standard and save. A service account is added immediately - it has no inbox, so there is no invitation for it to accept and nothing further to confirm.
- Grant it on the Google Ads account that runs the ads - the same account whose Customer ID you enter in Instructions step 4. If you manage several Google Ads accounts from one central account, adding the service account to that central account is not enough - it has to be added to the account the ads run in.
You can revoke this access at any time from the same Users screen - conversion uploads stop, and nothing else in your Google Ads account is affected.
2. Create Conversion Actions for Click Uploads
Create one conversion action for each Storeganise event you want to track - Lead, MoveIn Created, MoveIn Started, and MoveIn Completed. Repeat the steps below for each one, then map them in Instructions step 4 (Connect Google Ads).
- In your Google Ads account, go to Tools (or Goals) > Conversions.
-
Click New conversion action.
-
Choose Conversions offline. Click Edit data sources, select Connect data source later, then save and continue.
-
Set the category, name, and value settings as you like, then save. Google walks you through a few screens:
-
Open the new conversion action and copy the ctId value from the page URL - this is the conversion action ID you paste into the matching field in Instructions step 4 (Connect Google Ads).
Note - timing: Wait about 4-6 hours after creating an action before uploads attribute cleanly to it, and allow a further 24-48 hours for reporting to catch up. The action must be ENABLED.
Note - the type is permanent: A conversion action's type is fixed when it's created; Google has no "edit type" option. You can't convert an existing website-tag (WEBPAGE) action into an UPLOAD_CLICKS one - leave any website-tag action as-is for on-site tracking and create a new offline action using the steps above. You can still edit an action's name, category, value settings, and status later - just not its type.
3. Tag your ad campaigns with utm_source
Google Ads auto-tagging adds the gclid for you, but it does not add utm_source - so set it yourself on each campaign's final URL (for example, append ?utm_source=google). The other UTMs (utm_medium, utm_campaign, and so on) are optional and used only for your own reporting.
4. Turn on enhanced conversions and accept the customer-data terms
In your Google Ads account, go to Goals > Conversions > Settings (on some accounts this is under Tools > Conversions). The Settings tab has two related switches - turn on both and accept the customer-data terms when prompted:
- Enhanced conversions - tick Turn on enhanced conversions.
- Enhanced conversions for leads - tick Turn on enhanced conversions for leads.
- Accept the customer-data terms when prompted, then Save.
Note: Each switch asks which method collects user-provided data (Google tag, Tag Manager, or Google Ads API). That choice governs Google's own on-site collection only - the Add-on uploads through the Data Manager API regardless, so any method is fine. What matters is that both switches are on and the terms accepted; both switches accept the same terms, and both on is the configuration confirmed to work. Accepting the terms can take a few hours to take effect - during testing, a "terms not signed" failure usually means it is still propagating or was never completed.
5. Check your Data Manager consent settings (EEA / UK)
This is a separate setting from the customer-data terms above, and it matters if you advertise to visitors in the EEA or UK. The Add-on labels each upload with that individual customer's own consent, and it only uploads at all when it has that consent: a customer who refused is never uploaded to Google or Meta, and a customer whose consent could not be determined is decided by your Ads Consent When Unknown setting. So every event the Add-on does send arrives labelled as consented. This Google page is the account-level fallback for uploaded data that arrives without a consent label, so it does not normally come into play for the Add-on's uploads.
- In your Google Ads account, go to Tools > Data manager > Consent settings tab.
-
Under Imported and uploaded data >
Default consent settings, decide how Google should treat
uploaded data that is not labelled with consent:
- No - do not automatically mark this data as consented (the default): Google won't use unlabelled EEA/UK data for ads personalization. Because the Add-on labels each upload with that customer's own consent, its own uploads are unaffected either way - the safe, consent-first choice.
- Yes - automatically mark this data as consented: Google treats uploaded data as consented. Only choose this if you have a lawful basis to assert consent for all uploaded data.
Meta Ads Setup Prerequisites
Before connecting Meta Ads in step 5, complete these one-time setup steps to obtain the Pixel/Dataset ID and Conversions API access token.
1. Business Manager and Ad Account
Skip this step if you already run Meta ads - you have both.
- At business.facebook.com, create a Business Manager account or log in to your existing one, and complete business verification if Meta asks for it.
- Go to Business Settings > Accounts > Ad Accounts and add an ad account - a new one, or link the one you already advertise from. Note its Ad Account ID (format act_XXXXXXXXXX).
2. Set Up a Meta Pixel (Dataset)
- Navigate to Business Settings > Data Sources > Pixels
- Click Add > Create a Pixel (or select an existing one)
- Enter a name, click Create
- Copy your Pixel ID - this is the Dataset ID used in Conversions API, and goes in the Meta Ads Pixel ID field
- Install the pixel code on your website (optional but recommended for web tracking)
Note: The Meta Pixel ID is the same as the Dataset ID used in the Conversions API.
3. Enable Conversions API and Generate an Access Token
- In Business Manager, navigate to Events Manager
- Select your pixel/dataset > Settings tab
- Scroll to Conversions API > click Generate access token
- Copy and securely save the token - you won't be able to see it again. This goes in the Meta Ads Access Token field.
- Verify that the Conversions API is enabled
Important: Store the access token securely. Treat it like a password. Anyone with this token can access your ad account.
For the latest documentation, refer to: developers.facebook.com/docs/marketing-api/conversions-api/get-started
FAQs
Do I need a CRM to use the Add-on?
No. The Add-on reads outcomes directly from Storeganise, your PMS. Because there's no lead record to store, it tracks real intent inside the booking flow instead - so operators with no CRM get full closed-loop attribution.
What does it actually send back to Google and Meta?
The Storeganise booking outcomes: the lead (waitlist signup), and the three move-in stages - move-in created (reservation), started (the lease starts), and completed (the customer moves in, the real conversion). Each move-in stage can also carry the booking value (basket size). You map each one to a Google Ads or Meta action of your choosing.
Do I need to add UTM parameters to my ad campaigns?
Yes - one is required. Every campaign's landing URL must carry a utm_source naming the platform: utm_source=google for Google Ads, or utm_source=facebook, instagram, or meta for Meta. That is how the Add-on decides where to send the conversion, so without it the booking is captured but nothing is uploaded - even with a click ID present. Google Ads auto-tagging adds the gclid but not utm_source, so set it yourself on each campaign's final URL. The other UTMs are optional and feed your own reporting only (use the standard utm_campaign for a campaign label - a custom key such as ul_campaign is not captured).
Will tracking still work as browsers block cookies, and is it GDPR-compliant?
The Add-on uses a first-party cookie, so it keeps working as browsers phase third-party cookies out. First-party does not mean consent-free, though: the cookie is written only after the visitor consents, and each visitor's own decision travels with the capture, so conversions are uploaded only for people whose consent the Add-on holds. You remain the data controller for your consent banner and privacy notice. See Consent and GDPR for setup.
What happens if a visitor declines cookies, or we have no consent banner?
If they decline up front, nothing is captured. The cookie tag defaults to denied, so with a decline - or with no banner to grant consent - the cookie is never written and the capture tags stop immediately. No UTMs, click IDs, or email are stored or sent anywhere; that visitor's booking simply isn't attributed.
If instead a visitor accepted first and withdraws later, the cookie already exists, so the capture still runs - and it reports the refusal. The Add-on records it on that customer and permanently stops uploading conversions for them, to Google and to Meta. A recorded refusal is never reversed. See Consent and GDPR.
Can I change how the journey stages map to ad signals?
Yes. The Lead and move-in mapping shown above is the starting model, configured per account. You choose which Google Ads conversion action or Meta event each stage maps to, and can adjust it whenever you want.
Do I have to connect both Google and Meta?
No. Enable Google, Meta, or both. Any credential or event mapping you leave blank is simply skipped, so you can start with one platform and add the other later.
Do I need a Google Cloud project or a service-account key?
No. Unwired Logic runs the service account that uploads your conversions. Your only Google-side task is adding our service-account email as a Standard user on your Google Ads account - see Google Ads Setup Prerequisites step 1. There is no Google Cloud project to create and no key file to download or store.
Are my Google and Meta connections secure, and how is the access used?
Yes. For Google, you add our service account as a Standard user on your own Google Ads account - you never hand over a password, and no key file passes through your hands. For Meta, you paste a Conversions API access token, which is encrypted at rest (AWS KMS) and stored privately per account. This access is used only to upload conversion events to your Google and Meta accounts - never to read your campaigns, change settings, or for any other purpose. You can revoke Google access at any time by removing the service account from your Google Ads account's users; for Meta, revoke the token in Events Manager. See the Privacy Policy for full detail.
How soon do conversions show up after a booking?
For Meta, set a Test Event Code and the event appears in Events Manager > Test Events within a few minutes. For Google Ads, an uploaded conversion typically appears against its conversion action within a few hours, and reporting can take a further 24-48 hours to fully settle.
Could the same booking be counted twice?
No. Every successful upload is recorded back on the Storeganise customer (and, for move-ins, the rental), so each event uploads at most once - even if a webhook is retried.
What if a booking happens long after the ad click - can the click ID expire?
Each platform only attributes a conversion if the click is recent enough (Google Ads typically up to 90 days, Meta up to 7; the exact window depends on your account settings). The Add-on never discards old bookings - it always attempts the upload and lets the platform apply its own window. If a click is too old, that one event is rejected and recorded as an admin task in Storeganise, then marked handled so it isn't retried or double-counted.
What happens if an upload fails?
Temporary problems (network glitches, rate limits) are retried automatically. If an upload fails permanently, it surfaces as an admin task in Storeganise rather than being lost silently, so your team can see and act on it.
What customer data is sent to the ad platforms?
The ad click IDs captured from the landing URL (gclid / gbraid / wbraid / fbclid), plus the customer's email and phone - and the email and phone are SHA-256 hashed before they leave Storeganise, never sent in the clear. Move-in events can also include the booking value and currency.
Will bookings that didn't come from an ad create conversions?
No. Only bookings that can be traced back to a tracked ad click are sent to the platforms. Organic or direct bookings with no ad attribution are ignored, so your conversion data stays clean.
Should I use Meta standard event names or my own?
Standard events (Lead, InitiateCheckout, Schedule, Purchase) are recommended - they plug straight into Meta's ad optimisation and reporting. Custom names work too, but you'd then need to create a matching Custom Conversion in Events Manager for each one before they're useful for optimisation.
Where can I read the privacy policy and terms of service?
The Add-on handles booking data and connects to your Google and Meta accounts, so its data handling is covered by two documents:
In short: customer email and phone are SHA-256 hashed before they leave Storeganise, only ad-attributed bookings are sent to the platforms, and the Google Ads connection is used solely to upload your conversions - never to read campaigns or change settings. See the Privacy Policy for the full detail.
Ready to connect your ad spend to real move-ins?
Unwired Logic info@unwiredlogic.com
Comments
0 comments
Please sign in to leave a comment.