co₂-neutraal verzonden binnen nl & be 🌿

GreenBook zelf ontwerpen

5mm ruit A4

2,90


op voorraad

pre-order Neem na aankoop contact op met support voor een geschatte levering.

  • Wero
  • Paypal
  • Klarna
  • Apple Pay
  • Mastercard
  • Maestro
  • Visa
  • Google Pay
  • Amex
verzonden binnen 1 tot 3 werkdagen
30 dagen bedenktijd
gratis verzending vanaf €80
betaal veilig met diverse betaalmogelijkheden

dit is wat onze klanten van ons vinden

/* GreenStory - GA4 e-commerce events die het thema zelf niet levert. Het thema doet zijn eigen add-to-cart, rendert eigen productkaarten en heeft een winkelwagenlade in plaats van een winkelwagenpagina. Daardoor slaat GTM4WP een aantal events over. Deze code vult ze aan: add_to_cart / remove_from_cart - verschil tussen de vorige en de huidige mandje-inhoud view_cart - bij het openen van de lade view_item_list / select_item - op categorie-, winkel- en zoekpagina's De gegevens komen uit twee JSON-blokjes die de mu-plugin ogs-ga4-events.php plaatst. Het mandje-blokje is een WooCommerce-fragment en is dus altijd actueel, ook op pagina's die uit de cache van Kinsta komen. Dat is bewust: de vorige versie las het mandje uit `cartContent` in de dataLayer, en dat staat op een gecachete pagina altijd op leeg, waardoor add_to_cart een tweede keer vuurde zodra de bezoeker weer op een ongecachete pagina kwam (de checkout). De bestelknop en het afrekenpad worden niet aangeraakt. Uitzetten mag altijd: dan verdwijnen alleen deze events. Bijgewerkt 13-08-2026. */ (function () { var SNAP = 'ogs_gtm_cart_snapshot'; var listSent = false; function dl() { window.dataLayer = window.dataLayer || []; return window.dataLayer; } /* Leest een JSON-blokje. Geeft null zolang het blokje nog de lege, gecachete versie is: dan weten we niets over het mandje en meten we liever niets dan iets verkeerds. */ function readJSON(id) { var el = document.getElementById(id); if (!el || el.getAttribute('data-cached') === '1') { return null; } try { return JSON.parse(el.textContent || 'null'); } catch (e) { return null; } } function push(event, items, munteenheid, extra) { if (!items || !items.length) { return; } var value = 0; items.forEach(function (it) { value += (Number(it.price) || 0) * (Number(it.quantity) || 1); }); var ecommerce = { munteenheid: munteenheid || 'EUR', value: Math.round(value * 100) / 100, items: items }; if (extra) { for (var k in extra) { if (Object.prototype.hasOwnProperty.call(extra, k)) { ecommerce[k] = extra[k]; } } } dl().push({ ecommerce: null }); dl().push({ event: event, ecommerce: ecommerce }); } function clean(it, quantity) { var copy = {}; for (var p in it) { if (Object.prototype.hasOwnProperty.call(it, p) && p !== 'quantity' && p !== 'cart_item_key' && p !== 'permalink') { copy[p] = it[p]; } } if (quantity) { copy.quantity = quantity; } return copy; } /* ---------- mandje ---------- */ function cartKey(it) { return String(it.item_id) + '|' + String(it.item_variant || ''); } function snapshotOf(items) { var map = {}; items.forEach(function (it) { var k = cartKey(it); if (!map[k]) { map[k] = { qty: 0, item: clean(it) }; } map[k].qty += Number(it.quantity) || 0; }); return map; } function qtyOf(entry) { if (!entry) { return 0; } return typeof entry === 'number' ? entry : (Number(entry.qty) || 0); } function syncCart() { var cart = readJSON('ogs-ga4-cart'); if (!cart || !cart.items) { return; } var now = snapshotOf(cart.items); var prevRaw; try { prevRaw = sessionStorage.getItem(SNAP); sessionStorage.setItem(SNAP, JSON.stringify(now)); } catch (e) { return; } if (!prevRaw) { return; // eerste keer in deze sessie: alleen vastleggen, niets melden } var prev; try { prev = JSON.parse(prevRaw) || {}; } catch (e) { return; } var added = []; var removed = []; Object.keys(now).forEach(function (k) { var diff = now[k].qty - qtyOf(prev[k]); if (diff > 0) { added.push(clean(now[k].item, diff)); } }); Object.keys(prev).forEach(function (k) { var diff = qtyOf(prev[k]) - (now[k] ? now[k].qty : 0); // Snapshots van vóór deze versie bewaarden alleen aantallen; daar kunnen we // geen remove_from_cart van maken. Vanaf de volgende wijziging wel. if (diff > 0 && prev[k] && prev[k].item) { removed.push(clean(prev[k].item, diff)); } }); push('add_to_cart', added, cart.munteenheid); push('remove_from_cart', removed, cart.munteenheid); } function viewCart() { var cart = readJSON('ogs-ga4-cart'); if (!cart || !cart.items || !cart.items.length) { return; } push('view_cart', cart.items.map(function (it) { return clean(it, Number(it.quantity) || 1); }), cart.munteenheid); } /* ---------- productlijsten ---------- */ function listData() { var el = document.getElementById('ogs-ga4-list'); if (!el) { return null; } try { return JSON.parse(el.textContent || 'null'); } catch (e) { return null; } } function viewItemList() { var list = listData(); if (listSent || !list || !list.items || !list.items.length) { return; } listSent = true; push('view_item_list', list.items.map(function (it) { return clean(it); }), list.munteenheid, { item_list_name: list.item_list_name }); } function selectItem(event) { var list = listData(); if (!list || !list.items) { return; } var link = event.target && event.target.closest ? event.target.closest('a[href]') : null; if (!link) { return; } var href = link.href.split('?')[0].split('#')[0]; var match = null; list.items.forEach(function (it) { if (!match && it.permalink && it.permalink.split('?')[0] === href) { match = it; } }); if (!match) { return; } push('select_item', [clean(match)], list.munteenheid, { item_list_name: list.item_list_name }); } /* ---------- aanhaken ---------- */ function onCartToggle(event) { var toggle = event.target && event.target.closest ? event.target.closest('[data-cart-toggle]') : null; if (!toggle) { return; } // Het thema zet aria-expanded pas na de klik; even wachten en dan pas kijken of // de lade daadwerkelijk opengaat. setTimeout(function () { if (toggle.getAttribute('aria-expanded') === 'true') { viewCart(); } }, 120); } function bindFragments() { var tries = 0; (function wait() { if (window.jQuery) { window.jQuery(document.body).on( 'wc_fragments_loaded wc_fragments_refreshed added_to_cart removed_from_cart', function () { syncCart(); } ); return; } if (tries++ < 40) { setTimeout(wait, 250); } })(); } function start() { syncCart(); viewItemList(); bindFragments(); document.addEventListener('click', onCartToggle, true); document.addEventListener('click', selectItem, true); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', start); } else { start(); } })();