27 March 2025

data privacy and cybersecurity

Data Privacy and Cybersecurity Risks

Data privacy and cybersecurity risks have become a frequent occurrence in today’s digital environment. High-profile incidents affecting institutions such as the NSW Government’s Service NSW and private health providers have brought attention to the risks that businesses face. This article examines the current landscape, the legal implications and regulatory scrutiny, and the measures businesses can …

Data Privacy and Cybersecurity Risks Read More »

Residential Tenancies Amendment Act 2024

Rental Reforms under Residential Tenancies Amendment Act 2024

The Residential Tenancies Amendment Act 2024 introduces measures that affect both landlords and tenants. The Act restricts rent increases to once every 12 months from 31 October 2024 and requires landlords to provide valid reasons when terminating a tenancy. This article examines the implications of the Act for both parties and outlines the changes that …

Rental Reforms under Residential Tenancies Amendment Act 2024 Read More »

2024 Australian family law reforms

2024 Australian Family Law Reforms: Impact on Parenting Arrangements

Overview of the 2024 Family Law Reforms Significant reforms to Australian family law commenced on 6 May 2024 following the enactment of the Family Law Amendment Act 2023. These changes aim to simplify parenting arrangements and prioritise the best interests of children in family law matters. The reforms remove previous legal presumptions about parental responsibility …

2024 Australian Family Law Reforms: Impact on Parenting Arrangements Read More »

apartments, architecture, building, facade, wall, windows, apartments, apartments, apartments, apartments, apartments-1851505.jpg

Strata Management Transparency: New Disclosure Requirements for Strata Managers

From 3 February 2025, new regulations enhance strata management transparency. Strata managers must disclose relationships, commissions, and potential conflicts. This aims to improve accountability and build trust in the strata management industry. New Disclosure Requirements Enhancing Strata Management Transparency The amendment introduces a framework requiring strata managers to openly disclose details of any personal or …

Strata Management Transparency: New Disclosure Requirements for Strata Managers Read More »

- End", entire site, priority AFTER 8417. * * What it does: * 1. On load, reads gclid + utm_* from the URL and stores them in a * first-party cookie for 90 days (only overwrites gclid when a new one * is present, so a later organic visit does not wipe the paid click). * 2. Appends those params to every calendly.com link and to any inline * Calendly embed, so a completed booking carries them into Calendly and * onward to the RedRain integration. */ (function () { 'use strict'; var COOKIE = 'jm_attr'; var MAXAGE = 60 * 60 * 24 * 90; // 90 days var UTM_KEYS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term']; function readCookie(name) { var m = document.cookie.match('(?:^|; )' + name + '=([^;]*)'); return m ? decodeURIComponent(m[1]) : ''; } function writeCookie(name, val) { document.cookie = name + '=' + encodeURIComponent(val) + '; path=/; max-age=' + MAXAGE + '; SameSite=Lax; Secure'; } // ---- 1. capture from URL, merge with stored ---- function capture() { var url = new URLSearchParams(window.location.search); var stored = {}; try { stored = JSON.parse(readCookie(COOKIE) || '{}'); } catch (e) { stored = {}; } var incomingGclid = url.get('gclid'); if (incomingGclid) { stored.gclid = incomingGclid; } // only overwrite on a fresh click UTM_KEYS.forEach(function (k) { var v = url.get(k); if (v) { stored[k] = v; } }); // if a gclid arrived but no utm_source, tag the source so RedRain is not blank if (incomingGclid && !stored.utm_source) { stored.utm_source = 'google'; stored.utm_medium = 'cpc'; } if (Object.keys(stored).length) { writeCookie(COOKIE, JSON.stringify(stored)); } return stored; } var attr = capture(); if (!attr || (!attr.gclid && !attr.utm_source)) { return; } // nothing to forward // ---- 2. build a query string for Calendly ---- function calendlyParams() { var p = new URLSearchParams(); UTM_KEYS.forEach(function (k) { if (attr[k]) { p.set(k, attr[k]); } }); // carry the raw gclid too. utm_content is the safe carrier RedRain can map // if its Calendly field mapping does not expose a native gclid slot. if (attr.gclid) { p.set('gclid', attr.gclid); if (!p.get('utm_content')) { p.set('utm_content', 'gclid:' + attr.gclid); } } return p.toString(); } function withParams(href) { if (!href || href.indexOf('calendly.com') === -1) { return href; } var qs = calendlyParams(); if (!qs) { return href; } // don't double-append if (href.indexOf('utm_source=') !== -1 || href.indexOf('gclid=') !== -1) { return href; } return href + (href.indexOf('?') === -1 ? '?' : '&') + qs; } // ---- 3a. rewrite anchor links (covers the popup/booking click path) ---- function rewriteLinks() { var links = document.querySelectorAll('a[href*="calendly.com"]'); for (var i = 0; i < links.length; i++) { var a = links[i]; if (a.getAttribute('data-jm-attr') === '1') { continue; } a.setAttribute('href', withParams(a.getAttribute('href'))); a.setAttribute('data-jm-attr', '1'); } } // ---- 3b. rewrite inline embeds. Must run before Calendly widget.js reads // data-url; if the widget already initialised, re-point and let it // re-read on next interaction. Most bookings go via the link path. ---- function rewriteEmbeds() { var w = document.querySelectorAll('.calendly-inline-widget[data-url]'); for (var i = 0; i < w.length; i++) { var el = w[i]; if (el.getAttribute('data-jm-attr') === '1') { continue; } el.setAttribute('data-url', withParams(el.getAttribute('data-url'))); el.setAttribute('data-jm-attr', '1'); } } function run() { rewriteLinks(); rewriteEmbeds(); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', run); } else { run(); } // catch links injected later (Elementor popups, lazy content) if (window.MutationObserver) { var mo = new MutationObserver(function () { rewriteLinks(); }); mo.observe(document.documentElement, { childList: true, subtree: true }); } })();