(function () {
try {
// AQ-r2 (2026-06-09): respect the explicit-denial sentinel
// written by cookie-consent-harden.js writeATR() on any
// marketing-axis denial (payload.marketing === false; cycle-3 F1).
// Without this gate, the next page navigation re-creates
// gmx_first_touch from the current URL+referrer+utm_*+click_ids,
// silently undoing the reject-all deletion (sweep finding #1).
// The sentinel is cleared the moment the visitor grants
// marketing in the banner (analytics-only grant does NOT
// clear), restoring the writer path on the very next
// page load. Page-cache-safe: the sentinel is a
// browser-resident cookie checked in the inline script, so
// varnish/breeze-served HTML still hits this gate.
if (/(?:^|;\s*)gmx_consent_denied=1(?:;|$)/.test(document.cookie || '')) return;
var CLICK_IDS = ['gclid','fbclid','msclkid','ttclid','wbraid','gbraid','li_fat_id'];
var qs = new URLSearchParams(window.location.search);
var urlClickIdKey = null;
for (var i = 0; i < CLICK_IDS.length; i++) {
if (qs.get(CLICK_IDS[i])) { urlClickIdKey = CLICK_IDS[i]; break; }
}// Parse existing cookie.
var existing = null;
var match = document.cookie.match(/(?:^|;\s*)gmx_first_touch=([^;]+)/);
if (match) {
try { existing = JSON.parse(decodeURIComponent(match[1])); } catch (e) { existing = null; }
}// GWP-273 — referrer-enrichment branch.
// Keep existing unless either (a) URL carries a new click id
// the stored payload lacks (paid click is a higher-value
// signal and upgrades direct/organic), OR (b) the stored
// payload has empty referrer AND the current document.referrer
// is non-empty + external (Safari/ITP/policy-quirk catch:
// first-hit may have missed the referrer; later same-session
// page-loads can recover it).
var existingHasRef = !!(existing && existing.referrer && existing.referrer !== '');
var docRef = document.referrer || '';
var refHost = '';
if (docRef) {
try {
refHost = new URL(docRef).hostname.replace(/^www\./, '').toLowerCase();
} catch (e) { refHost = ''; }
}
var ownHost = (location.host || '').replace(/^www\./, '').toLowerCase();
var currentExternalRef = !!(refHost && refHost !== ownHost);
var canEnrichRef = !!existing && !existingHasRef && currentExternalRef;if (existing) {
if (!urlClickIdKey && !canEnrichRef) return;
if (urlClickIdKey && existing[urlClickIdKey] && !canEnrichRef) return;
}var utm_keys = [
'utm_source','utm_medium','utm_campaign','utm_content','utm_term',
'utm_adgroup','utm_matchtype','utm_network','utm_device','utm_placement'
];
// GWP-273 — merge-preserving base. When enriching an existing
// payload, retain its landing_url + ts + prior click ids /
// utms; only overlay referrer (and any click id appended below
// via the forEach). Branches with/without urlClickIdKey were
// collapsed — both produced the identical Object.assign — the
// click id is added uniformly later.
//
// GWP-273 design choice: "latest external referrer wins" —
// accepted edge case where a user opens a new external tab
// post-empty-first-touch and returns; low-volume, simple, no
// sentinel flag needed.
var data;
if (existing && canEnrichRef) {
data = Object.assign({}, existing, { referrer: docRef });
} else {
data = { landing_url: window.location.href, referrer: docRef, ts: Date.now() };
}
utm_keys.concat(CLICK_IDS).forEach(function (k) {
var v = qs.get(k);
if (v) data[k] = v;
});
// GWP-208 — carry Meta's first-party click-linker cookies (_fbc
// = fb.1.<ts>.<fbclid>, _fbp) into the captured payload so they
// ride the persistent gmx_first_touch cookie cross-page (LP X →
// LP Y) the same way the URL click-ids do. The CF7 hidden-field
// populator copies the whole payload verbatim, so fbc/fbp reach
// the lead even when the form lives on a page without ?fbclid.
var fbcMatch = document.cookie.match(/(?:^|;\s*)_fbc=([^;]+)/);
if (fbcMatch && fbcMatch[1]) data.fbc = decodeURIComponent(fbcMatch[1]);
var fbpMatch = document.cookie.match(/(?:^|;\s*)_fbp=([^;]+)/);
if (fbpMatch && fbpMatch[1]) data.fbp = decodeURIComponent(fbpMatch[1]);
var encoded = encodeURIComponent(JSON.stringify(data));
if (encoded.length > 3800) return;
var expires = new Date(Date.now() + 90 * 864e5).toUTCString(); // GWP-143 C1: match Google Ads 90-day attribution window
var secure = window.location.protocol === 'https:' ? '; Secure' : '';
document.cookie = 'gmx_first_touch=' + encoded + '; Path=/; Expires=' + expires + '; SameSite=Lax' + secure;
} catch (e) {}
})();
/* Meta Pixel base — inline in wp_head so Breeze Delay-All-JS does not defer it; fbevents.js is async-injected (optimizer-invisible). */
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,document,'script',
'https://connect.facebook.net/en_US/fbevents.js');/* Symmetric with server GMX_Consent: revoke BEFORE init; cookies/sends held until grant. */
fbq('consent', 'revoke');
fbq('init', '1857131551802431');
fbq('track', 'PageView'); /* queued; flushed to Meta only after consent grant *//* Grant bridge — reads the SAME ATR marketing signal as GMX_Consent.applyConsent(). */
(function () {
function read(name){var m=document.cookie.match('(?:^|; )'+name.replace(/([.*+?^${}()|[\]\\])/g,'\\$1')+'=([^;]*)');return m?decodeURIComponent(m[1]):'';}
function marketingGranted(){
try {
var given = read('atr_cookie_notice_consent_given');
if (!given) return false; // undecided -> stay revoked
var c = JSON.parse(read('atr_cookie_notice_consent') || '{}');
return !!(c.marketing || c.ad_storage === 'granted');
} catch (e) { return false; } // NO-SILENT-OK: parse/read failure degrades gracefully to revoked (consent stays held; no marketing send) — not an error to report.
}
function apply(){ if (marketingGranted()) fbq('consent', 'grant'); }
apply();
document.addEventListener('click', function(ev){
if (ev.target && ev.target.closest && ev.target.closest('[class*="atr-cookie"], #atr-cookie-notice')) setTimeout(apply, 50);
}, true);
window.addEventListener('storage', apply);
})();
var breeze_prefetch = {"local_url":"https://gomixapp.com","ignore_remote_prefetch":"1","ignore_list":["/cart/","/checkout/","/my-account/","https://gomixapp.co.il/(.)/u05d4u05d8u05d5u05e4u05e1-u05e0u05e9u05dcu05d7-u05d1u05d4u05e6u05dcu05d7u05d4/","wp-admin","wp-login.php"]};
//# sourceURL=breeze-prefetch-js-extra
In today’s accelerated digital era, the way businesses communicate with their customers is undergoing a true revolution. Outdoor digital signage is shifting from an innovative technology to an essential tool in the marketing toolkit of every business that wants to stay relevant and competitive. The transition from static printed signs to dynamic, interactive screens represents not just a technological change, but a fundamental shift in how brands communicate with their target audience. The speed at which messages can be updated, the ability to display rich and engaging content, and the flexibility to tailor messages by time, location, and audience – all make digital signage the ultimate solution for businesses of every size and industry.
Need a digital solution? Leave your details and a representative will get back to you
Digital signage is an electronic display system based on LCD and LED digital signage screens, allowing dynamic content to be presented and changed in real time. The system runs through a cloud-based content management platform connecting the media player to every screen. You can display text, images, videos and animations, and update everything at the click of a button from any device. According to the Digital Signage Federation, signage screens increase customer engagement by 400% on average compared to static signs.
A signage screen offers absolute flexibility in updating content, savings on repeated printing costs, and the ability to present a variety of messages on the same screen. Businesses using LED signage report a 20–30% increase in sales, thanks to dynamic, attractive content that grabs attention and drives action.
The dynamic, illuminated content displayed on LCD and LED screens attracts many times more attention than static signs. In addition, the high durability of the screens — 50,000 to 100,000 operating hours — and the savings in operating costs make the investment worthwhile and profitable over the long term. As of 2026, screen prices have dropped significantly, making them accessible even to businesses with a limited budget.
The solution fits almost every industry: retail shops and supermarkets display real-time promotions, restaurants and cafés run digital menus that update in seconds, and offices use a digital staff noticeboard to share internal information efficiently.
Hospitals and HMOs leverage the technology to direct and inform patients. Malls and shopping centers create an enhanced shopping experience with interactive maps and dynamic advertising. Hotels use digital signage for lobbies and conference rooms. Even educational institutions are adopting the technology to convey information to students and parents.
How do you manage the content displayed on digital signs?
Content management is done through a cloud digital signage platform for business chains with an intuitive Drag & Drop editor — scheduling content, managing screens from one place, and setting rules by hours, days or events. Integration with social networks, weather systems and digital clocks keeps the content relevant. The interface is simple for any employee and requires no technical knowledge.
Can you incorporate video and animations into digital signs?
Absolutely yes! One of the major advantages of digital signage is the ability to display rich multimedia content. Modern screens support HD and even 4K video playback, with a high refresh rate that ensures smooth, flicker-free motion. Advanced animations, 3D graphics and stunning visual effects make the content engaging and unforgettable. The ability to integrate audio in suitable locations enhances the experience even further. Commercials, product demos, brand stories and interactive content – all create a rich experience and high viewer engagement, which leads to greater brand awareness and a rise in sales.
Can digital signage be installed outdoors as well?
Outdoor digital signage is engineered specifically to withstand harsh, challenging outdoor conditions. External LED screens are built with IP65 or higher protection, ensuring full resistance to rain, dust and extreme weather. Their high brightness, reaching 5,000 nits or more, allows clear viewing even in direct sunlight. Built-in heating and cooling systems maintain optimal operating temperature in any weather. The advanced technology includes light sensors that automatically adjust screen brightness to ambient conditions, saving energy and ensuring maximum viewing comfort. Outdoor installation requires professional planning of power and communications infrastructure, but the result is a powerful 24/7 advertising tool.
Case studies, outdoor signage
Examples of digital outdoor signs for businesses
Three examples of LED outdoor signage deployments implemented in a retail chain, a local authority and a community space.
Community LED screen, Gesher HaZiv
Internal LED screen at the community center of Kibbutz Gesher HaZiv — display of kibbutz events and a dynamic noticeboard.
LED outdoor signage, iDigital
LED outdoor signage in iDigital branches — display of promotions, digital shopping experience and consistent branding for the chain.
Outdoor signage, Mateh Asher Regional Council
Digital outdoor signage network at the Mateh Asher Regional Council — resident announcements, community events and service updates.
GoMixApp system for LED video screens
GoMixApp’s system is much more than a digital content management platform — it enables smart, advanced control of your LED screens anywhere, anytime. Through our platform, you can manage LED video walls and digital LED screens, schedule content intelligently, and run dynamic real-time advertising.
Transparent LED screens
Transparent LED screens are an innovative display tool that allows visual content to be shown while preserving full transparency. Their advantages include a modern design, easy integration into shop windows or glass structures, and an attractive viewing experience without blocking natural light or the field of view.
Flexible LED screens
Flexible LED screens are an advanced technological solution that enables display on concave, cylindrical or other uniquely shaped surfaces. Their main advantage is design flexibility and adaptability to complex spaces. They can be used in malls, advertising displays, showrooms, exhibitions and more.
GoMixApp system for LED video screens
GoMixApp’s system is much more than a digital content management platform — it enables smart, advanced control of your LED screens anywhere, anytime. Through our platform, you can manage LED video walls and digital LED screens, schedule content intelligently, and run dynamic real-time advertising.
Transparent LED screens
Transparent LED screens are an innovative display tool that allows visual content to be shown while preserving full transparency. Their advantages include a modern design, easy integration into shop windows or glass structures, and an attractive viewing experience without blocking natural light or the field of view.
Flexible LED screens
Flexible LED screens are an advanced technological solution that enables display on concave, cylindrical or other uniquely shaped surfaces. Their main advantage is design flexibility and adaptability to complex spaces. They can be used in malls, advertising displays, showrooms, exhibitions and more.
Digital signage pricing – how do you calculate return on investment?
Digital signage pricing of course varies according to screen size, technology and system complexity, but outdoor signage typically costs between half a million and 1.2 million NIS. Despite the initial investment, the return is fast and significant. The ROI calculation includes savings on printing and sign replacement costs, which can reach thousands of NIS per month. The increase in sales — traditionally 20-30% on average — also makes up a significant component of the return.
The ability to sell advertising space on the screen can create an additional revenue stream. Savings on manpower required to update physical signage and the improved operational efficiency also contribute. Studies show most businesses reach full ROI within 12-18 months, and the system continues to generate value for many years afterwards.
What service will you receive from us?
GoMixApp provides a comprehensive service package tailored to the unique needs of every business. The service includes professional consultation in choosing the right solution, design and development of custom templates, full training on using the system, and ongoing technical support. The company’s advanced platform supports both online and offline work, with full support for Android, iOS and Windows devices. The user-friendly management system includes integration with Google Analytics for performance tracking, creation of customized dashboards, and advanced analytics tools. The professional team is available to help with design adjustments, troubleshooting and ongoing updates. The company also offers maintenance and upgrade services, ensuring the system stays current and efficient over time.
Does digital signage save money in the long run?
The financial savings of digital signage for businesses are reflected on several levels. Eliminating repeated printing costs saves thousands of NIS each month, especially for businesses that update content frequently. Low operational costs — including minimal electricity consumption with LED technology and little maintenance — reduce ongoing expenses. The ability to run multiple campaigns on the same infrastructure removes the need for additional investments. The long lifespan of the screens, between 50,000 and 100,000 operating hours, ensures many years of use without replacement. Flexibility in content updates prevents waste of advertising materials that have become irrelevant. In addition, the ability to measure and optimize content effectiveness leads to continuous improvement in ROI.
How does digital signage for businesses improve the customer experience?
Digital signage significantly improves the customer experience in the business in a variety of ways. The dynamic, engaging content creates an interesting, modern environment, enhancing the perceived value and quality of the business. Real-time information — such as wait times, special promotions or important updates — improves service and reduces frustration. The ability to display personalized content by time of day or audience type creates a more relevant experience. Interactive touch screens allow customers to retrieve information independently, improving their sense of control and convenience. Entertaining and informative content makes waiting times more pleasant. All these contribute to greater satisfaction, brand loyalty and positive recommendations that bring in new customers.
Can content be updated in real time and remotely?
One of the key advantages of cloud digital signage for business chains is real-time content updates from anywhere in the world. GoMixApp enables centralized management of screens at different locations — instant updates without physical presence. The system supports automatic scheduling and integration with external systems for updating data such as prices, inventory and weather, in line with the digital signage standards of the Standards Institution of Israel.
The digital signage market offers a wide range of display technologies, each with unique advantages. LED screens are the most popular for outdoor use and for large displays, thanks to their high brightness and durability. LCD screens are particularly suited to indoor use and high-resolution displays. OLED screens offer exceptional picture quality and wide viewing angles. Video Walls create huge, impressive display surfaces by combining several screens. Transparent LED screens enable stunning displays while preserving transparency. Digital totems and standing poster screens provide a flexible, movable solution. Interactive touch screens add a dimension of direct engagement with the content.
How do you choose the right size and location?
Choosing the optimal size and location for digital signage requires professional planning and consideration of several factors. Viewing distance is the central parameter – as a rule of thumb, the screen size in centimeters should be twice the viewing distance in meters. Viewing angle is important to ensure visibility from all relevant directions. Mounting height should match the average eye level of viewers. Lighting conditions in the location affect the choice of screen type and required brightness level. Audience flow and dwell times in the location determine the type of content and display duration. Architectural and design considerations are important for harmonious integration into the space. It is recommended to consult experts who will perform a professional survey and propose the best solution.
A 43-inch LED digital signage screen provides an excellent solution for boutique shops and small offices. Falling screen prices have made LCD/LED digital signage solutions accessible to every business, and a monthly subscription (SaaS) model reduces the initial investment. The fast payback makes the solution worthwhile even on a tight budget. Details about our management systems
What are the new trends in digital signage?
The digital signage field is in constant evolution with fascinating technological innovations. Artificial intelligence and machine learning enable automatic content tailoring based on demographic data and viewer behavior. Facial and emotion recognition technology creates personalized content in real time. Flexible and transparent LED screens open up new and impressive design possibilities.
Augmented reality (AR) blends digital elements with physical reality. Integration with IoT enables communication with smart devices and advanced data collection. Green, energy-efficient solutions are becoming more popular. 5G enables ultra-high-quality content delivery in real time. All these promise an exciting, opportunity-filled future for the field.
With outdoor digital signage for businesses you can display various content
“With the holiday videos you absolutely nailed it — the residents were genuinely thrilled!”
Mor
Academic institution
Service:
★★★★★
Product:
★★★★★
Recommendation:
★★★★★
“The digital noticeboard looks amazing, and everything runs smoothly!”
Inbar Shmueli
Business owner
Service:
★★★★★
Product:
★★★★★
Recommendation:
★★★★★
“Personal and professional service, fast response, excellent product, very satisfied”
Why choose us?
GoMixApp’s LED signage solutions for businesses are an essential business tool — not a luxury. Remote content management, automatic updates of dynamic display screens and printing savings make every investment smart and worthwhile. The solution includes LCD/LED screens tailored to every business — from restaurants and retail chains to workspaces and educational institutions — with professional support throughout.
Join 300 companies already benefiting from the digital advertising revolution with GoMixApp. Contact us today and discover how our solution will transform your business.
Already Collaborating With Us
Key points
Real-time updates: change prices, promotions and messages in seconds, from anywhere.
Cost savings: thousands of NIS less per month compared with printing static signs.
+20-30% sales: a proven uplift among businesses that adopted LCD/LED screens.
Ready-made templates: a design library for fashion, restaurants, retail and more.
Centralized chain management: control all branches from a single screen.
Fast ROI: full return on investment within 12-18 months on average.
Transparent digital signage and LED screens – what’s the difference and how do you choose right?
Transparent digital signage allows visual content to be displayed on shop windows and glass structures without blocking natural light — an ideal solution for fashion stores, jewelry shops and shopping centers. Standard LED screens, by contrast, are suited to displaying content on LED screens for advertising in businesses and stores indoors and outdoors with especially high brightness. In 2026, both are available at prices accessible to businesses of any size.
Transparent digital signage — fits shop windows, keeps the field of view open
Outdoor LED screens — IP65 durability, brightness up to 5,000 nits for sunlight use
Indoor LCD screens — high resolution, maximum sharpness for short viewing distances
Flexible LED screens — suit complex spaces, unique designs and curved displays
Case study, Landmark Yarka store
Double-sided LED outdoor pillar at the entrance to Landmark store
The Landmark shopping complex in Yarka installed a double-sided outdoor digital pillar with a high-brightness LED screen, waterproof and suited to direct sunlight. The screen is visible from afar, draws customers from the street and displays rotating campaigns. A combination of powerful visual communication with full environmental durability.
The challenge
A shopping complex that wanted to stand out in a competitive environment and draw customers from the street at long distances, even in direct sunlight.
The solution
An outdoor pillar with a double-sided high-brightness LED screen, waterproof and UV-resistant, designed for 24/7 use in any weather.
The result
Increased store entries, reinforced new branding from the first moment, and remote content management for real-time campaigns. More LED screen projects.
Frequently asked questions
How much does digital signage cost for small and medium businesses?
The cost of the solution varies by screen size and technology type. Small indoor LCD screens start at a few thousand NIS, while large outdoor LED screens can run into the tens or hundreds of thousands of NIS. A monthly SaaS model significantly reduces the upfront investment and enables budget flexibility.
Can multiple screens at different branches be managed from one place?
Yes. GoMixApp’s cloud digital signage platform for business chains enables centralized management of dozens or hundreds of screens across branches. You can update content, schedule campaigns and monitor performance — all from one screen, in real time.
How long does it take to set up and launch a digital signage system?
A basic signage screen can be installed within one business day. Connecting the screen to the management platform and uploading initial content takes a few hours. GoMixApp provides full training and ongoing technical support to ensure smooth operation.
Do you need technical knowledge to operate a digital signage CMS?
No. GoMixApp’s CMS is based on an intuitive Drag & Drop editor with ready-made design templates. Any employee can learn to operate the system within an hour and update content, images and videos without any programming knowledge.
What’s the difference between LCD and LED screens for digital signage?
LCD screens are mostly suited to indoor use, offering high resolution and relatively low cost. LED screens are preferred outdoors thanks to higher brightness and weather resistance. Both are fully supported by the GoMixApp platform and are suitable for digital signage for small and medium businesses.
Comparison of digital signage types for small and medium businesses
Feature
Indoor LCD screen
Outdoor LED screen
Transparent LED screen
Outdoor installation
✗Intended for indoor environments only
✓Durable in harsh weather conditions
✓Suits external shop windows
Video and animation support
✓High-quality video playback
✓Dynamic content and full animations
✓Transparent animations and unique effect
Remote content management
✓Through a convenient cloud system
✓Real-time content updates
✓Centralized management via software
Initial installation cost
Relatively low for small businesses
High – suits a medium budget
Medium-high with special visual value
Suitability for small businesses
✓Ideal entry-level solution for a small business
✓Excellent for storefronts with foot traffic
✓Stands out and grabs customers’ attention
Integration with the GoMixApp system
✓Fully compatible with advanced content management
✓Full support for dynamic content
✓Campaign management from one interface
In summary – it’s time to upgrade your customer experience
In this guide we saw how dynamic display screens, remote content management and smart cloud systems make advertising accessible, efficient and cost-effective for every business — whether it’s a retail shop, a restaurant, an office or a branch network. Costs have dropped significantly in recent years, and the return on investment is proven and fast. It’s important to remember that the solution’s biggest advantage is flexibility: ready-made design templates, automatic content updates and real-time performance tracking — all from one place. Businesses that wait lose customers to competitors that have already adopted the technology.
Last updated: June 2026. Over 300 Israeli companies have already upgraded their advertising with GoMixApp. Contact us now and we’ll be happy to tailor the perfect solution for your business.
document.addEventListener('click', function(e) {
var el = e.target.closest('.gmx-lite-yt');
if (!el) return;
var vid = el.getAttribute('data-vid');
if (!vid) return;
var iframe = document.createElement('iframe');
iframe.src = 'https://www.youtube.com/embed/' + vid + '?autoplay=1';
iframe.style.cssText = 'position:absolute;top:0;left:0;width:100%;height:100%;border:0;';
iframe.allow = 'autoplay;encrypted-media';
iframe.allowFullscreen = true;
el.style.position = 'relative';
el.innerHTML = '';
el.appendChild(iframe);
});
(function () {
var c = document.body.className;
c = c.replace(/woocommerce-no-js/, 'woocommerce-js');
document.body.className = c;
})();
var gmxCf7LegacyUxI18n = {"errName":"Please enter a full name","errPhone":"Please enter a valid phone number","errEmail":"Please enter a valid email address","errRequired":"Required field"};
//# sourceURL=gmx-cf7-legacy-ux-js-extra
var gmxCf7UxI18n = {"progressTemplate":"{N} field(s) remaining","allSet":"All set to send!","sending":"Sending\u2026","successTitle":"Thank you! Your inquiry has been received","successBody":"A representative will get back to you within 24 hours with a tailored quote.","successCtaLabel":"See our areas of expertise","successCtaHref":"/expertise/","errorTitle":"Submission failed","errorBody":"Please try again, or call us directly"};
//# sourceURL=gmx-cf7-ux-js-extra
var atrCookieNoticeSettings = {"cookieName":"atr_cookie_notice_consent","decisionCookieName":"atr_cookie_notice_consent_given","expiryDays":"365","autoHideDelay":"0","enableDebug":"","siteName":"GoMixApp","isPrivacyPage":"","privacyPolicyUrl":"https://gomixapp.com/privacy-policy/","privacyNoteText":"\ud83d\udca1 You can read this page while deciding about cookies","mode":"simple"};
//# sourceURL=atr-cookie-notice-simple-js-extra
(function(){
function cleanUrl(url) {
// Strip query params embedded mid-path: /ID?params/file -> /ID/file
return url.replace(/\?[^\/]+\//g, '/');
}
function addWebPFallback(pic) {
if (pic.getAttribute('data-webp-fb')) return;
pic.setAttribute('data-webp-fb', '1');
var img = pic.querySelector('img');
if (!img) return;
img.onerror = function() {
this.onerror = null;
this.src = cleanUrl(this.src).replace('vi_webp','vi').replace('.webp','.jpg');
var sources = this.parentElement.querySelectorAll('source');
for (var i = 0; i < sources.length; i++) {
sources[i].srcset = cleanUrl(sources[i].srcset).replace('vi_webp','vi').replace('.webp','.jpg');
}
};
}
var observer = new MutationObserver(function() {
var pics = document.querySelectorAll('.video-seo-youtube-picture');
for (var i = 0; i < pics.length; i++) addWebPFallback(pics[i]);
});
observer.observe(document.documentElement, { childList: true, subtree: true });
})();
(function(){
var siteKey = "6Ldnu_gsAAAAAGpkh7vCd_h3L9BA193yFU59I4Do";
var action = "submit_lead_form";
var loaderUrl = "https:\/\/www.google.com\/recaptcha\/enterprise.js?render=6Ldnu_gsAAAAAGpkh7vCd_h3L9BA193yFU59I4Do";
// GWP-506 (perf): the reCAPTCHA Enterprise runtime costs ~900ms of main-thread
// work (PSI contactus TBT 660ms, perf 69). It was loaded eagerly on every page
// carrying a CF7 form. It now loads on the FIRST real page interaction
// (scroll/pointer/key/touch) — warming the runtime well before the user can
// reach submit — and never loads on a no-interaction (lab) page view, so the
// perf win holds. The token is still stamped on form focusin and refreshed at
// submit. IMPORTANT: the server gate is fail-CLOSED by default (GWP-412
// require_token) — a missing token at submit is treated as spam — so the
// runtime MUST be warm before submit; that is exactly why the warm trigger is
// first-page-interaction, NOT focusin-only (focusin-only left a race where a
// fast focus→submit could POST before the ~900ms download finished and drop a
// legit lead). The eager <script src> is gone.
var greReady = false, greWaiters = [], greLoadStarted = false;
function pollGre(attempts) {
if (typeof grecaptcha !== 'undefined' && grecaptcha.enterprise) {
greReady = true;
var queued = greWaiters;
greWaiters = [];
queued.forEach(function (fn) { try { fn(); } catch (e) {} });
return;
}
if (attempts > 200) {
// no-silent-failures: enterprise.js never became ready (network-blocked,
// consent/privacy blocker, or a Google outage). Surface it — a missing
// token fails CLOSED server-side (GWP-412) and drops the lead.
if (window.console && console.warn) {
console.warn('[GMX recaptcha] enterprise.js not ready after ~10s; token will be missing (submit fails closed).');
}
return; // give up after ~10s (200 * 50ms)
}
setTimeout(function () { pollGre(attempts + 1); }, 50);
}
function loadGre() {
if (greLoadStarted) return;
greLoadStarted = true;
var s = document.createElement('script');
s.src = loaderUrl;
s.async = true;
document.head.appendChild(s);
pollGre(0); // begin polling only once the runtime is actually loading
}
function whenGreReady(cb) {
if (greReady) return cb();
greWaiters.push(cb);
}
function stampToken(form) {
if (!form.querySelector('.wpcf7-form-control-wrap input[type="submit"], .wpcf7-submit')) return;
loadGre(); // lazy: kick off enterprise.js on demand (idempotent)
whenGreReady(function () {
grecaptcha.enterprise.ready(function () {
grecaptcha.enterprise.execute(siteKey, { action: action }).then(function (token) {
var hidden = form.querySelector('input[name="gmx_recaptcha_token"]');
if (!hidden) {
hidden = document.createElement('input');
hidden.type = 'hidden';
hidden.name = 'gmx_recaptcha_token';
form.appendChild(hidden);
}
hidden.value = token;
}).catch(function () {
// no-silent-failures: token generation failed; the server gate is
// fail-CLOSED (GWP-412), so this submit will be rejected as spam.
if (window.console && console.warn) {
console.warn('[GMX recaptcha] token execute failed; submit will fail closed.');
}
});
});
});
}
document.addEventListener('wpcf7submit', function (e) { stampToken(e.target); });
// Also stamp on first focus into any CF7 form (so token ready before submit).
// `whenGreReady()` queues the stamp until grecaptcha loads, so the once-
// listener stays safe even if grecaptcha isn't ready at focus-in time.
document.querySelectorAll('form.wpcf7-form').forEach(function (form) {
form.addEventListener('focusin', function once() {
form.removeEventListener('focusin', once);
stampToken(form);
});
});
// GWP-506: warm enterprise.js on the FIRST real page interaction so the ~900ms
// runtime is ready before the user reaches submit (closes the focusin-only race
// against the fail-CLOSED server gate, and covers AJAX/popup-injected forms that
// missed the focusin binding above). Never fires on a no-interaction (lab) view,
// so the perf win holds. Idempotent via loadGre()'s greLoadStarted guard.
var warmOpts = { passive: true, capture: true };
var warmEvents = ['pointerdown', 'keydown', 'touchstart', 'scroll'];
function warmGre() {
loadGre();
warmEvents.forEach(function (e) { window.removeEventListener(e, warmGre, warmOpts); });
}
warmEvents.forEach(function (e) { window.addEventListener(e, warmGre, warmOpts); });// GWP-507 (CONFIRMED LIVE: 19 real leads dropped in 8 days): capture-phase
// submit GATE. The warm/focusin logic above only *helps* the token be ready;
// it is NOT a guarantee. The race: a user whose FIRST interaction is clicking
// submit on an autofilled form (no prior scroll/field-touch to warm the
// ~900ms enterprise.js), or who submits before the runtime readies, serializes
// the AJAX POST with an EMPTY gmx_recaptcha_token → the fail-CLOSED server gate
// (GWP-412 require_token) drops the lead as spam. CF7's `wpcf7submit` fires
// AFTER the AJAX POST (too late), and CF7 exposes no documented pre-POST JS
// hook (verified: contactform7.com/dom-events). So the ONLY seam is to
// intercept the native DOM submit/click in CAPTURE phase, HOLD it until
// greReady + token stamped, then re-dispatch. grecaptcha token lifetime is
// 2 minutes, so holding briefly is safe.
//
// TIMEOUT-FALLBACK CHOICE (a): if enterprise.js never readies within the
// ~10s ceiling (network-blocked / consent-blocker / Google outage), we
// RE-ENABLE the button and let the submit proceed WITHOUT a token rather than
// hard-blocking the user. It will fail-CLOSED server-side (GWP-412), but the
// console.warn fires loudly (no-silent-failures) — we never trap a real user
// behind a spinner they can't escape.
var GATE_TIMEOUT_MS = 10000; // matches pollGre ceiling (200 * 50ms).
function gmxFormHasToken(form) {
var hidden = form.querySelector('input[name="gmx_recaptcha_token"]');
return !!(hidden && hidden.value);
}
function gmxSetVerifying(form, on) {
var btn = form.querySelector('.wpcf7-submit, input[type="submit"], button[type="submit"]');
if (!btn) return;
if (on) {
btn.disabled = true;
btn.setAttribute('data-gmx-verifying', '1');
} else {
btn.disabled = false;
btn.removeAttribute('data-gmx-verifying');
}
}
function gmxReleaseSubmit(form) {
// Mark released so the re-dispatched submit passes straight through the
// capture gate (no re-gate loop), re-enable UX, then re-trigger.
form.__gmxGateReleased = true;
gmxSetVerifying(form, false);
if (typeof form.requestSubmit === 'function') {
form.requestSubmit();
} else {
form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));
}
// GWP-507 finding-1 (BLOCKER fix): reset the release flag on the NEXT tick
// so any FUTURE user submit (user edits a field + resubmits) is re-gated and
// stamps a FRESH token. reCAPTCHA tokens are single-use with a ~2-min
// lifetime — without this reset, __gmxGateReleased stayed true forever after
// the first release, letting a second submit bypass the gate and POST a
// stale/used token. The setTimeout(0) lets the synchronous re-dispatch above
// complete (which short-circuits on the still-true flag) before we re-arm.
setTimeout(function () { form.__gmxGateReleased = false; }, 0);
}
function gmxSubmitGate(e) {
var form = e.currentTarget;
if (form.tagName !== 'FORM') { form = form.form || form.closest('form.wpcf7-form'); }
if (!form) return;
// Idempotent: a programmatic re-submit we already released proceeds. This is
// the ONLY pass-through — it lets the freshly-stamped re-dispatch reach CF7.
// (The flag is reset on the next tick in gmxReleaseSubmit, so the NEXT user
// submit is re-gated.)
if (form.__gmxGateReleased) return;
// GWP-507 finding-2 (stale/used token fix): every USER submit HOLDS + stamps
// a FRESH token — we do NOT early-return on an already-present token. A token
// already sitting in the hidden input may be stale or already used (single-
// use, ~2-min lifetime); proceeding on it would POST a dead token. enterprise.js
// is warm by submit time, so grecaptcha.enterprise.execute() resolves in
// ~100-300ms — the per-submit hold is brief. stampToken() OVERWRITES the
// hidden input value (hidden.value = token), so no stale token lingers.
// HOLD: block CF7's submit handler before the AJAX POST.
e.preventDefault();
e.stopImmediatePropagation();
if (form.__gmxGateWaiting) return; // a click + submit may both fire; hold once.
form.__gmxGateWaiting = true;
loadGre(); // kick the warm if not started.
gmxSetVerifying(form, true);
var released = false;
function release(missing) {
if (released) return;
released = true;
form.__gmxGateWaiting = false;
if (missing && window.console && console.warn) {
console.warn('[GMX recaptcha] submit gate timed out (~10s); releasing without token (submit fails closed).');
}
gmxReleaseSubmit(form);
}
var timer = setTimeout(function () { release(true); }, GATE_TIMEOUT_MS);
whenGreReady(function () {
stampToken(form);
// stampToken resolves the token asynchronously (enterprise.execute
// promise); poll briefly for the stamp, then release. Bounded by the
// same overall timer above.
(function awaitStamp(n) {
if (released) return;
if (gmxFormHasToken(form)) { clearTimeout(timer); release(false); return; }
if (n > 200) { clearTimeout(timer); release(true); return; } // ~10s (200*50ms)
setTimeout(function () { awaitStamp(n + 1); }, 50);
})(0);
});
}
// GWP-507 finding-4 (CF7 phase): WHY capture phase works. Our gate listener is
// registered in CAPTURE phase (3rd arg `true`), so it runs BEFORE CF7's own
// bubble-phase 'submit' handler on the same form. When we call
// e.stopImmediatePropagation() in the capture listener, the DOM spec stops ALL
// further listeners for that event on the target — including the later
// bubble-phase CF7 handler — so CF7's AJAX POST never fires until we re-dispatch
// with a fresh token. This capture-phase interception is the only documented
// pre-POST seam: CF7 exposes no pre-POST JS hook (wpcf7submit fires AFTER the
// AJAX POST). See contactform7.com/dom-events.
document.querySelectorAll('form.wpcf7-form').forEach(function (form) {
form.addEventListener('submit', gmxSubmitGate, true);
var btn = form.querySelector('.wpcf7-submit, input[type="submit"], button[type="submit"]');
if (btn) { btn.addEventListener('click', gmxSubmitGate, true); }
});
})();
(function(){
var loaded = false;
function loadUserWay() {
if (loaded) return;
loaded = true;
var el = document.createElement('script');
el.setAttribute('data-account', "UX40fo0Ctw");
el.setAttribute('data-language', "en");
el.setAttribute('src', 'https://cdn.userway.org/widget.js');
document.body.appendChild(el);
events.forEach(function(e){ window.removeEventListener(e, loadUserWay, {passive: true}); });
}
var events = ['scroll', 'mousemove', 'touchstart', 'click', 'keydown'];
events.forEach(function(e){ window.addEventListener(e, loadUserWay, {passive: true}); });
})();