Migration Notice: We are transitioning from <bw-widget> to <nw-blocks> tags. While both are currently supported for backward compatibility, <nw-blocks> is now the recommended tag for all new implementations. Existing <bw-widget> implementations will continue to function.
The Geo Banner widget displays location-aware promotional banners that automatically adapt content based on user geography. It provides a powerful way to show region-specific casino promotions, bonuses, and campaigns with optimized image loading and full tracking integration.
Key Features:
| Attribute | Type | Required | Default | Description |
|---|---|---|---|---|
id |
string | Yes | - | Must be “geobanner” |
bannerID |
string | Yes | - | Unique banner identifier from CMS |
language |
string | No | “en” | ISO 639-1 language code for banner content |
country |
string | No | “ZZ” | ISO 3166-1 country code for geo-targeting |
trackinglinktarget |
string | No | "" | Tracking parameter for analytics |
target |
string | No | “_blank” | Link target attribute (how link opens) |
rel |
string | No | “nofollow” | Link rel attribute for SEO control |
loading |
string | No | “lazy” | Image loading strategy (“lazy” | “eager”) |
fetchpriority |
string | No | “medium” | Image fetch priority (“high” | “low” | “medium”) |
Banner IDs are unique identifiers configured in Sanity CMS:
Naming Convention:
{campaign-name}-{date}
{position}-{type}-{variation}
Examples:
geo-banner-demo-20250605 - Demo banner from June 5, 2025summer-promo-2025 - Summer promotion campaignhero-banner-main - Main hero section bannersidebar-promo-new-users - Sidebar banner for new usersfooter-banner-welcome-bonus - Footer welcome bonus bannerBest Practices:
Controls resource loading priority for optimal performance:
| Value | Use Case | Example |
|---|---|---|
| high | Above-the-fold hero banners | Main page headers, hero sections |
| medium | Important but not critical (default) | Mid-page banners, featured promotions |
| low | Below-the-fold content | Footer banners, sidebar bottom |
Example Usage:
<!-- Hero banner - load immediately -->
<nw-blocks id="geobanner" bannerID="hero-banner" fetchpriority="high" loading="eager" \>
</nw-blocks>
<!-- Sidebar banner - lower priority -->
<nw-blocks id="geobanner" bannerID="sidebar-banner" fetchpriority="low" loading="lazy" \>
</nw-blocks>
Controls when images are loaded:
| Value | Behavior | Best For |
|---|---|---|
| eager | Load immediately | Above-the-fold banners |
| lazy | Load when near viewport (default) | Below-the-fold content |
Automatic Optimization:
fetchpriority="high", loading automatically becomes “eager”loading="lazy", also adds decoding="async" for performancePerformance Tips:
<!-- Hero banner (immediate load) -->
<nw-blocks id="geobanner" bannerID="hero" fetchpriority="high" \>
</nw-blocks>
<!-- Mid-page banner (default lazy) -->
<nw-blocks id="geobanner" bannerID="mid-page" \>
</nw-blocks>
<!-- Footer banner (explicit lazy) -->
<nw-blocks id="geobanner" bannerID="footer" loading="lazy" fetchpriority="low" \>
</nw-blocks>
Banners can be configured to display based on user location:
<!-- UK-specific banner -->
<nw-blocks id="geobanner" bannerID="uk-welcome-bonus" country="UK" \>
</nw-blocks>
<!-- German banner -->
<nw-blocks id="geobanner" bannerID="de-freispiele" country="DE" language="de" \>
</nw-blocks>
<!-- French banner -->
<nw-blocks id="geobanner" bannerID="fr-bonus-bienvenue" country="FR" language="fr" \>
</nw-blocks>
Use country="ZZ" for global/fallback banners:
<!-- Global banner (any country) -->
<nw-blocks id="geobanner" bannerID="global-promo" country="ZZ" \>
</nw-blocks>
Display language-specific versions:
<!-- English version -->
<nw-blocks id="geobanner" bannerID="welcome-2025" language="en" country="UK" \>
</nw-blocks>
<!-- Spanish version -->
<nw-blocks id="geobanner" bannerID="bienvenida-2025" language="es" country="ES" \>
</nw-blocks>
Banners generate tracking URLs automatically:
/go/{cloaked-link}/{tracking-target}?wid={widget-id}
Example:
<nw-blocks
id="geobanner"
bannerID="main-promo"
trackinglinktarget="homepage" \>
</nw-blocks>
<!-- Generates: /go/brand-casino/homepage?wid=geobanner -->
By Page Type:
<nw-blocks id="geobanner" bannerID="..." trackinglinktarget="homepage" \></nw-blocks>
<nw-blocks id="geobanner" bannerID="..." trackinglinktarget="review-page" \></nw-blocks>
<nw-blocks id="geobanner" bannerID="..." trackinglinktarget="comparison" \></nw-blocks>
By Position:
<nw-blocks id="geobanner" bannerID="..." trackinglinktarget="hero-section" \></nw-blocks>
<nw-blocks id="geobanner" bannerID="..." trackinglinktarget="sidebar-top" \></nw-blocks>
<nw-blocks id="geobanner" bannerID="..." trackinglinktarget="footer-banner" \></nw-blocks>
By Campaign:
<nw-blocks id="geobanner" bannerID="..." trackinglinktarget="summer-2025" \></nw-blocks>
<nw-blocks id="geobanner" bannerID="..." trackinglinktarget="black-friday" \></nw-blocks>
<nw-blocks id="geobanner" bannerID="..." trackinglinktarget="welcome-bonus" \></nw-blocks>
<nw-blocks
id="geobanner"
bannerID="hero-welcome-2025"
language="en"
country="UK"
fetchpriority="high"
loading="eager"
trackinglinktarget="hero-section"
rel="nofollow"
target="_blank" \>
</nw-blocks>
<nw-blocks
id="geobanner"
bannerID="sidebar-bonus-offer"
language="en"
country="US"
loading="lazy"
trackinglinktarget="sidebar-promo"
rel="nofollow" \>
</nw-blocks>
<!-- English -->
<nw-blocks
id="geobanner"
bannerID="spring-promo-en"
language="en"
country="UK"
trackinglinktarget="spring-campaign" \>
</nw-blocks>
<!-- French -->
<nw-blocks
id="geobanner"
bannerID="spring-promo-fr"
language="fr"
country="FR"
trackinglinktarget="spring-campaign" \>
</nw-blocks>
<!-- German -->
<nw-blocks
id="geobanner"
bannerID="spring-promo-de"
language="de"
country="DE"
trackinglinktarget="spring-campaign" \>
</nw-blocks>
<nw-blocks
id="geobanner"
bannerID="footer-subscribe"
language="en"
country="CA"
loading="lazy"
fetchpriority="low"
trackinglinktarget="footer-cta"
rel="nofollow" \>
</nw-blocks>
<nw-blocks
id="geobanner"
bannerID="black-friday-2025-11-29"
language="en"
country="US"
fetchpriority="high"
trackinglinktarget="black-friday-special"
rel="nofollow"
target="_blank" \>
</nw-blocks>
<nw-blocks
id="geobanner"
bannerID="sponsored-partner-banner"
language="en"
country="UK"
rel="sponsored nofollow"
trackinglinktarget="sponsored-placement" \>
</nw-blocks>
fetchpriority="high" and loading="eager"loading="lazy" and fetchpriority="low"country="ZZ")rel="nofollow" for affiliate banners (default)rel="sponsored" for paid promotional contenttarget="_blank" to open in new tab (default)| Position | Fetchpriority | Loading | Use Case |
|---|---|---|---|
| Hero Section | high | eager | Main promotional banner |
| Top Sidebar | medium | lazy | Important secondary content |
| Mid-Page | medium | lazy | In-content promotions |
| Bottom Sidebar | low | lazy | Lower priority content |
| Footer | low | lazy | Lowest priority banners |
<!-- Affiliate banner -->
<nw-blocks id="geobanner" bannerID="..." rel="nofollow" \></nw-blocks>
<!-- Sponsored content -->
<nw-blocks id="geobanner" bannerID="..." rel="sponsored" \></nw-blocks>
<!-- Sponsored + nofollow -->
<nw-blocks id="geobanner" bannerID="..." rel="sponsored nofollow" \></nw-blocks>
<!-- User-generated content -->
<nw-blocks id="geobanner" bannerID="..." rel="ugc" \></nw-blocks>
<!-- Trusted partner (follow link) -->
<nw-blocks id="geobanner" bannerID="..." rel="follow" \></nw-blocks>
<!-- Open in new tab (default) -->
<nw-blocks id="geobanner" bannerID="..." target="_blank" \></nw-blocks>
<!-- Open in same tab -->
<nw-blocks id="geobanner" bannerID="..." target="_self" \></nw-blocks>
<!-- Open in parent frame -->
<nw-blocks id="geobanner" bannerID="..." target="_parent" \></nw-blocks>
<!-- Open in top window -->
<nw-blocks id="geobanner" bannerID="..." target="_top" \></nw-blocks>
Banner configuration in Sanity CMS:
{
bannerID: "geo-banner-demo-20250605",
brand: {
name: "Casino Brand",
cloakedLink: "brand-casino"
},
image: {
url: "https://cdn.../banner-image.webp",
alt: "Welcome Bonus Banner"
},
targetCountries: ["UK", "DE", "FR"],
targetLanguages: ["en", "de", "fr"],
startDate: "2025-06-05",
endDate: "2025-12-31",
isActive: true,
clickTrackingEnabled: true
}
Required Fields:
bannerID: Unique identifierbrand.cloakedLink: Link to casino brandimage.url: Banner image URLimage.alt: Alt text for accessibilityOptional Fields:
targetCountries: Geo-targeting countriestargetLanguages: Language variantsstartDate/endDate: Campaign schedulingisActive: Banner activation statusBanner data is cached for fast delivery:
GEO_BANNER:{bannerID}:{country}:{language}If banner ID doesn’t exist:
If required attributes missing:
If banner not available for region:
All examples above use the new <nw-blocks> tag. For backward compatibility, you can still use <bw-widget>:
<!-- Old syntax (still supported) -->
<bw-widget
id="geobanner"
language="fr"
country="ZZ"
bannerID="geo-banner-demo-20250605"
rel="nofollow"
target="_blank" \>
</bw-widget>
<!-- New syntax (recommended) -->
<nw-blocks
id="geobanner"
language="fr"
country="ZZ"
bannerID="geo-banner-demo-20250605"
rel="nofollow"
target="_blank" \>
</nw-blocks>
Both tags work identically, but <nw-blocks> is recommended for all new implementations.