{
    "version": "https://jsonfeed.org/version/1",
    "title": "Hirundo",
    "description": "",
    "home_page_url": "https://hirundo.global",
    "feed_url": "https://hirundo.global/feed.json",
    "user_comment": "",
    "author": {
        "name": "Hirundo Team"
    },
    "items": [
        {
            "id": "https://hirundo.global/mews-booking-engine-datalayer/",
            "url": "https://hirundo.global/mews-booking-engine-datalayer/",
            "title": "A ready-to-use dataLayer for the Mews Booking Engine",
            "summary": "In short The Mews Booking Engine already sends a solid set of events to Google Tag Manager. This free kit builds on them: it adds the stay data, net revenue&hellip;",
            "content_html": "<div class=\"mkit mkit-chapo\">\n<p class=\"eyebrow eyebrow--gold\">In short</p>\n<p class=\"mkit-chapo__lead\">The Mews Booking Engine already sends a solid set of events to Google Tag Manager. This free kit builds on them: it adds the stay data, net revenue and stable event names that paid media bidding and reporting rely on, without leaving GTM.</p>\n<dl class=\"mkit-chapo__facts\">\n<div><dt>Why it matters</dt><dd>Without nights, lead time and net value on every event, Google Ads and Meta optimise on incomplete signals.</dd></div>\n<div><dt>When to use it</dt><dd>Before you launch or scale paid media, when you move to Mews, or when you rebuild tracking for GA4 and Consent Mode v2.</dd></div>\n<div><dt>Who it is for</dt><dd>Marketing and e-commerce leads at hotels and groups on the Mews Booking Engine, and the agencies or analysts who run their GTM.</dd></div>\n</dl>\n</div>\n<style>\n.entry>.mkit-chapo{margin-block:0 clamp(1.8rem,4vw,2.6rem)}\n.mkit-chapo{background:var(--gold-soft);border-top:3px solid var(--gold);border-radius:0 0 var(--radius) var(--radius);padding:clamp(1.4rem,3vw,2.2rem)}\n.mkit-chapo .eyebrow{margin-bottom:.7rem}\n.mkit-chapo__lead{font-family:var(--font-serif);font-weight:500;font-size:clamp(1.4rem,2.5vw,1.75rem);line-height:1.32;color:var(--navy);margin:0}\n.mkit-chapo__facts{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(1rem,2.5vw,1.8rem);margin:clamp(1.2rem,2.5vw,1.7rem) 0 0;padding-top:clamp(1rem,2vw,1.4rem);border-top:1px solid var(--navy-line)}\n.mkit-chapo__facts dt{font-family:var(--font-mono);font-size:.7rem;font-weight:500;text-transform:uppercase;letter-spacing:.14em;color:var(--navy);margin-bottom:.4rem}\n.mkit-chapo__facts dd{margin:0;font-size:.95rem;line-height:1.55;color:#2a2d35}\n@media(max-width:640px){.mkit-chapo__facts{grid-template-columns:1fr}}\n</style>\n\n<p>Mews gives hotels a solid booking engine and a native Google Tag Manager integration. What it does not give you is a dataLayer your tags can use as it comes. The events are there, but they are named and shaped the Mews way, they miss the fields paid media needs, and Mews provides them “as is”, with no customisation.</p><p>We built a dataLayer kit that fixes this inside GTM, without asking Mews for anything. It is free, and you can get it at the end of this post.</p><p class=\"mkit\"><a class=\"btn btn--gold btn--lg\" href=\"#guide-form\" data-event=\"guide_download_intent\" data-event-location=\"post_intro\">Get the free kit</a></p>\n\n<figure class=\"mkit mkit-panel\" aria-label=\"Example of a normalised purchase event\">\n<div class=\"mkit-panel__bar\"><span></span><span></span><span></span><em>hirundo-mews-datalayer.js</em></div>\n<pre><code><i>// pushed by the Normalizer, after Mews' purchase</i>\ndataLayer.push({\n  event: <b>'hirundo_purchase'</b>,\n  context: {\n    property_name: <b>'Example Hotel'</b>,\n    funnel_step: <b>'confirmation'</b>\n  },\n  stay: {\n    check_in_date: <b>'2026-10-31'</b>,\n    nights: <u>2</u>, lead_time_days: <u>29</u>\n  },\n  ecommerce: {\n    value: <u>160</u>, value_net: <u>142.86</u>,\n    value_room: <u>160</u>, value_extras: <u>0</u>,\n    currency: <b>'EUR'</b>\n  }\n});</code></pre>\n</figure>\n\n<h2 id=\"what-mews-sends-and-where-it-falls-short\">What Mews sends, and where it falls short</h2>\n<p>The Mews Booking Engine pushes 19 events to the dataLayer: 12 page events prefixed <code>ga4_</code> (calendar loaded, rates loaded, booking created and so on) and 7 GA4 e-commerce events, from <code>view_item_list</code> to <code>purchase</code>.</p><p>That is a good base. Four gaps show up as soon as you plug real tags into it:</p><ul>\n<li><strong>No search event.</strong> The date search and the click on a room are not events. You have to derive them from other steps.</li>\n<li><strong>No stay metrics.</strong> Nights and lead time, the two numbers that drive hotel bidding, are not calculated anywhere before the purchase.</li>\n<li><strong>Tax-inclusive prices only.</strong> Funnel events carry gross prices. The net value exists on the purchase alone, so ROAS is not comparable between markets with different tax rules.</li>\n<li><strong>Names you do not control.</strong> If Mews renames an event, every trigger that listens to it breaks.</li>\n</ul>\n<div class=\"mkit stats\">\n<div class=\"stats__grid\">\n<div class=\"stat\"><span class=\"stat__num\">19</span><span class=\"stat__label\">Native events pushed by the Mews Booking Engine</span></div>\n<div class=\"stat\"><span class=\"stat__num\">16</span><span class=\"stat__label\">Normalised events your tags actually read</span></div>\n<div class=\"stat\"><span class=\"stat__num\">1</span><span class=\"stat__label\">Tag to paste into Google Tag Manager</span></div>\n<div class=\"stat\"><span class=\"stat__num\">0</span><span class=\"stat__label\">Changes to request from Mews</span></div>\n</div>\n</div>\n\n<h2 id=\"the-approach-normalise-do-not-rewrite\">The approach: normalise, do not rewrite</h2>\n<p>You cannot change what Mews pushes. You can change what your tags read.</p><p>The kit adds one tag to your GTM container, the Normalizer. It listens to each native Mews event and pushes a second event next to it, prefixed <code>hirundo_</code>, in a schema that stays the same at every step of the funnel. GA4, Google Ads and Meta read only the <code>hirundo_</code> events. If Mews changes something, you update one mapping in one tag.</p><h2 id=\"inside-the-kit\">Inside the kit</h2>\n<div class=\"mkit guide-cards\">\n<div class=\"guide-card\"><h3>A schema that never changes</h3><p>Every event carries the same four objects: context, stay, ecommerce and booking. Your tags read one structure at every step of the funnel.</p></div>\n<div class=\"guide-card\"><h3>The missing hotel metrics</h3><p>Nights and lead time, calculated on every step instead of only at the purchase.</p></div>\n<div class=\"guide-card\"><h3>Search and no-availability events</h3><p>Mews has no search event. The kit derives one from the room list, and flags the searches that returned no available room.</p></div>\n<div class=\"guide-card\"><h3>Consent and duplicates handled</h3><p>Mews consent is mapped to Consent Mode v2, and a reloaded confirmation page never sends a second purchase.</p></div>\n</div>\n\n<h2 id=\"four-parts-one-file\">Four parts, one file</h2>\n<div class=\"mkit guide-parts\">\n<div class=\"guide-part\"><span class=\"guide-part__no\">Part I</span><div class=\"guide-part__body\"><h3>The target schema</h3><p>The full structure of a normalised event, with a complete purchase example to compare against GTM Preview.</p></div></div>\n<div class=\"guide-part\"><span class=\"guide-part__no\">Part II</span><div class=\"guide-part__body\"><h3>The event mapping</h3><p>Each native Mews event, its normalised equivalent and the GA4 event name to send. Sixteen events in total.</p></div></div>\n<div class=\"guide-part\"><span class=\"guide-part__no\">Part III</span><div class=\"guide-part__body\"><h3>The Normalizer tag</h3><p>Ready to paste into a Custom HTML tag. It listens to Mews and pushes the clean event next to each native one.</p></div></div>\n<div class=\"guide-part\"><span class=\"guide-part__no\">Part IV</span><div class=\"guide-part__body\"><h3>The GTM checklist</h3><p>The variables, triggers and tags to create, the Mews Operations settings to switch on, and the tests to run before you publish.</p></div></div>\n</div>\n\n<h2 id=\"three-decisions-already-made-for-you\">Three decisions already made for you</h2>\n<p><strong>Net value for ad platforms, gross for analytics.</strong> GA4 receives the tax-inclusive value, which matches what the hotel reports. Google Ads and Meta receive the net value, so a campaign in a market with 10% VAT is judged on the same basis as one with 20%.</p><p><strong>One primary conversion.</strong> <code>hirundo_purchase</code> is the only conversion that carries a value and drives bidding. Add to cart and begin checkout are secondary conversions, there to help the algorithms learn.</p><p><strong>Multi-property from day one.</strong> Every event carries the property ID. A single lookup table in GTM routes each hotel to its own GA4 property, Google Ads conversion and Hotel Center ID, with a chain default for the steps before a guest picks a hotel.</p><h2 id=\"before-you-install-it\">Before you install it</h2>\n<ul>\n<li>You need the GTM container ID entered in Mews Operations, under Settings &gt; Services &gt; Booking engines.</li>\n<li>For Enhanced Conversions, switch on “Collect emails for bookings in Google Tag Manager purchase event” in the same screen, and check that your privacy policy covers it.</li>\n<li>If the booking engine runs as a widget on your site, add your domain and <code>mews.com</code> to the GA4 cross-domain settings.</li>\n<li>Test everything in GTM Preview first. Mews owns the native events and can change them.</li>\n</ul>\n<p>One limit to know about: this kit covers the Booking Engine. The Guest Journey (online check-in, Kiosk, upsells after booking, cancellations) has no dataLayer. Measuring it means working server-side from the Mews PMS, which is a separate project.</p><h2 id=\"get-the-kit\">Get the kit</h2>\n<aside class=\"mkit guide-form\" id=\"guide-form\">\n<h3 class=\"guide-form__title\">Get the free kit</h3>\n<p class=\"guide-form__sub\">Enter your email and we'll send the file straight to your inbox.</p>\n<div class=\"guide-form__embed\"><div class=\"post__iframe\"><iframe data-tally-src=\"https://tally.so/embed/Meo20M?alignLeft=1&amp;hideTitle=1&amp;transparentBackground=1&amp;dynamicHeight=1\" loading=\"lazy\" width=\"100%\" height=\"120\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\" title=\"Get the Mews Booking Engine dataLayer kit\"></iframe></div></div>\n</aside>\n\n<p>Running a hotel group on Mews and want this set up, or extended to the Guest Journey and to offline conversions? <a href=\"https://hirundo.global/book-a-call/\">Book a call with Hirundo</a>.</p><style>\n.entry>.mkit{margin-block:clamp(1.8rem,4vw,2.6rem)}\n.entry .mkit a.btn{color:var(--navy-900);text-decoration:none}\n.entry .mkit h3{margin-top:0}\n.mkit-panel{margin-inline:0;background:#1b2538;border-radius:var(--radius);overflow:hidden;box-shadow:var(--shadow-md)}\n.mkit-panel__bar{display:flex;align-items:center;gap:.4rem;padding:.75rem 1rem;border-bottom:1px solid rgba(251,248,241,.1)}\n.mkit-panel__bar span{width:9px;height:9px;border-radius:50%;background:rgba(251,248,241,.22)}\n.mkit-panel__bar em{margin-left:.6rem;font-style:normal;font-family:var(--font-mono);font-size:.7rem;letter-spacing:.08em;color:rgba(251,248,241,.55)}\n.entry .mkit-panel pre{margin:0;padding:1.1rem 1.25rem 1.4rem;background:none;border-radius:0;font-size:.82rem;line-height:1.7;color:rgba(251,248,241,.88)}\n.entry .mkit-panel code{background:none;padding:0;font-size:1em}\n.mkit-panel b{font-weight:500;color:var(--gold)}\n.mkit-panel u{text-decoration:none;color:#9fc1e8}\n.mkit-panel i{font-style:normal;color:rgba(251,248,241,.45)}\n.mkit.guide-cards{grid-template-columns:repeat(2,1fr)}\n@media(max-width:640px){.mkit.guide-cards{grid-template-columns:1fr}}\n.mkit.stats{border-radius:var(--radius-lg)}\n.mkit .stats__grid{padding:clamp(24px,4vw,36px) clamp(18px,3vw,30px);gap:1.2rem}\n.mkit .stat__num{font-size:clamp(2rem,3.4vw,2.6rem)}\n.mkit .stat__label{font-size:.82rem;line-height:1.4}\n.mkit.guide-form{position:static}\n.entry .mkit .guide-form__title{margin-top:0}\n</style>\n\n<script>var d=document,w=\"https://tally.so/widgets/embed.js\",v=function(){\"undefined\"!=typeof Tally?Tally.loadEmbeds():d.querySelectorAll(\"iframe[data-tally-src]:not([src])\").forEach((function(e){e.src=e.dataset.tallySrc}))};if(\"undefined\"!=typeof Tally)v();else if(null==d.querySelector('script[src=\"'+w+'\"]')){var s=d.createElement(\"script\");s.src=w,s.onload=v,s.onerror=v,d.body.appendChild(s)}</script>\n",
            "image": "https://hirundo.global/media/posts/16/mews-datalayer.png",
            "author": {
                "name": "Hirundo Team"
            },
            "tags": [
                   "Analytics"
            ],
            "date_published": "2026-10-02T10:27:07+02:00",
            "date_modified": "2026-10-02T15:34:32+02:00"
        },
        {
            "id": "https://hirundo.global/scaling-dtc-brand-new-markets/",
            "url": "https://hirundo.global/scaling-dtc-brand-new-markets/",
            "title": "Scaling a DTC brand into 12 new markets",
            "summary": "How a disciplined testing framework tripled ROAS in six months A fast-growing DTC brand had proven demand at home but no repeatable way to enter new markets. Every launch felt&hellip;",
            "content_html": "\n  <p>\n    How a disciplined testing framework tripled ROAS in six months\n  </p>\n\n    <h2 id=\"the-challenge\">\n      The challenge\n    </h2>\n\n  <p>\n    A fast-growing DTC brand had proven demand at home but no repeatable way to enter new markets. Every launch felt like starting from scratch, and spend outran returns.\n  </p>\n\n    <h2 id=\"our-approach\">\n      Our approach\n    </h2>\n\n  <p>\n    We built a market-by-market testing framework: a small controlled budget per market, one variable changed at a time, and a single metric of truth: contribution margin. We scaled winners and cut losers fast.\n  </p>\n\n    <h2 id=\"the-results\">\n      The results\n    </h2>\n\n  <p>\n    Within six months the brand was live in 12 new markets, return on ad spend had tripled versus the old approach, and the in-house team had a launch playbook they could run themselves.\n  </p>",
            "author": {
                "name": "Hirundo Team"
            },
            "tags": [
                   "Paid media"
            ],
            "date_published": "2026-07-08T18:46:15+02:00",
            "date_modified": "2026-07-22T20:48:27+02:00"
        },
        {
            "id": "https://hirundo.global/migration-playbook-cross-border-growth/",
            "url": "https://hirundo.global/migration-playbook-cross-border-growth/",
            "title": "The migration checklist for cross-border growth",
            "summary": "Expanding into a new market rarely fails on media budget, it fails on the translation of intent. These are the five principles we use to make campaigns travel. Localise the&hellip;",
            "content_html": "\n  <p>\n    Expanding into a new market rarely fails on media budget, it fails on the translation of intent. These are the five principles we use to make campaigns travel.\n  </p>\n\n  <ul>\n    <li><b>Localise the offer, not just the copy</b>&nbsp;- Translation is table stakes. What actually moves the needle is adapting the promotion, pricing and proof to what the local buyer already trusts.</li><li><b>Rebuild the funnel per market</b> -&nbsp;Awareness in one country is consideration in another. Map where demand already exists before deciding how much to spend creating it.<br></li><li><b>Respect the channel mix</b> -&nbsp;The dominant platform shifts by region. Lead with the channel your audience actually lives on, not the one that worked back home.<br></li><li><b>Measure in one currency of truth</b> -&nbsp;Normalise every market to the same metric, contribution margin, not last-click ROAS, so you can compare and reallocate without bias.<br></li><li><b>Staff for the timezone</b> -&nbsp;Speed of iteration wins launches. Put decision-making close to the market so tests don't wait 12 hours for approval.<br></li>\n  </ul>",
            "image": "https://hirundo.global/media/posts/5/pexels-kirandeepsingh-10053702.jpg",
            "author": {
                "name": "Hirundo Team"
            },
            "tags": [
                   "Strategy"
            ],
            "date_published": "2026-07-08T13:24:12+02:00",
            "date_modified": "2026-07-22T20:47:44+02:00"
        },
        {
            "id": "https://hirundo.global/creative-testing-without-burning-budget/",
            "url": "https://hirundo.global/creative-testing-without-burning-budget/",
            "title": "Creative testing without burning budget",
            "summary": "Most creative budgets are spent proving what we already suspected. A lean testing framework finds winners faster, and for less. Every test should answer a question: 'does social proof beat&hellip;",
            "content_html": "\n  <p>\n    Most creative budgets are spent proving what we already suspected. A lean testing framework finds winners faster, and for less.\n  </p>\n\n    <h2 id=\"start-with-a-hypothesis-not-an-asset\">\n      Start with a hypothesis, not an asset\n    </h2>\n\n  <p>\n    Every test should answer a question: 'does social proof beat urgency?' Even a loser teaches you something reusable.\n  </p>\n\n    <h2 id=\"test-one-variable-at-a-time\">\n      Test one variable at a time\n    </h2>\n\n  <p>\n    Hook, format, or offer: change one, hold the rest. Bundled changes give you a result you can't explain or repeat.\n  </p>\n\n    <h2 id=\"small-controlled-honest\">\n      Small, controlled, honest\n    </h2>\n\n  <p>\n    Equal budget, same audience, enough time to reach significance. Cheap tests that don't bring conclusions are an expensive waste.\n  </p>\n\n    <h2 id=\"kill-fast-scale-slower\">\n      Kill fast, scale slower\n    </h2>\n\n  <p>\n    Cut clear losers early, but let winners prove themselves before you pour in cash. Early winners regress more often than anyone would like.\n  </p>",
            "author": {
                "name": "Hirundo Team"
            },
            "tags": [
                   "Paid media"
            ],
            "date_published": "2026-07-08T13:23:12+02:00",
            "date_modified": "2026-07-22T20:48:40+02:00"
        },
        {
            "id": "https://hirundo.global/attribution-you-can-actually-act-on/",
            "url": "https://hirundo.global/attribution-you-can-actually-act-on/",
            "title": "Attribution you can actually act on",
            "summary": "Perfect attribution doesn't exist. Useful attribution does, the kind that tells you what to do on Monday morning. The value isn't in the model's accuracy, it's in applying the same&hellip;",
            "content_html": "\n  <p>\n    Perfect attribution doesn't exist. Useful attribution does, the kind that tells you what to do on Monday morning.\n  </p>\n\n    <h2 id=\"pick-one-model-and-commit\">\n      Pick one model and commit\n    </h2>\n\n  <p>\n    The value isn't in the model's accuracy, it's in applying the same lens consistently so trends are comparable over time.\n  </p>\n\n    <h2 id=\"fix-the-tracking-foundation\">\n      Fix the tracking foundation\n    </h2>\n\n  <p>\n    Server-side tracking and clean event naming beat any clever model sitting on top of messy data.\n  </p>\n\n    <h2 id=\"validate-with-incrementality\">\n      Validate with incrementality\n    </h2>\n\n  <p>\n    Geo-tests and holdouts answer the only question that matters: what would have happened anyway?\n  </p>\n\n    <h2 id=\"tie-every-metric-to-a-decision\">\n      Tie every metric to a decision\n    </h2>\n\n  <p>\n    If a dashboard number wouldn't change a budget or a bid, stop reporting it. Measurement exists to drive action.\n  </p>",
            "image": "https://hirundo.global/media/posts/7/pexels-reinis-bruzitis-2153679369-35828991.jpg",
            "author": {
                "name": "Hirundo Team"
            },
            "tags": [
                   "Analytics"
            ],
            "date_published": "2026-07-08T13:22:12+02:00",
            "date_modified": "2026-07-22T20:48:53+02:00"
        }
    ]
}
