By Unwired Logic - a Storeganise marketplace add-on for Google Ads and Meta conversion tracking
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.
To do this for Google, the operator explicitly authorises the Add-on through Google's OAuth consent screen. With that permission, the Add-on connects to the operator's own Google Ads account and uploads offline click conversions to it. The Add-on is installed and operated by the storage business; it accesses only the Google Ads accounts the operator grants, and it uses that access solely to list the operator's accounts (so they can pick one) and to upload these conversions. See What the Add-on Does below for detail, and the FAQs for what data is sent and how it is protected.
Contents
How It Works with Storeganise
Small self-storage operators run Google and Meta ads and take bookings on their Storeganise site - but the ad platforms only ever see the click. They never find out which clicks turned into a real customer. So the algorithm keeps optimising for cheap inquiries, not signed leases.
Google + Meta Ads Conversion Tracking follows the whole booking journey - from the ad click, through the website and booking flow, to the reservation and move-in - and sends those real outcomes back to Google and Meta. Storeganise stays the single source of truth throughout; there is no separate CRM to buy, configure, or maintain.
In short: it connects your ad spend to the real money, using the system you already run.
The Data Loop from Your PMS
Each stage of the Storeganise booking journey maps to a signal the ad platforms understand. This is the starting model - it can be customised per operator:
| 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 |
These outcomes carry the value back to Google and Meta, so the platforms can optimise spend toward the audiences that book and move in - not just the ones that click.
What the Add-on Does
- Recognises a visitor from their first ad click and remembers them through the whole journey.
- Knows when someone moves from one stage to the next - visit, booking, reservation, move-in.
- Picks up the outcome from Storeganise - the reservation, the move-in, and the unit's size and value.
- Sends each outcome back to Google and Meta, tagged so the ads learn which clicks become real customers.
- Lets you set and adjust the attribution model per account - mapping the Lead and move-in stages to your own Google Ads and Meta actions.
What Sets It Apart
- PMS-native, not CRM-dependent - works directly off Storeganise booking data, with nothing extra to buy.
- Closed loop, not one-way - real outcomes (move-ins, unit value) flow back to the ad platforms, not just leads flowing in.
- Optimises for move-ins, not clicks - your ad budget chases signed leases and bigger units, not cheap inquiries.
- Fully managed - Unwired Logic handles setup, monitoring, and maintenance, so your team never babysits a broken pixel.
Instructions
Setup takes about an hour and runs entirely inside Storeganise admin plus your Google Ads and Meta accounts. You can 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
Connecting Google Ads is a one-click authorization - there are no keys, tokens, or JSON files to paste. You simply grant the Add-on permission to upload conversions to your account:
- Save the Add-on settings. While Google Ads is not yet connected, a Reconnect Google Ads task appears in Storeganise admin with a Connect Google Ads link. Open that link.
- Sign in with the Google account that has access to your Google Ads account, and approve the access request.
- Pick the Google Ads account you want to track from the list shown. Manager (MCC) and non-active accounts are greyed out - choose the standard account that runs your ads.
- On success, the connected account ID is written back to the read-only Google Ads Account (connected) field (formatted XXX-XXX-XXXX), so you can see at a glance which account is linked.
Then map each Storeganise event to a Google Ads conversion action resource name (see Google Ads Setup Prerequisites for how to create these). Leave any blank to skip:
- 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 any blank to skip:
- Lead - Lead
- MoveIn Created - InitiateCheckout
- MoveIn Started - Schedule
- MoveIn Completed - Purchase
These are Meta standard event names, so they plug straight into Meta's ad optimisation and reporting. You can substitute other standard events or your own custom names, 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.
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';
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))
+ '; Path=/; Max-Age=' + (60 * 60 * 24 * 30) + '; SameSite=Lax';
})();
</script>
Trigger: built-in All Pages.
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:
<script>
(function () {
var COOKIE = 'sg_attribution';
var CAPTURE_URL = 'https://services.unwiredlogic.app/sg-addon-ads/storeganise/capture';
var host = (window.location.hostname || '').toLowerCase();
var parts = host.split('.');
var BUSINESS_CODE = (parts.length >= 3 && parts[1] === 'storeganise') ? parts[0] : '';
if (!BUSINESS_CODE) 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;
try {
fetch(CAPTURE_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ businessCode: BUSINESS_CODE, email: email, adData: adData }),
keepalive: true,
}).catch(function () {});
} catch (e) {}
})();
</script>
Trigger: cl.join_waitlist (the trigger you created above).
Step 4 - Tag 3: Booking Capture
Tags > New > Custom HTML. Name it cHTML.booking_capture. Paste:
<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/sg-addon-ads/storeganise/capture';
var host = (window.location.hostname || '').toLowerCase();
var parts = host.split('.');
var BUSINESS_CODE = (parts.length >= 3 && parts[1] === 'storeganise') ? parts[0] : '';
if (!BUSINESS_CODE) 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; }
}
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 }),
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).
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 no keys or tokens - it is a one-click authorization. The only thing to prepare in your Google Ads account beforehand is a conversion action for each Storeganise event you want to track.
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 step 4.
- 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.
When you map the action in step 4, enter it as a full resource name, not just the number: customers/<your-customer-id>/conversionActions/<ctId>.
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.
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. Create or Access Facebook Business Manager
- Visit business.facebook.com
- Create a new Business Manager account or log in to your existing one
- Complete business verification if required
- Note your Business Manager ID (visible in Business Settings)
2. Create or Access a Meta Ads Account
- Navigate to Business Settings > Accounts > Ad Accounts
- Click Add > Create a new ad account (or link an existing one)
- Complete the setup process
- Note your Ad Account ID (format: act_XXXXXXXXXX)
3. 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.
4. 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.
Will tracking still work as browsers block cookies?
Yes. The Add-on converts third-party tracking into first-party tracking, so it recognises the same visitor across the journey. It's privacy-safe, GDPR-aware, and built for the post-third-party-cookie world.
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.
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 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 uses Google's data in line with Google's API Services User Data Policy (Limited Use). 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.