(function () { var COOKIE = 'rsm_attr'; // first-party, this domain only var DAYS = 90; // matches the usual Google Ads attribution window var MAX = 300; // per-value cap; cookies ride on every request, keep it small try { var qs = new URLSearchParams(location.search); var clip = function (v) { return v == null ? '' : String(v).slice(0, MAX); }; // A "campaign touch" = any paid/tagged arrival. Plain organic navigation must not overwrite. var CLICK = ['gclid', 'gbraid', 'wbraid', 'fbclid', 'msclkid', 'ttclid']; var UTM = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content']; // Google Ads ValueTrack, delivered via a Final URL suffix on standard Search campaigns. // `keyword` + `matchtype` are the useful pair: which search actually produced a booking. var VT = ['keyword', 'matchtype', 'device', 'network', 'campaignid', 'adgroupid', 'placement']; var touch = {}; CLICK.concat(UTM, VT).forEach(function (k) { if (qs.get(k)) touch[k] = clip(qs.get(k)); }); // ValueTrack alone doesn't mark a campaign touch — a stray ?device= shouldn't overwrite a real // ad click's first-touch record. Only a click id or a utm_* counts. var isCampaignTouch = CLICK.concat(UTM).some(function (k) { return !!touch[k]; }); // Referrer is only meaningful when it's off-site. var ref = ''; try { if (document.referrer && new URL(document.referrer).hostname !== location.hostname) { ref = clip(document.referrer); } } catch (e) {} var existing = null; try { var m = document.cookie.match(new RegExp('(?:^|; )' + COOKIE + '=([^;]*)')); if (m) existing = JSON.parse(decodeURIComponent(m[1])); } catch (e) { existing = null; } // Nothing new to record and we already have a record ? leave it alone. if (!isCampaignTouch && !ref && existing) return; var now = new Date().toISOString(); var landing = clip(location.pathname + location.search); var data = existing || {}; if (!data.ft) { // FIRST touch — write once, never overwrite data.ft = { t: now, ref: ref, landing: landing }; CLICK.concat(UTM, VT).forEach(function (k) { if (touch[k]) data.ft[k] = touch[k]; }); } if (isCampaignTouch || !data.lt) { // LAST touch — refresh on each new campaign hit data.lt = { t: now, ref: ref, landing: landing }; CLICK.concat(UTM, VT).forEach(function (k) { if (touch[k]) data.lt[k] = touch[k]; }); } var val = encodeURIComponent(JSON.stringify(data)); if (val.length > 3500) return; // never risk blowing the 4KB cookie limit document.cookie = COOKIE + '=' + val + ';path=/;max-age=' + (DAYS * 86400) + ';SameSite=Lax' + (location.protocol === 'https:' ? ';Secure' : ''); } catch (e) { /* attribution is never worth breaking a page for */ } })();

RAC School of Motoring at Redbank Plains

-


Instructors in Redbank Plains


Book Now in Redbank Plains
Monday
10:00am to 4:00pm
Tuesday
10:00am to 4:00pm
Wednesday
10:00am to 4:00pm
Thursday
10:00am to 4:00pm
Friday
10:00am to 4:00pm
Saturday
Closed
Sunday
Closed
Loading...



Back to Top