Unwired Logic — Storeganise Marketplace Add-on
Works with: Storeganise booking engine, marketing website, Google Ads, Meta Ads
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
In the Add-on settings, fill in your Google Ads credentials (see Google Ads Setup Prerequisites for how to create the MCC, service account, and developer token):
- Google Ads Customer ID - the target account ID, digits only, no dashes (e.g. 1234567890).
- Google Ads Login Customer ID (MCC) - your manager account ID, digits only. The MCC must have access to the account above.
- Google Ads Developer Token - the approved API developer token from your MCC's API Center.
- Google Ads Service Account JSON - paste the entire JSON that Google Cloud downloads when you create the key.
Then map each Storeganise event to a Google Ads conversion action resource name (e.g. customers/1234567890/conversionActions/987654321). 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 - e.g. Lead, Contact, SubmitApplication.
- MoveIn Created - e.g. Schedule, InitiateCheckout.
- MoveIn Started - your chosen event name.
- MoveIn Completed - typically Purchase.
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
Before connecting Google Ads in step 4, complete these one-time setup steps to obtain the customer ID, MCC, service-account JSON, and developer token.
1. Set Up Google Ads Manager Account
- Visit ads.google.com/home/tools/manager-accounts/
- Create a new Manager Account (MCC - My Client Center)
- Follow the on-screen instructions to complete the account setup
- Note your Manager Account Customer ID (format: XXX-XXX-XXXX)
2. Grant Manager Account Access to Your Google Ads Account
- Log in to your Google Ads Manager Account
- Navigate to Settings > Sub-accounts
- Click Link existing account
- Enter the Customer ID of the Google Ads account you want to link
- Select the appropriate access level (Standard or Administrative)
- Send the invitation and have it accepted from the target account
3. Create a Google Cloud Platform Project
- Go to Google Cloud Console (console.cloud.google.com)
- Click Select a project > New Project
- Enter a project name, select your organization, click Create
- Enable the Google Ads API: APIs & Services > Library > search 'Google Ads API' > Enable
4. Create a Service Account and Grant Access
- In Google Cloud Console: IAM & Admin > Service Accounts > Create Service Account
- Enter a name and description, click Create
- Skip optional permission steps, click Done
- Click the service account > Keys tab > Add Key > Create new key
- Select JSON format, click Create
- Save the downloaded JSON securely - this is what you paste into the Google Ads Service Account JSON field
5. Link the Service Account to Your Manager Account
- Copy the service account email from the JSON file (format: xxx@xxx.iam.gserviceaccount.com)
- Log in to your Google Ads Manager Account
- Navigate to Admin > Access and security
- Click + to add a new user, paste the service account email
- Select Standard access level, click Send invitation
Note: The service account email will be automatically added without requiring acceptance.
6. Apply for API Access
- Log in to your Google Ads Manager Account
- Navigate to Admin > API Center and review the terms
- Apply for API access - Basic Access for testing (up to 15,000 ops/day) or Standard Access for production (up to 40,000 ops/day, requires approval)
- Fill out the required information and wait for Google's approval (usually a few days)
7. Get Your Developer Token
- After approval, navigate to Admin > API Center in your Google Ads Manager Account
- Copy your Developer Token
- Store this token securely - it goes in the Google Ads Developer Token field
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
5. Set Up Event Match Quality (Recommended)
- In Events Manager, select your pixel/dataset
- Go to the Test Events tab
- Use the test events tool to verify your integration
- Check the Event Match Quality score in the Overview tab
- Aim for 'Good' or 'Great' by including as many customer information parameters as possible
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.
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.