PageSourceSearch

https://rtb.cat/

html rtb.cat collected 2026-09-24 12:19:26 UTC 19,994 bytes, 470 lines download raw bytes

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.