{"id":1637,"date":"2026-03-08T03:35:18","date_gmt":"2026-03-08T03:35:18","guid":{"rendered":"https:\/\/www.woodcentral.com\/-\/peter\/?p=1637"},"modified":"2026-05-24T11:28:09","modified_gmt":"2026-05-24T11:28:09","slug":"real-traffic-ad-estimator","status":"publish","type":"post","link":"https:\/\/www.woodcentral.com\/-\/peter\/real-traffic-ad-estimator\/","title":{"rendered":"Real traffic &amp; ad estimator"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">1. <strong>Definitions<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s define the numbers you already have:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Variable<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>CF_uv<\/code><\/td><td>Cloudflare unique visitors (all IPs, bots + humans)<\/td><\/tr><tr><td><code>CF_req<\/code><\/td><td>Cloudflare total requests<\/td><\/tr><tr><td><code>Mat_uv<\/code><\/td><td>Matomo unique visitors (JS-enabled humans)<\/td><\/tr><tr><td><code>Mat_pv<\/code><\/td><td>Matomo pageviews<\/td><\/tr><tr><td><code>bot_factor<\/code><\/td><td>Estimated % of Cloudflare traffic that is bots (0\u20131)<\/td><\/tr><tr><td><code>JS_factor<\/code><\/td><td>Fraction of real humans that trigger Matomo\/JS (0\u20131)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. <strong>Step 1: Estimate human visitors from Cloudflare<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><semantics><mrow><mi>H<\/mi><mi>u<\/mi><mi>m<\/mi><mi>a<\/mi><mi>n<\/mi><msub><mi>s<\/mi><mrow><mi>C<\/mi><mi>F<\/mi><\/mrow><\/msub><mo>=<\/mo><mi>C<\/mi><mi>F<\/mi><mi mathvariant=\"normal\">_<\/mi><mi>u<\/mi><mi>v<\/mi><mo>\u00d7<\/mo><mo stretchy=\"false\">(<\/mo><mn>1<\/mn><mo>\u2212<\/mo><mi>b<\/mi><mi>o<\/mi><mi>t<\/mi><mi mathvariant=\"normal\">_<\/mi><mi>f<\/mi><mi>a<\/mi><mi>c<\/mi><mi>t<\/mi><mi>o<\/mi><mi>r<\/mi><mo stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">Humans_{CF} = CF\\_uv \\times (1 &#8211; bot\\_factor)<\/annotation><\/semantics><\/math><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">HumansCF\u200b=CF_uv\u00d7(1\u2212bot_factor)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Example: <code>bot_factor = 0.98<\/code> (98% bots)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><semantics><mrow><mi>H<\/mi><mi>u<\/mi><mi>m<\/mi><mi>a<\/mi><mi>n<\/mi><msub><mi>s<\/mi><mrow><mi>C<\/mi><mi>F<\/mi><\/mrow><\/msub><mo>=<\/mo><mn>2,580,000<\/mn><mo>\u00d7<\/mo><mo stretchy=\"false\">(<\/mo><mn>1<\/mn><mo>\u2212<\/mo><mn>0.98<\/mn><mo stretchy=\"false\">)<\/mo><mo>=<\/mo><mn>51,600<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">Humans_{CF} = 2{,}580{,}000 \\times (1 &#8211; 0.98) = 51{,}600<\/annotation><\/semantics><\/math><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">HumansCF\u200b=2,580,000\u00d7(1\u22120.98)=51,600<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. <strong>Step 2: Adjust Matomo for JS undercounting<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><semantics><mrow><mi>H<\/mi><mi>u<\/mi><mi>m<\/mi><mi>a<\/mi><mi>n<\/mi><msub><mi>s<\/mi><mrow><mi>r<\/mi><mi>e<\/mi><mi>a<\/mi><mi>l<\/mi><\/mrow><\/msub><mo>=<\/mo><mi>M<\/mi><mi>a<\/mi><mi>t<\/mi><mi mathvariant=\"normal\">_<\/mi><mi>u<\/mi><mi>v<\/mi><mi mathvariant=\"normal\">\/<\/mi><mi>J<\/mi><mi>S<\/mi><mi mathvariant=\"normal\">_<\/mi><mi>f<\/mi><mi>a<\/mi><mi>c<\/mi><mi>t<\/mi><mi>o<\/mi><mi>r<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">Humans_{real} = Mat\\_uv \/ JS\\_factor<\/annotation><\/semantics><\/math><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Humansreal\u200b=Mat_uv\/JS_factor<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Example: <code>JS_factor = 0.05<\/code> (only 5% of humans trigger JS)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><semantics><mrow><mi>H<\/mi><mi>u<\/mi><mi>m<\/mi><mi>a<\/mi><mi>n<\/mi><msub><mi>s<\/mi><mrow><mi>r<\/mi><mi>e<\/mi><mi>a<\/mi><mi>l<\/mi><\/mrow><\/msub><mo>=<\/mo><mn>2,509<\/mn><mi mathvariant=\"normal\">\/<\/mi><mn>0.05<\/mn><mo>\u2248<\/mo><mn>50,180<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">Humans_{real} = 2{,}509 \/ 0.05 \\approx 50{,}180<\/annotation><\/semantics><\/math><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Humansreal\u200b=2,509\/0.05\u224850,180<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 Notice this roughly matches the Cloudflare-estimated human count.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. <strong>Step 3: Estimate real ad impressions<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If your ad triggers on each pageview:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><semantics><mrow><mi>A<\/mi><mi>d<\/mi><mi>I<\/mi><mi>m<\/mi><mi>p<\/mi><mi>r<\/mi><mi>e<\/mi><mi>s<\/mi><mi>s<\/mi><mi>i<\/mi><mi>o<\/mi><mi>n<\/mi><msub><mi>s<\/mi><mrow><mi>r<\/mi><mi>e<\/mi><mi>a<\/mi><mi>l<\/mi><\/mrow><\/msub><mo>=<\/mo><mi>H<\/mi><mi>u<\/mi><mi>m<\/mi><mi>a<\/mi><mi>n<\/mi><msub><mi>s<\/mi><mrow><mi>r<\/mi><mi>e<\/mi><mi>a<\/mi><mi>l<\/mi><\/mrow><\/msub><mo>\u00d7<\/mo><mi>A<\/mi><mi>v<\/mi><mi>g<\/mi><mi>P<\/mi><mi>a<\/mi><mi>g<\/mi><mi>e<\/mi><mi>s<\/mi><mi>P<\/mi><mi>e<\/mi><mi>r<\/mi><mi>H<\/mi><mi>u<\/mi><mi>m<\/mi><mi>a<\/mi><mi>n<\/mi><mo>\u00d7<\/mo><mi>A<\/mi><mi>d<\/mi><mi>E<\/mi><mi>n<\/mi><mi>g<\/mi><mi>a<\/mi><mi>g<\/mi><mi>e<\/mi><mi>m<\/mi><mi>e<\/mi><mi>n<\/mi><mi>t<\/mi><mi>F<\/mi><mi>a<\/mi><mi>c<\/mi><mi>t<\/mi><mi>o<\/mi><mi>r<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">AdImpressions_{real} = Humans_{real} \\times AvgPagesPerHuman \\times AdEngagementFactor<\/annotation><\/semantics><\/math><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">AdImpressionsreal\u200b=Humansreal\u200b\u00d7AvgPagesPerHuman\u00d7AdEngagementFactor<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>AvgPagesPerHuman<\/code> \u2248 Mat_pv \/ Mat_uv = 5,769 \/ 2,509 \u2248 2.3<\/li>\n\n\n\n<li><code>AdEngagementFactor<\/code> = fraction of pages where ad is actually viewed (0\u20131), e.g., 0.5<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><semantics><mrow><mi>A<\/mi><mi>d<\/mi><mi>I<\/mi><mi>m<\/mi><mi>p<\/mi><mi>r<\/mi><mi>e<\/mi><mi>s<\/mi><mi>s<\/mi><mi>i<\/mi><mi>o<\/mi><mi>n<\/mi><msub><mi>s<\/mi><mrow><mi>r<\/mi><mi>e<\/mi><mi>a<\/mi><mi>l<\/mi><\/mrow><\/msub><mo>=<\/mo><mn>50,180<\/mn><mo>\u00d7<\/mo><mn>2.3<\/mn><mo>\u00d7<\/mo><mn>0.5<\/mn><mo>\u2248<\/mo><mn>57,700<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">AdImpressions_{real} = 50{,}180 \\times 2.3 \\times 0.5 \\approx 57{,}700<\/annotation><\/semantics><\/math><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">AdImpressionsreal\u200b=50,180\u00d72.3\u00d70.5\u224857,700<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Compare to Cloudflare requests (8.3M) \u2014 huge difference because most requests are bots or non-engaged humans.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. <strong>Step 4: Optional shortcut formula<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><semantics><mrow><mi>A<\/mi><mi>d<\/mi><mi>I<\/mi><mi>m<\/mi><mi>p<\/mi><mi>r<\/mi><mi>e<\/mi><mi>s<\/mi><mi>s<\/mi><mi>i<\/mi><mi>o<\/mi><mi>n<\/mi><msub><mi>s<\/mi><mrow><mi>r<\/mi><mi>e<\/mi><mi>a<\/mi><mi>l<\/mi><\/mrow><\/msub><mo>\u2248<\/mo><mi>M<\/mi><mi>a<\/mi><mi>t<\/mi><mi mathvariant=\"normal\">_<\/mi><mi>u<\/mi><mi>v<\/mi><mo>\u00d7<\/mo><mfrac><mn>1<\/mn><mrow><mi>J<\/mi><mi>S<\/mi><mi mathvariant=\"normal\">_<\/mi><mi>f<\/mi><mi>a<\/mi><mi>c<\/mi><mi>t<\/mi><mi>o<\/mi><mi>r<\/mi><\/mrow><\/mfrac><mo>\u00d7<\/mo><mfrac><mrow><mi>M<\/mi><mi>a<\/mi><mi>t<\/mi><mi mathvariant=\"normal\">_<\/mi><mi>p<\/mi><mi>v<\/mi><\/mrow><mrow><mi>M<\/mi><mi>a<\/mi><mi>t<\/mi><mi mathvariant=\"normal\">_<\/mi><mi>u<\/mi><mi>v<\/mi><\/mrow><\/mfrac><mo>\u00d7<\/mo><mi>A<\/mi><mi>d<\/mi><mi>E<\/mi><mi>n<\/mi><mi>g<\/mi><mi>a<\/mi><mi>g<\/mi><mi>e<\/mi><mi>m<\/mi><mi>e<\/mi><mi>n<\/mi><mi>t<\/mi><mi>F<\/mi><mi>a<\/mi><mi>c<\/mi><mi>t<\/mi><mi>o<\/mi><mi>r<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">AdImpressions_{real} \\approx Mat\\_uv \\times \\frac{1}{JS\\_factor} \\times \\frac{Mat\\_pv}{Mat\\_uv} \\times AdEngagementFactor<\/annotation><\/semantics><\/math><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">AdImpressionsreal\u200b\u2248Mat_uv\u00d7JS_factor1\u200b\u00d7Mat_uvMat_pv\u200b\u00d7AdEngagementFactor<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Only requires <strong>Matomo numbers + your estimate of JS coverage + ad view factor<\/strong>.<\/li>\n\n\n\n<li>No need to deal directly with raw Cloudflare numbers unless you want bot analysis.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.woodcentral.com\/?p=calc\/Real_Traffic_Ad_Estimator\">Real Traffic &amp; Ad Estimator<\/a><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>1. Definitions Let\u2019s define the numbers you already have: Variable Meaning CF_uv Cloudflare unique visitors (all IPs, bots + humans) CF_req Cloudflare total requests Mat_uv Matomo unique visitors (JS-enabled humans) Mat_pv Matomo pageviews bot_factor Estimated % of Cloudflare traffic that is bots (0\u20131) JS_factor Fraction of real humans that trigger Matomo\/JS (0\u20131) 2. Step 1: &#8230; <a title=\"Real traffic &amp; ad estimator\" class=\"read-more\" href=\"https:\/\/www.woodcentral.com\/-\/peter\/real-traffic-ad-estimator\/\" aria-label=\"Read more about Real traffic &amp; ad estimator\">Read more<\/a><\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1637","post","type-post","status-publish","format-standard","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/www.woodcentral.com\/-\/peter\/wp-json\/wp\/v2\/posts\/1637","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.woodcentral.com\/-\/peter\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.woodcentral.com\/-\/peter\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.woodcentral.com\/-\/peter\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.woodcentral.com\/-\/peter\/wp-json\/wp\/v2\/comments?post=1637"}],"version-history":[{"count":0,"href":"https:\/\/www.woodcentral.com\/-\/peter\/wp-json\/wp\/v2\/posts\/1637\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.woodcentral.com\/-\/peter\/wp-json\/wp\/v2\/media?parent=1637"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.woodcentral.com\/-\/peter\/wp-json\/wp\/v2\/categories?post=1637"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.woodcentral.com\/-\/peter\/wp-json\/wp\/v2\/tags?post=1637"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}