1<!DOCTYPE html> 2<html lang="en"> 3 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta name="description" content="RTB.CAT - Expert programmatic media buying consulting with 24+ years experience connecting publishers with advertisers to maximize your KPIs and ROAS."> 8 <title>RTB.CAT - Programmatic Media Buying Consulting | Premium Publisher Connections</title> 9 <link rel="canonical" href="https://rtb.cat/" /> 10 11 <!-- Open Graph Tags for social sharing --> 12 <meta property="og:title" content="RTB.CAT - Programmatic Media Buying Consulting" /> 13 <meta property="og:description" content="Expert programmatic media buying for maximizing KPIs through 24+ years of experience connecting the right publishers with advertisers." /> 14 <meta property="og:type" content="website" /> 15 <meta property="og:url" content="https://rtb.cat/" /> 16 <meta property="og:site_name" content="RTB.CAT" /> 17 18 <!-- Twitter Card Tags --> 19 <meta name="twitter:card" content="summary" /> 20 <meta name="twitter:title" content="RTB.CAT - Programmatic Media Buying Consulting" /> 21 <meta name="twitter:description" content="Expert programmatic media buying for maximizing KPIs through 24+ years of experience connecting the right publishers with advertisers." /> 22 23 <!-- Google Tag Manager --> 24
24<script>
vendor: 402 bytes, lines 24-37
24 25 (function(w, d, s, l, i) { 26 w[l] = w[l] || []; 27 w[l].push({ 28 'gtm.start': new Date().getTime(), 29 event: 'gtm.js' 30 }); 31 var f = d.getElementsByTagName(s)[0], 32 j = d.createElement(s), 33 dl = l != 'dataLayer' ? '&l=' + l : ''; 34 j.async = true; 35 j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 36 f.parentNode.insertBefore(j, f); 37 })(window, document, 'script', 'dataLayer', '
37GTM-NQ55GSQ
vendor: 5 bytes, lines 37-38
37'); 38
38</script>
38 39 <!-- End Google Tag Manager --> 40 41 <!-- Facebook Pixel Code --> 42
42<script>
vendor: 482 bytes, lines 42-59
42 43 ! function(f, b, e, v, n, t, s) { 44 if (f.fbq) return; 45 n = f.fbq = function() { 46 n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments) 47 }; 48 if (!f._fbq) f._fbq = n; 49 n.push = n; 50 n.loaded = !0; 51 n.version = '2.0'; 52 n.queue = []; 53 t = b.createElement(e); 54 t.async = !0; 55 t.src = v; 56 s = b.getElementsByTagName(e)[0]; 57 s.parentNode.insertBefore(t, s) 58 }(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js'); 59 fbq('init', '
591213800238717879
vendor: 4 bytes, line 59
59');
59// Insert your pixel ID here. 60 fbq('track', 'PageView'); 61 </script>
61 62 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1213800238717879&ev=PageView&noscript=1" alt="Facebook Pixel" /></noscript> 63 64 <!-- Resource optimization --> 65 <link rel="dns-prefetch" href="https://fonts.googleapis.com/"> 66 <link rel="dns-prefetch" href="https://fonts.gstatic.com/"> 67 <link rel="preconnect" href="https://fonts.googleapis.com/"> 68 <link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin> 69 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> 70 <link rel="stylesheet" href="assets/css/core.min.css"> 71 <link rel="stylesheet" href="assets/css/vendor_bundle.min.css"> 72 <link rel="stylesheet" href="assets/css/customized.css"> 73</head> 74 75<body> 76 <!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 76-77
76 77 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
77GTM-NQ55GSQ
vendor: 84 bytes, lines 77-78
77" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 78
78<!-- End Google Tag Manager (noscript) --> 79 80 <header> 81 <div class="container"> 82 <div class="navbar"> 83 <div class="logo-section"> 84 <div class="logo">RTB.CAT</div> 85 <div class="tagline">Programmatic Media Buying Consulting</div> 86 <div class="subtitle">Results. Transparency. Access.</div> 87 </div> 88 </div> 89 </div> 90 </header> 91 92 <main> 93 <section class="intro-section" id="intro"> 94 <div class="container" data-aos="fade-right" data-aos-delay="50" data-aos-offset="0"> 95 <h1>Expert programmatic media buying for maximizing KPIs</h1> 96 <div class="box-highlight"> Connecting the right publishers with the right advertisers through 24+ years of media buying experience. </div> 97 <p class="intro-text"> I provide consulting on programmatic (RTB) media buying. I have a small team of freelancers that I have been working with for at least 10 years, each specializing in different fields of ad-tech and advertiser and publisher match-making. I started buying media 24 years ago. I connect the right publishers with the right advertisers to maximize everyone's KPIs. </p> 98 <a href="#contact" class="btn">Get Started <span class="arrow-icon">â</span></a> 99 </div> 100 </section> 101 102 <section id="services"> 103 <div class="container"> 104 <h2 class="mega-back-heading"> 105 <span class="actual-text" data-typing data-type-speed="70" data-type-cursor="true" data-type-text="Services"></span> 106 <span class="placeholder-text">Services</span> 107 </h2> 108 <h3>What I Do</h3> 109 <p> I provide consulting on programmatic (RTB) media buying. I have a small team of freelancers that I have been working with for at least 10 years, each specializing in different fields of ad-tech and advertiser and publisher match-making. I started buying media 24 years ago. I connect the right publishers with the right advertisers to maximize everyone's KPIs. </p> 110 <div class="grid-container" data-aos="fade-right" data-aos-delay="50" data-aos-offset="0"> 111 <div class="card"> 112 <h3>Publisher Matching</h3> 113 <p class="text-white"> Not all Premium publishers are a good fit for your KPIs. </p> 114 <div class="detail-toggle" tabindex="0">Learn more</div> 115 <div class="detail-content"> 116 <p class="text-white"> You will define your needs and then can use our industry connections and knowledge to connect you to the appropriate publishers with high-performing inventory perfectly matched to your target audienceâoften at better rates through direct deals than through intermediaries. </p> 117 <p class="text-white"> These relationships, built over 24 years in media buying, connect you with quality traffic sources that deliver real users with genuine purchase intent. Additionally, we analyze your current setup to identify and eliminate wasteful spend. </p> 118 </div> 119 </div> 120 <div class="card"> 121 <h3>Our Experience</h3> 122 <p class="text-white"> We maintain a comprehensive database of campaign results. </p> 123 <div class="detail-toggle" tabindex="0">Learn more</div> 124 <div class="detail-content"> 125 <p class="text-white"> Through years of direct experience running campaigns, the theme has built detailed knowledge about the actual performance of ad exchanges, programmatic email, retail media, in-house ad-server capabilities and data purity. </p> 126 <p class="text-white"> You stand to gain from this hard-won know-how. </p> 127 </div> 128 </div> 129 <div class="card"> 130 <h3>Results You Can Expect</h3> 131 <ul> 132 <li class="text-white">Introductions to proven, tested publishers or advertisers</li> 133 <li class="text-white">Removing platform fees where not warranted</li> 134 <li class="text-white">Traffic from authenticated users with genuine purchase intent</li> 135 <li class="text-white">Increased ROAS through elimination of fraudulent sources and middlemen costs</li> 136 <li class="text-white">Performance-focused campaigns with measurable business outcomes</li> 137 </ul> 138 </div> 139 <div class="card"> 140 <h3>How Easy Is It?</h3> 141 <p class="text-white"> We handle the heavy lifting for you.</p> 142 <p class="text-white"> Our process focuses specifically on your defined KPIs in Tier 1 & 2 markets, we:</p> 143 <ul> 144 <li class="text-white">Connect you with publishers that match your exact business needs - those with proven history of delivering real users</li> 145 <li class="text-white">Eliminate wasteful spend by cutting out ad fraud and poorly-performing traffic sources</li> 146 <li class="text-white">The complex work of relationship-building and technical implementation is managed by us, so you can focus on results</li> 147 <li class="text-white">Direct connections to premium publishers relevant to your audience</li> 148 <li class="text-white">Technical integrations that bypass unnecessary intermediaries</li> 149 <li class="text-white">Transparent tracking that shows exactly what you're getting</li> 150 </ul> 151 </div>
152 </div> 153 </div> 154 </section> 155 156 <div class="section-divider d-none d-lg-block"></div> 157 158 <section id="cost"> 159 <div class="container"> 160 <h2 class="mega-back-heading"> 161 <span class="actual-text" data-typing data-type-speed="70" data-type-cursor="true" data-type-text="Cost"></span> 162 <span class="placeholder-text">Cost</span> 163 </h2> 164 <h3>Cost Structure</h3> 165 <div class="details"> 166 <p>We offer flexible engagement models:</p> 167 <ul> 168 <li class="text-white">Project-based consulting with clear deliverables and timelines</li> 169 <li class="text-white">Performance-based fee structures aligned with your KPIs</li> 170 <li class="text-white">Often self-funding through the savings and performance gains we deliver</li> 171 </ul> 172 </div> 173 </div> 174 </section> 175 176 <div class="section-divider d-none d-lg-block"></div> 177 178 <section id="location"> 179 <div class="container"> 180 <h2 class="mega-back-heading"> 181 <span class="actual-text" data-typing data-type-speed="70" data-type-cursor="true" data-type-text="Location"></span> 182 <span class="placeholder-text">Location</span> 183 </h2> 184 <h3>Where to Find Us</h3> 185 <p> RTB.CAT is headquartered 30 miles south of London, with a network of specialists and publisher relationships across the US, EU, and APAC. All client engagements are personally overseen by Jen-Lars Brannstrom. </p> 186 </div> 187 </section> 188 189 <div class="section-divider d-none d-lg-block"></div> 190 191 <section id="process"> 192 <div class="container"> 193 <h2 class="mega-back-heading"> 194 <span class="actual-text" data-typing data-type-speed="70" data-type-cursor="true" data-type-text="Process"></span> 195 <span class="placeholder-text">Process</span> 196 </h2> 197 <h3>How to Get Started</h3> 198 <div class="details"> 199 <ol> 200 <li class="text-white">Initial consultation to understand your audience targeting needs</li> 201 <li class="text-white">Custom publisher recommendation and direct connection strategy</li> 202 <li class="text-white">Technical integration support and performance monitoring</li> 203 <li class="text-white">Continuous optimization and expansion of direct relationships</li> 204 </ol> 205 </div> 206 </div> 207 </section> 208 209 <div class="section-divider d-none d-lg-block"></div> 210 211 <section id="contact"> 212 <div class="container" data-aos="fade-right" data-aos-delay="50" data-aos-offset="0"> 213 <h2 class="mega-back-heading"> 214 <span class="actual-text" data-typing data-type-speed="70" data-type-cursor="true" data-type-text="Contact"></span> 215 <span class="placeholder-text">Contact</span> 216 </h2> 217 <h3>Ready to improve your KPIs?</h3> 218 <div class="contact-form"> 219 <div> 220 <!-- Overlay div to cover branding --> 221 <div class="form-logo"></div> 222 <iframe data-tally-src="https://tally.so/embed/3EgMAX?alignLeft=1&hideTitle=1&transparentBackground=1&dynamicHeight=1" loading="lazy" width="100%" frameborder="0" marginheight="0" marginwidth="0" title="Contact form"> 223 </iframe> 224 </div> 225
225<script> 226 var d = document, 227 w = "https://tally.so/widgets/embed.js", 228 v = function() { 229 "undefined" != typeof Tally ? Tally.loadEmbeds() : d.querySelectorAll("iframe[data-tally-src]:not([src])").forEach(function(e) { 230 e.src = e.dataset.tallySrc 231 }); 232 }; 233 if ("undefined" != typeof Tally) v(); 234 else if (d.querySelector('script[src="' + w + '"]') == null) { 235 var s = d.createElement("script"); 236 s.src = w; 237 s.onload = v; 238 s.onerror = v; 239 d.body.appendChild(s); 240 } 241 </script>
241 242 </div> 243 </div> 244 </section> 245 </main> 246 247 <footer class="footer"> 248 <div class="container"> 249 <p>RTB.cat © 2025 | <a href="privacy.html" style="color: inherit;">Privacy Policy</a> | <a href="contact.html" style="color: inherit;">Contact Us</a></p> 250 </div> 251 </footer> 252 253 <!-- Schema.org structured data --> 254
254<script type="application/ld+json"> 255 { 256 "@context": "https://schema.org", 257 "@type": "ProfessionalService", 258 "name": "RTB.CAT", 259 "description": "Programmatic media buying consulting specializing in connecting the right publishers with advertisers to maximize KPIs.", 260 "url": "https://rtb.cat", 261 "areaServed": [ 262 { 263 "@type": "GeoCircle", 264 "geoMidpoint": { 265 "@type": "GeoCoordinates", 266 "latitude": 51.1789, 267 "longitude": -0.1837 268 }, 269 "geoRadius": "50000" 270 } 271 ], 272 "serviceArea": { 273 "@type": "GeoShape", 274 "name": "United States, European Union, Asia-Pacific" 275 }, 276 "knowsAbout": ["Programmatic Media Buying", "RTB", "Publisher Matching", "Ad Tech", "Retail Media", "ROAS Optimization"], 277 "sameAs": [] 278 } 279 </script>
279 280 281 <!-- Core JS files --> 282
282<script src="assets/js/core.min.js"></script>
282 283
283<script src="assets/js/vendor_bundle.min.js"></script>
283 284 285 <!-- Custom scripts - Load last for performance --> 286
286<script> 287 document.addEventListener('DOMContentLoaded', function() { 288 // Get all elements with data-typing attribute 289 const typingElements = document.querySelectorAll('[data-typing]'); 290 291 // Function to check if element is in viewport 292 function isElementInViewport(el) { 293 const rect = el.getBoundingClientRect(); 294 return (rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.bottom >= 0); 295 } 296 297 // Function to handle typing effect 298 function handleTypingEffect(element) { 299 // Skip if already processed 300 if (element.dataset.typingStarted === 'true') return; 301 302 // Mark as processed 303 element.dataset.typingStarted = 'true'; 304 305 // Get typing parameters 306 const text = element.getAttribute('data-type-text') || ''; 307 const speed = parseInt(element.getAttribute('data-type-speed')) || 70; 308 const showCursor = element.getAttribute('data-type-cursor') === 'true'; 309 310 // Get parent and placeholder 311 const parent = element.parentElement; 312 const placeholder = parent.querySelector('.placeholder-text'); 313 314 // Hide placeholder text 315 if (placeholder) placeholder.style.display = 'none'; 316 317 // Clear the element text 318 element.textContent = ''; 319 320 // Add cursor if enabled 321 let cursor = null; 322 if (showCursor) { 323 cursor = document.createElement('span'); 324 cursor.className = 'typing-cursor'; 325 cursor.textContent = '|'; 326 element.after(cursor); 327 } 328 329 // Start typing 330 let i = 0; 331 function typeNextChar() { 332 if (i < text.length) { 333 element.textContent += text.charAt(i); 334 i++; 335 setTimeout(typeNextChar, speed); 336 } else if (cursor) { 337 // When typing is done, remove the cursor 338 cursor.remove(); 339 } 340 } 341 342 // Start the typing effect 343 typeNextChar(); 344 } 345 346 // Check visible elements 347 function checkVisibleElements() { 348 typingElements.forEach(function(element) { 349 if (isElementInViewport(element) && element.dataset.typingStarted !== 'true') { 350 handleTypingEffect(element); 351 } 352 }); 353 } 354 355 // Initial check with small delay to ensure everything is rendered 356 setTimeout(checkVisibleElements, 100); 357 358 // Bind scroll and resize events 359 window.addEventListener('scroll', checkVisibleElements); 360 window.addEventListener('resize', checkVisibleElements); 361 362 // Detail toggles functionality 363 const toggles = document.querySelectorAll('.detail-toggle'); 364 toggles.forEach(toggle => { 365 toggle.addEventListener('click', function() { 366 toggleDetail(this); 367 }); 368 369 // Add keyboard accessibility 370 toggle.addEventListener('keydown', function(e) { 371 if (e.key === 'Enter' || e.key === ' ') { 372 e.preventDefault(); 373 toggleDetail(this); 374 } 375 }); 376 }); 377 378 function toggleDetail(element) { 379 element.classList.toggle('active'); 380 element.textContent = element.classList.contains('active') ? 'Show less' : 'Learn more'; 381 } 382 383 // Smooth scrolling for anchor links 384 document.querySelectorAll('a[href^="#"]').forEach(anchor => { 385 anchor.addEventListener('click', function(e) { 386 if (this.getAttribute('href') !== '#') { 387 e.preventDefault(); 388 const target = document.querySelector(this.getAttribute('href')); 389 if (target) { 390 window.scrollTo({ 391 top: target.offsetTop, 392 behavior: 'smooth' 393 }); 394 } 395 } 396 }); 397 }); 398 }); 399 </script>
399 400 401 <!-- Tracking Pixels - Moved to end of body for performance --> 402 <!-- Page View Event Pixel --> 403
403<script> 404 fbq('track', 'ViewContent', { 405 value: 3.50, 406 currency: 'USD' 407 }); 408 </script>
408 409 410 <!-- Google Analytics --> 411
411<script> 412 window.ga = window.ga || function() { 413 (ga.q = ga.q || []).push(arguments) 414 }; 415 ga.l = +new Date; 416 ga('create', 'UA-90309796-1', 'auto'); 417 ga('send', 'pageview'); 418 </script>
418 419
419<script async src='https://www.google-analytics.com/analytics.js'></script>
419 420 421 <!-- AMS UK Page View --> 422
422<script type='text/javascript'> 423 var _pix = document.getElementById('_pix_id_0fb50c20-f94e-2613-4aea-3fedd9378a15'); 424 if (!_pix) { 425 var protocol = '//'; 426 var a = Math.random() * 1000000000000000000; 427 _pix = document.createElement('img'); 428 _pix.style.display = 'none'; 429 _pix.setAttribute('src', protocol + 'aax-eu.amazon-adsystem.com/s/iu3?d=forester-did&ex-fargs=%3Fid%3D0fb50c20-f94e-2613-4aea-3fedd9378a15%26type%3D55%26m%3D3&ex-fch=416613&ex-src=rtb.cat&ex-hargs=v%3D1.0%3Bc%3D2999062330702%3Bp%3D0FB50C20-F94E-2613-4AEA-3FEDD9378A15' + '&cb=' + a); 430 _pix.setAttribute('id', '_pix_id_0fb50c20-f94e-2613-4aea-3fedd9378a15'); 431 document.body.appendChild(_pix); 432 } 433 </script>
433 434 <noscript><img height='1' width='1' border='0' alt='' src='https://aax-eu.amazon-adsystem.com/s/iui3?d=forester-did&ex-fargs=%3Fid%3D0fb50c20-f94e-2613-4aea-3fedd9378a15%26type%3D55%26m%3D3&ex-fch=416613&ex-src=rtb.cat&ex-hargs=v%3D1.0%3Bc%3D2999062330702%3Bp%3D0FB50C20-F94E-2613-4AEA-3FEDD9378A15' /></noscript> 435 436 <!-- AMS US Page View --> 437
437<script type='text/javascript'> 438 var _pix = document.getElementById('_pix_id_a4c9002b-4968-26ab-6f27-9592b4c07b9c'); 439 if (!_pix) { 440 var protocol = '//'; 441 var a = Math.random() * 1000000000000000000; 442 _pix = document.createElement('img'); 443 _pix.style.display = 'none'; 444 _pix.setAttribute('src', protocol + 's.amazon-adsystem.com/iu3?d=forester-did&ex-fargs=%3Fid%3Da4c9002b-4968-26ab-6f27-9592b4c07b9c%26type%3D55%26m%3D1&ex-fch=416613&ex-src=rtb.cat&ex-hargs=v%3D1.0%3Bc%3D4491937840601%3Bp%3DA4C9002B-4968-26AB-6F27-9592B4C07B9C' + '&cb=' + a); 445 _pix.setAttribute('id', '_pix_id_a4c9002b-4968-26ab-6f27-9592b4c07b9c'); 446 document.body.appendChild(_pix); 447 } 448 </script>
448 449 <noscript><img height='1' width='1' border='0' alt='' src='https://s.amazon-adsystem.com/iui3?d=forester-did&ex-fargs=%3Fid%3Da4c9002b-4968-26ab-6f27-9592b4c07b9c%26type%3D55%26m%3D1&ex-fch=416613&ex-src=rtb.cat&ex-hargs=v%3D1.0%3Bc%3D4491937840601%3Bp%3DA4C9002B-4968-26AB-6F27-9592B4C07B9C' /></noscript> 450 451 <!-- Segment Pixel - RTBcat rtg --> 452
452<script src="https://secure.adnxs.com/seg?add=5437611&t=1" type="text/javascript"></script>
452 453 454 <!-- RevContent All Pages - Changed to HTTPS --> 455
455<script src="https://trends.revcontent.com/seg.js.php?data-rc=rc-seg-pix" id="rBqblFj7CEPHHZD4gdlbM%2Fmtl2mVs7eo7YS3DuVeIIP9CXMevtmUbeiQv0ZWN0u%2B" class="rc-seg-pix"></script>
455 456 457 <!-- Twitter universal website tag --> 458
458<script> 459 ! function(e, t, n, s, u, a) { 460 e.twq || (s = e.twq = function() { 461 s.exe ? s.exe.apply(s, arguments) : s.queue.push(arguments); 462 }, s.version = '1.1', s.queue = [], u = t.createElement(n), u.async = !0, u.src = '//static.ads-twitter.com/uwt.js', a = t.getElementsByTagName(n)[0], a.parentNode.insertBefore(u, a)) 463 }(window, document, 'script'); 464 // Insert Twitter Pixel ID and Standard Event data below 465 twq('init', 'nuzl2'); 466 twq('track', 'PageView'); 467 </script>
467 468</body> 469 470</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.