<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
    <meta name="theme-color" content="#0a84ff" />
    <meta name="format-detection" content="telephone=no" />

    <!-- Primary SEO -->
    <title>SYNC Media — Cross-Media Measurement Platform</title>
    <meta
      name="description"
      content="SYNC is a single-source cross-media intelligence platform. Measure the same people across linear TV, OTT, YouTube, Meta and digital, then connect ad exposure to real outcomes — search, commerce and app behaviour."
    />
    <meta
      name="keywords"
      content="cross-media measurement, deduplicated reach, incremental reach, audience overlap, media optimisation, outcomes measurement, advertising analytics, TV measurement, OTT measurement, single-source measurement"
    />
    <meta name="robots" content="index,follow,max-image-preview:large,max-snippet:-1" />
    <meta name="googlebot" content="index,follow" />
    <meta name="author" content="SYNC Media" />
    <link rel="canonical" href="https://www.syncmedia.io/" />

    <!-- Open Graph -->
    <meta property="og:type" content="website" />
    <meta property="og:site_name" content="SYNC Media" />
    <meta property="og:title" content="SYNC Media — Cross-Media Measurement Platform" />
    <meta
      property="og:description"
      content="Measure the same people across linear TV, OTT, YouTube, Meta and digital. De-duplicate reach and frequency, and connect ad exposure to real outcomes."
    />
    <meta property="og:url" content="https://www.syncmedia.io/" />
    <meta property="og:image" content="https://www.syncmedia.io/og/syncmedia-cross-media-measurement.png" />
    <meta property="og:locale" content="en_US" />

    <!-- Twitter -->
    <meta name="twitter:card" content="summary_large_image" />
    <meta name="twitter:title" content="SYNC Media — Cross-Media Measurement Platform" />
    <meta
      name="twitter:description"
      content="Measure the same people across linear TV, OTT, YouTube, Meta and digital. Connect ad exposure to real outcomes."
    />
    <meta name="twitter:image" content="https://www.syncmedia.io/og/syncmedia-cross-media-measurement.png" />

    <!-- Favicon & manifest -->
    <link rel="icon" type="image/x-icon" href="/favicon.ico" />
    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
    <link rel="manifest" href="/site.webmanifest" />

    <!-- Preconnect / Performance -->
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link
      href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap&display=swap"
      rel="stylesheet"
      media="print"
      onload="this.media='all'"
    />
    <noscript>
      <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet" />
    </noscript>

    <!-- Organization JSON-LD -->
    <script type="application/ld+json">
      {
        "@context": "https://schema.org",
        "@type": "Organization",
        "name": "SYNC Media",
        "alternateName": "SYNC",
        "url": "https://www.syncmedia.io/",
        "logo": "https://www.syncmedia.io/og/syncmedia-cross-media-measurement.png",
        "description": "Cross-media measurement and audience intelligence platform. Measure the same people across linear TV, OTT, YouTube, Meta and digital.",
        "sameAs": []
      }
    </script>

    <!-- WebSite JSON-LD with sitelink search -->
    <script type="application/ld+json">
      {
        "@context": "https://schema.org",
        "@type": "WebSite",
        "name": "SYNC Media",
        "url": "https://www.syncmedia.io/",
        "inLanguage": "en"
      }
    </script>

    <!-- Initial loading state (avoid blank flash before React mounts) -->
    <style>
      #initial-loader {
        position: fixed;
        inset: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        background: linear-gradient(170deg, #eef0ff 0%, #f0f5ff 60%, #f7faff 100%);
        z-index: 9999;
        transition: opacity 0.45s ease;
      }
      #initial-loader.is-hidden { opacity: 0; pointer-events: none; }
      .il-mark {
        width: 56px; height: 56px;
        border-radius: 50%;
        background: conic-gradient(from 0deg, #1d4ed8, #60a5fa, #1d4ed8);
        animation: il-spin 1.1s linear infinite;
        mask: radial-gradient(circle 22px at center, transparent 99%, #000 100%);
        -webkit-mask: radial-gradient(circle 22px at center, transparent 99%, #000 100%);
      }
      @keyframes il-spin { to { transform: rotate(360deg); } }

      /* Skip-to-content link (visible on focus only) */
      .skip-to-content {
        position: absolute;
        top: -100px;
        left: 16px;
        z-index: 10000;
        padding: 10px 18px;
        background: #1d4ed8;
        color: #ffffff;
        font-weight: 700;
        font-size: 14px;
        border-radius: 8px;
        text-decoration: none;
        transition: top 0.2s ease;
      }
      .skip-to-content:focus { top: 16px; outline: 3px solid #93c5fd; }

      /* Rich noscript fallback styling */
      .nojs-fallback {
        max-width: 880px;
        margin: 64px auto;
        padding: 0 24px;
        font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
        color: #0a0e1f;
        line-height: 1.6;
      }
      .nojs-fallback h1 {
        font-size: clamp(32px, 5vw, 56px);
        font-weight: 900;
        letter-spacing: -0.04em;
        line-height: 1.05;
        margin: 0 0 16px;
      }
      .nojs-fallback .nojs-eyebrow {
        display: inline-block;
        padding: 6px 14px;
        background: rgba(37, 99, 235, 0.08);
        color: #1d4ed8;
        font-size: 12px;
        font-weight: 700;
        letter-spacing: 0.08em;
        text-transform: uppercase;
        border-radius: 40px;
        margin-bottom: 18px;
      }
      .nojs-fallback p { font-size: 17px; color: #4a5578; margin: 0 0 16px; }
      .nojs-fallback nav {
        display: flex;
        flex-wrap: wrap;
        gap: 8px 20px;
        margin: 24px 0 36px;
        padding: 18px 22px;
        background: rgba(255, 255, 255, 0.7);
        border: 1px solid rgba(37, 99, 235, 0.12);
        border-radius: 16px;
      }
      .nojs-fallback nav a {
        color: #1d4ed8;
        font-weight: 600;
        text-decoration: none;
      }
      .nojs-fallback nav a:hover { text-decoration: underline; }
      .nojs-fallback .nojs-cta {
        display: inline-block;
        padding: 14px 26px;
        background: linear-gradient(135deg, #1d4ed8, #3b82f6);
        color: #ffffff;
        font-weight: 700;
        border-radius: 40px;
        text-decoration: none;
        box-shadow: 0 4px 16px rgba(37, 99, 235, 0.3);
      }
      .nojs-fallback h2 {
        font-size: 22px;
        font-weight: 800;
        margin: 32px 0 12px;
        color: #0a0e1f;
      }
      .nojs-fallback ul { margin: 0 0 28px; padding-left: 22px; color: #4a5578; }
      .nojs-fallback li { margin-bottom: 6px; }
      .nojs-fallback footer {
        margin-top: 48px;
        padding-top: 24px;
        border-top: 1px solid rgba(20, 40, 90, 0.1);
        font-size: 14px;
        color: #6b7a9a;
      }
    </style>
    <script type="module" crossorigin src="/assets/index-DtuaQQ2A.js"></script>
    <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-BHIDIHtm.js">
    <link rel="stylesheet" crossorigin href="/assets/index-Gy2ss8zH.css">
  </head>
  <body>
    <!-- Skip-to-content link (server-rendered, accessible from initial HTML) -->
    <a href="#main-content" class="skip-to-content">Skip to main content</a>

    <!-- Rich noscript fallback: meaningful content for users without JavaScript and for crawlers -->
    <noscript>
      <main class="nojs-fallback" role="main">
        <span class="nojs-eyebrow">Single-Source Cross-Media Measurement</span>
        <h1>Cross-media measurement for modern advertising</h1>
        <p>
          SYNC measures the same people across linear TV, OTT, YouTube, Meta and digital.
          De-duplicates reach and frequency, then connects exposure to outcomes — search,
          commerce and app behaviour.
        </p>
        <p>
          Built for advertisers, agencies and broadcasters who need one honest view of
          audiences, overlap, incremental reach and business impact.
        </p>

        <nav aria-label="Primary">
          <a href="/">Home</a>
          <a href="/platform">Platform</a>
          <a href="/platform/cross-media-measurement">Cross-Media Measurement</a>
          <a href="/platform/outcomes-measurement">Outcomes Measurement</a>
          <a href="/platform/media-optimisation">Media Optimisation</a>
          <a href="/platform/reporting-diagnostics">Reporting &amp; Diagnostics</a>
          <a href="/solutions/advertisers">For Advertisers</a>
          <a href="/solutions/agencies">For Agencies</a>
          <a href="/solutions/broadcasters">For Broadcasters</a>
          <a href="/methodology">Methodology</a>
          <a href="/case-studies">Case Studies</a>
          <a href="/blog">Blog</a>
          <a href="/about">About</a>
          <a href="/contact">Contact</a>
        </nav>

        <a href="/contact" class="nojs-cta">Book a Demo →</a>

        <h2>What SYNC measures</h2>
        <ul>
          <li>Deduplicated reach and frequency across screens</li>
          <li>Incremental audience contribution by channel</li>
          <li>Audience overlap between platforms</li>
          <li>Frequency build-up and saturation</li>
          <li>Search, commerce and app behaviour outcomes</li>
          <li>Cross-media allocation optimisation</li>
        </ul>

        <h2>Solutions</h2>
        <ul>
          <li><a href="/solutions/advertisers">Advertisers</a> — Understand what your media is truly delivering across screens.</li>
          <li><a href="/solutions/agencies">Agencies</a> — Plan smarter, defend recommendations more clearly.</li>
          <li><a href="/solutions/broadcasters">Broadcasters</a> — Help advertisers see the real value of your inventory.</li>
        </ul>

        <footer>
          <p>
            This experience requires JavaScript for full interactivity.
            For accessibility, you can browse the site using the links above,
            or contact our team directly.
          </p>
        </footer>
      </main>
    </noscript>

    <!-- App mount point -->
    <div id="root">
      <!-- Initial loader (removed after React mounts) -->
      <div id="initial-loader" role="status" aria-label="Loading SYNC Media">
        <span class="il-mark" aria-hidden="true"></span>
      </div>
    </div>

    <!-- Remove loader once React mounts -->
    <script>
      window.addEventListener("DOMContentLoaded", function () {
        // Allow React up to 4s to mount; remove loader either way
        var hideLoader = function () {
          var el = document.getElementById("initial-loader");
          if (el) { el.classList.add("is-hidden"); setTimeout(function () { el && el.parentNode && el.parentNode.removeChild(el); }, 500); }
        };
        // Hide as soon as React has rendered something into #root other than the loader
        var checkMounted = function () {
          var root = document.getElementById("root");
          if (root && root.children && root.children.length > 1) { hideLoader(); return true; }
          return false;
        };
        if (!checkMounted()) {
          var iv = setInterval(function () { if (checkMounted()) clearInterval(iv); }, 80);
          setTimeout(function () { clearInterval(iv); hideLoader(); }, 4000);
        }
      });
    </script>

  </body>
</html>
