{"product_id":"cpm","title":"CPM Calculator","description":"\u003cstyle\u003e\n.cpm-calculator {\n  --ink: #0f172a;\n  --muted: #475569;\n  --border: #e2e8f0;\n  --surface: #ffffff;\n  --tint: #f8fafc;\n  --primary: #1d4ed8;\n  --accent: #c2410c;\n  --accent-hover: #9a3412;\n  --chart-1: #1e40af;\n  --chart-2: #0d9488;\n  --chart-3: #7c3aed;\n  --chart-4: #be185d;\n  --chart-5: #334155;\n  color: var(--ink);\n  background: var(--tint);\n  border: 1px solid var(--border);\n  border-radius: 8px;\n  padding: 24px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Arial, sans-serif;\n  font-size: 15px;\n  line-height: 1.55;\n  container-type: inline-size;\n  width: 100%;\n  max-width: 1200px;\n  margin: 0 auto;\n  box-shadow: 0 1px 2px rgba(15, 23, 42, .06);\n}\n.cpm-calculator,\n.cpm-calculator *,\n.cpm-calculator *::before,\n.cpm-calculator *::after { box-sizing: border-box; }\n.cpm-calculator * { min-width: 0; }\n.cpm-calculator h2,\n.cpm-calculator h3,\n.cpm-calculator p { margin-top: 0; }\n.cpm-calculator h2 { font-size: 24px; line-height: 1.25; font-weight: 700; margin-bottom: 8px; }\n.cpm-calculator h3 { font-size: 18px; line-height: 1.35; font-weight: 650; margin-bottom: 12px; }\n.cpm-calculator a { color: var(--primary); text-underline-offset: 2px; }\n.cpm-calculator a:hover { text-decoration-thickness: 2px; }\n.cpm-calculator button,\n.cpm-calculator input,\n.cpm-calculator select { font: inherit; }\n.cpm-calculator button { cursor: pointer; }\n.cpm-header { margin-bottom: 16px; }\n.cpm-subtitle { color: var(--muted); margin-bottom: 16px; max-width: 760px; }\n.cpm-pills { display: flex; flex-wrap: wrap; gap: 8px; }\n.cpm-pill { display: inline-flex; align-items: baseline; gap: 6px; border: 1px solid var(--border); background: var(--surface); border-radius: 999px; padding: 6px 10px; font-size: 13px; font-weight: 500; color: var(--muted); font-variant-numeric: tabular-nums; }\n.cpm-pill strong { color: var(--ink); font-weight: 700; }\n.cpm-toolbar { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 16px; }\n.cpm-btn { border: 1px solid var(--border); border-radius: 6px; min-height: 44px; padding: 10px 16px; background: var(--surface); color: var(--ink); font-weight: 650; display: inline-flex; align-items: center; justify-content: center; gap: 10px; box-shadow: 0 1px 2px rgba(15, 23, 42, .06); }\n.cpm-btn:hover { border-color: #94a3b8; box-shadow: 0 2px 5px rgba(15, 23, 42, .10); }\n.cpm-btn:focus-visible,\n.cpm-calculator input:focus-visible,\n.cpm-calculator select:focus-visible,\n.cpm-calculator summary:focus-visible { outline: 3px solid rgba(29, 78, 216, .35); outline-offset: 2px; }\n.cpm-download { background: var(--accent); color: #ffffff; border-color: var(--accent); padding: 12px 18px; white-space: nowrap; }\n.cpm-download:hover { background: var(--accent-hover); border-color: var(--accent-hover); }\n.cpm-download svg { width: 18px; height: 18px; flex: 0 0 auto; }\n.cpm-workspace { display: grid; grid-template-columns: 1fr; gap: 16px; align-items: start; }\n.cpm-panel,\n.cpm-card,\n.cpm-chart-card,\n.cpm-table-card,\n.cpm-education { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 20px; box-shadow: 0 1px 2px rgba(15, 23, 42, .06); }\n.cpm-campaign { display: grid; gap: 16px; }\n.cpm-field-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; align-items: start; }\n.cpm-field { display: flex; flex-direction: column; gap: 6px; }\n.cpm-label { font-size: 14px; font-weight: 600; color: var(--ink); }\n.cpm-input,\n.cpm-select { width: 100%; min-height: 44px; border: 1px solid #cbd5e1; border-radius: 6px; background: var(--surface); color: var(--ink); padding: 10px 12px; font-variant-numeric: tabular-nums; }\n.cpm-input[readonly] { background: #f1f5f9; color: #1e293b; font-weight: 700; }\n.cpm-help { min-height: 40px; font-size: 13px; line-height: 1.45; font-weight: 500; color: var(--muted); }\n.cpm-error { min-height: 19px; font-size: 13px; font-weight: 600; color: #b91c1c; }\n.cpm-input[aria-invalid=\"true\"] { border-color: #b91c1c; }\n.cpm-toggle-row { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; padding-top: 4px; }\n.cpm-checkbox { width: 20px; height: 20px; accent-color: var(--primary); }\n.cpm-toggle-label { font-size: 14px; font-weight: 650; }\n.cpm-secondary { margin-top: 16px; border-top: 1px solid var(--border); padding-top: 16px; }\n.cpm-secondary[hidden] { display: none; }\n.cpm-results { display: grid; gap: 16px; }\n.cpm-primary-result { border-left: 4px solid var(--primary); background: #eff6ff; padding: 16px; border-radius: 6px; }\n.cpm-eyebrow { color: var(--muted); font-size: 13px; font-weight: 600; margin-bottom: 4px; }\n.cpm-result-value { font-size: 30px; line-height: 1.2; font-weight: 700; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }\n.cpm-result-detail { margin-top: 6px; color: var(--muted); font-size: 13px; font-weight: 500; }\n.cpm-result-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(145px, 1fr)); gap: 12px; }\n.cpm-metric { border: 1px solid var(--border); border-radius: 6px; padding: 12px; background: var(--surface); }\n.cpm-metric-label { color: var(--muted); font-size: 13px; font-weight: 600; }\n.cpm-metric-value { margin-top: 4px; font-size: 20px; line-height: 1.25; font-weight: 700; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }\n.cpm-comparison { border: 1px solid var(--border); border-radius: 6px; padding: 12px; background: var(--tint); }\n.cpm-comparison p { margin-bottom: 0; }\n.cpm-breakdown { margin-top: 16px; }\n.cpm-chart-card { display: grid; row-gap: 16px; }\n.cpm-chart-intro { color: var(--muted); margin-bottom: 0; }\n.cpm-chart-cluster { display: grid; grid-template-columns: 1fr; gap: 20px; align-items: center; justify-items: center; max-width: 820px; margin: 0 auto; width: 100%; }\n.cpm-plot-wrap { width: min(100%, 520px); min-height: 248px; display: flex; align-items: center; justify-content: center; }\n.cpm-chart-svg { display: block; width: 100%; height: auto; overflow: visible; }\n.cpm-legend { display: grid; gap: 10px; width: min(100%, 340px); }\n.cpm-legend-row { display: grid; grid-template-columns: 12px minmax(0, auto) auto; align-items: center; justify-content: start; column-gap: 10px; row-gap: 4px; font-size: 13px; font-weight: 500; }\n.cpm-swatch { width: 12px; height: 12px; border-radius: 3px; }\n.cpm-legend-label { color: var(--ink); }\n.cpm-legend-value { color: var(--muted); font-variant-numeric: tabular-nums; white-space: nowrap; }\n.cpm-chart-callout { margin-top: 16px; border: 1px solid var(--border); border-radius: 6px; padding: 10px 12px; background: var(--tint); color: var(--muted); font-size: 13px; font-weight: 500; }\n.cpm-chart-svg[hidden],\n.cpm-legend[hidden] { display: none; }\n.cpm-chart-empty-state .cpm-plot-wrap { min-height: auto; }\n.cpm-chart-empty-state .cpm-chart-cluster { display: block; }\n.cpm-empty { border: 1px dashed #94a3b8; border-radius: 6px; padding: 18px; color: var(--muted); text-align: center; width: 100%; }\n.cpm-safe-stack .cpm-chart-cluster { grid-template-columns: 1fr !important; row-gap: 24px !important; }\n.cpm-safe-stack .cpm-chart-callout { margin-top: 20px !important; }\n.cpm-table-card { margin-top: 16px; }\n.cpm-table-wrap { overflow-x: auto; width: 100%; }\n.cpm-table { width: 100%; border-collapse: collapse; min-width: 640px; font-variant-numeric: tabular-nums; }\n.cpm-table th,\n.cpm-table td { border-bottom: 1px solid var(--border); padding: 10px 12px; text-align: left; vertical-align: top; }\n.cpm-table th { background: #e2e8f0; color: var(--ink); font-size: 13px; font-weight: 700; }\n.cpm-table td { font-size: 14px; }\n.cpm-table td:not(:first-child),\n.cpm-table th:not(:first-child) { text-align: right; }\n.cpm-table-note { margin-top: 16px; border: 1px solid var(--border); border-radius: 6px; padding: 10px 12px; background: var(--tint); color: var(--muted); font-size: 13px; font-weight: 500; }\n.cpm-safe-table-stack .cpm-table-note { margin-top: 20px !important; }\n.cpm-education { margin-top: 16px; }\n.cpm-education-grid { display: grid; grid-template-columns: 1fr; gap: 24px; }\n.cpm-education section { min-width: 0; }\n.cpm-education ul { padding-left: 20px; margin-top: 0; }\n.cpm-education li { margin-bottom: 8px; }\n.cpm-formula { border-left: 4px solid var(--primary); background: #eff6ff; border-radius: 0 6px 6px 0; padding: 12px 16px; font-weight: 650; font-variant-numeric: tabular-nums; }\n.cpm-sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border: 0 !important; }\n@container (min-width: 900px) {\n  .cpm-workspace { grid-template-columns: minmax(0, 1fr) minmax(320px, .88fr); }\n}\n@container (min-width: 640px) {\n  .cpm-chart-cluster { grid-template-columns: minmax(320px, 520px) minmax(220px, 300px); justify-content: center; justify-items: stretch; }\n  .cpm-education-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n}\n@container (max-width: 639px) {\n  .cpm-chart-cluster { grid-template-columns: 1fr; }\n  .cpm-legend { justify-self: center; }\n}\n@media (max-width: 480px) {\n  .cpm-calculator { padding: 12px; }\n  .cpm-panel,\n  .cpm-card,\n  .cpm-chart-card,\n  .cpm-table-card,\n  .cpm-education { padding: 16px; }\n  .cpm-toolbar { display: grid; grid-template-columns: 1fr; }\n  .cpm-btn { width: 100%; }\n  .cpm-field-grid { grid-template-columns: 1fr; }\n  .cpm-plot-wrap { min-height: 220px; }\n}\n\u003c\/style\u003e\n\u003cdiv class=\"cpm-calculator\" data-calculator-root\u003e\n  \u003cheader class=\"cpm-header\"\u003e\n    \u003ch2\u003eCPM Calculator\u003c\/h2\u003e\n    \u003cp class=\"cpm-subtitle\"\u003eCalculate cost per thousand impressions, required campaign budget, or achievable impressions—and optionally compare two campaigns side by side.\u003c\/p\u003e\n    \u003cdiv class=\"cpm-pills\" aria-label=\"Live campaign summary\"\u003e\n      \u003cspan class=\"cpm-pill\"\u003eCPM \u003cstrong class=\"cpm-pill-cpm\"\u003e—\u003c\/strong\u003e\u003c\/span\u003e\n      \u003cspan class=\"cpm-pill\"\u003eBudget \u003cstrong class=\"cpm-pill-cost\"\u003e—\u003c\/strong\u003e\u003c\/span\u003e\n      \u003cspan class=\"cpm-pill\"\u003eImpressions \u003cstrong class=\"cpm-pill-impressions\"\u003e—\u003c\/strong\u003e\u003c\/span\u003e\n      \u003cspan class=\"cpm-pill\"\u003eCost \/ impression \u003cstrong class=\"cpm-pill-cpi\"\u003e—\u003c\/strong\u003e\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/header\u003e\n\n  \u003cdiv class=\"cpm-toolbar\" role=\"toolbar\" aria-label=\"Calculator actions\"\u003e\n    \u003cbutton type=\"button\" class=\"cpm-btn cpm-download\"\u003e\n      \u003csvg viewbox=\"0 0 24 24\" aria-hidden=\"true\"\u003e\u003cpath fill=\"currentColor\" d=\"M12 3a1 1 0 0 1 1 1v9.59l2.3-2.3a1 1 0 1 1 1.4 1.42l-4 4a1 1 0 0 1-1.4 0l-4-4a1 1 0 1 1 1.4-1.42l2.3 2.3V4a1 1 0 0 1 1-1Zm-7 15a1 1 0 0 1 1 1v1h12v-1a1 1 0 1 1 2 0v2a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n      Download Excel\n    \u003c\/button\u003e\n    \u003cbutton type=\"button\" class=\"cpm-btn cpm-reset\"\u003eReset\u003c\/button\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv class=\"cpm-workspace\"\u003e\n    \u003csection class=\"cpm-panel\" aria-labelledby=\"cpm-inputs-title\"\u003e\n      \u003ch3 id=\"cpm-inputs-title\"\u003eCampaign inputs\u003c\/h3\u003e\n      \u003cdiv class=\"cpm-campaign\" data-cpm-campaign=\"1\"\u003e\n        \u003cdiv class=\"cpm-field-grid\"\u003e\n          \u003cdiv class=\"cpm-field\"\u003e\n            \u003clabel class=\"cpm-label\" for=\"cpm-solve-1\"\u003eCalculate\u003c\/label\u003e\n            \u003cselect class=\"cpm-select cpm-solve\" id=\"cpm-solve-1\"\u003e\n              \u003coption value=\"cpm\"\u003eCPM\u003c\/option\u003e\n              \u003coption value=\"cost\"\u003eTotal cost\u003c\/option\u003e\n              \u003coption value=\"impressions\"\u003eImpressions\u003c\/option\u003e\n            \u003c\/select\u003e\n            \u003cdiv class=\"cpm-help\"\u003eChoose the metric to solve from the other two values.\u003c\/div\u003e\n            \u003cdiv class=\"cpm-error\" id=\"cpm-error-solve1\" data-cpm-error=\"solve1\"\u003e\u003c\/div\u003e\n          \u003c\/div\u003e\n          \u003cdiv class=\"cpm-field\"\u003e\n            \u003clabel class=\"cpm-label\" for=\"cpm-cost-1\"\u003eTotal campaign cost\u003c\/label\u003e\n            \u003cinput class=\"cpm-input cpm-cost\" id=\"cpm-cost-1\" type=\"text\" inputmode=\"decimal\" value=\"$500.00\" autocomplete=\"off\"\u003e\n            \u003cdiv class=\"cpm-help\"\u003eAd spend or billed media cost in U.S. dollars.\u003c\/div\u003e\n            \u003cdiv class=\"cpm-error\" id=\"cpm-error-cost1\" data-cpm-error=\"cost1\"\u003e\u003c\/div\u003e\n          \u003c\/div\u003e\n          \u003cdiv class=\"cpm-field\"\u003e\n            \u003clabel class=\"cpm-label\" for=\"cpm-cpm-1\"\u003eCost per 1,000 impressions\u003c\/label\u003e\n            \u003cinput class=\"cpm-input cpm-cpm\" id=\"cpm-cpm-1\" type=\"text\" inputmode=\"decimal\" value=\"$5.00\" autocomplete=\"off\" readonly\u003e\n            \u003cdiv class=\"cpm-help\"\u003eThe amount paid for each block of 1,000 impressions.\u003c\/div\u003e\n            \u003cdiv class=\"cpm-error\" id=\"cpm-error-cpm1\" data-cpm-error=\"cpm1\"\u003e\u003c\/div\u003e\n          \u003c\/div\u003e\n          \u003cdiv class=\"cpm-field\"\u003e\n            \u003clabel class=\"cpm-label\" for=\"cpm-impressions-1\"\u003eNumber of impressions\u003c\/label\u003e\n            \u003cinput class=\"cpm-input cpm-impressions\" id=\"cpm-impressions-1\" type=\"text\" inputmode=\"numeric\" value=\"100,000\" autocomplete=\"off\"\u003e\n            \u003cdiv class=\"cpm-help\"\u003eTotal ad displays, not unique people or clicks.\u003c\/div\u003e\n            \u003cdiv class=\"cpm-error\" id=\"cpm-error-impressions1\" data-cpm-error=\"impressions1\"\u003e\u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"cpm-secondary\"\u003e\n        \u003cdiv class=\"cpm-toggle-row\"\u003e\n          \u003cinput class=\"cpm-checkbox cpm-enable-second\" id=\"cpm-enable-second\" type=\"checkbox\"\u003e\n          \u003clabel class=\"cpm-toggle-label\" for=\"cpm-enable-second\"\u003eCompare a second campaign\u003c\/label\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"cpm-secondary cpm-second-panel\" data-cpm-campaign=\"2\" hidden\u003e\n          \u003ch3\u003eSecond campaign\u003c\/h3\u003e\n          \u003cdiv class=\"cpm-field-grid\"\u003e\n            \u003cdiv class=\"cpm-field\"\u003e\n              \u003clabel class=\"cpm-label\" for=\"cpm-solve-2\"\u003eCalculate\u003c\/label\u003e\n              \u003cselect class=\"cpm-select cpm-solve\" id=\"cpm-solve-2\"\u003e\n                \u003coption value=\"cpm\"\u003eCPM\u003c\/option\u003e\n                \u003coption value=\"cost\"\u003eTotal cost\u003c\/option\u003e\n                \u003coption value=\"impressions\"\u003eImpressions\u003c\/option\u003e\n              \u003c\/select\u003e\n              \u003cdiv class=\"cpm-help\"\u003eChoose the metric to solve for campaign two.\u003c\/div\u003e\n              \u003cdiv class=\"cpm-error\" id=\"cpm-error-solve2\" data-cpm-error=\"solve2\"\u003e\u003c\/div\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"cpm-field\"\u003e\n              \u003clabel class=\"cpm-label\" for=\"cpm-cost-2\"\u003eTotal campaign cost\u003c\/label\u003e\n              \u003cinput class=\"cpm-input cpm-cost\" id=\"cpm-cost-2\" type=\"text\" inputmode=\"decimal\" value=\"$900.00\" autocomplete=\"off\"\u003e\n              \u003cdiv class=\"cpm-help\"\u003eUse the same cost scope as campaign one.\u003c\/div\u003e\n              \u003cdiv class=\"cpm-error\" id=\"cpm-error-cost2\" data-cpm-error=\"cost2\"\u003e\u003c\/div\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"cpm-field\"\u003e\n              \u003clabel class=\"cpm-label\" for=\"cpm-cpm-2\"\u003eCost per 1,000 impressions\u003c\/label\u003e\n              \u003cinput class=\"cpm-input cpm-cpm\" id=\"cpm-cpm-2\" type=\"text\" inputmode=\"decimal\" value=\"$6.00\" autocomplete=\"off\" readonly\u003e\n              \u003cdiv class=\"cpm-help\"\u003eLower CPM usually means cheaper reach.\u003c\/div\u003e\n              \u003cdiv class=\"cpm-error\" id=\"cpm-error-cpm2\" data-cpm-error=\"cpm2\"\u003e\u003c\/div\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"cpm-field\"\u003e\n              \u003clabel class=\"cpm-label\" for=\"cpm-impressions-2\"\u003eNumber of impressions\u003c\/label\u003e\n              \u003cinput class=\"cpm-input cpm-impressions\" id=\"cpm-impressions-2\" type=\"text\" inputmode=\"numeric\" value=\"150,000\" autocomplete=\"off\"\u003e\n              \u003cdiv class=\"cpm-help\"\u003eEnter all delivered or planned impressions.\u003c\/div\u003e\n              \u003cdiv class=\"cpm-error\" id=\"cpm-error-impressions2\" data-cpm-error=\"impressions2\"\u003e\u003c\/div\u003e\n            \u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/section\u003e\n\n    \u003csection class=\"cpm-card cpm-results\" aria-labelledby=\"cpm-results-title\"\u003e\n      \u003ch3 id=\"cpm-results-title\"\u003eLive results\u003c\/h3\u003e\n      \u003cdiv class=\"cpm-primary-result\"\u003e\n        \u003cdiv class=\"cpm-eyebrow\"\u003eCampaign 1 CPM\u003c\/div\u003e\n        \u003cdiv class=\"cpm-result-value cpm-primary-value\"\u003e—\u003c\/div\u003e\n        \u003cdiv class=\"cpm-result-detail cpm-primary-detail\"\u003eEnter two valid values to calculate the third.\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"cpm-result-grid\"\u003e\n        \u003cdiv class=\"cpm-metric\"\u003e\n\u003cdiv class=\"cpm-metric-label\"\u003eTotal cost\u003c\/div\u003e\n\u003cdiv class=\"cpm-metric-value cpm-result-cost\"\u003e—\u003c\/div\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"cpm-metric\"\u003e\n\u003cdiv class=\"cpm-metric-label\"\u003eImpressions\u003c\/div\u003e\n\u003cdiv class=\"cpm-metric-value cpm-result-impressions\"\u003e—\u003c\/div\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"cpm-metric\"\u003e\n\u003cdiv class=\"cpm-metric-label\"\u003eCost per impression\u003c\/div\u003e\n\u003cdiv class=\"cpm-metric-value cpm-result-cpi\"\u003e—\u003c\/div\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"cpm-metric\"\u003e\n\u003cdiv class=\"cpm-metric-label\"\u003eImpressions per $1\u003c\/div\u003e\n\u003cdiv class=\"cpm-metric-value cpm-result-reach\"\u003e—\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"cpm-comparison cpm-comparison-box\" hidden\u003e\n        \u003cdiv class=\"cpm-eyebrow\"\u003eCampaign comparison\u003c\/div\u003e\n        \u003cp class=\"cpm-comparison-text\"\u003e—\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"cpm-sr-only cpm-live\" aria-live=\"polite\"\u003e\u003c\/div\u003e\n    \u003c\/section\u003e\n  \u003c\/div\u003e\n\n  \u003csection class=\"cpm-breakdown cpm-chart-card\" aria-labelledby=\"cpm-chart-title\"\u003e\n    \u003cdiv\u003e\n      \u003ch3 id=\"cpm-chart-title\"\u003eCPM comparison\u003c\/h3\u003e\n      \u003cp class=\"cpm-chart-intro\"\u003eThe bars compare the cost required to buy 1,000 impressions in each active campaign.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"cpm-chart-cluster\"\u003e\n      \u003cdiv class=\"cpm-plot-wrap\"\u003e\n        \u003csvg class=\"cpm-chart-svg\" role=\"img\" aria-labelledby=\"cpm-chart-title cpm-chart-desc\" viewbox=\"0 0 520 248\"\u003e\u003c\/svg\u003e\n        \u003cdiv class=\"cpm-empty cpm-chart-empty\" hidden\u003eEnter valid campaign values to see the CPM comparison.\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"cpm-legend\" aria-label=\"Chart legend\"\u003e\u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"cpm-chart-callout cpm-chart-caption\"\u003eCampaign 1 currently costs $5.00 per 1,000 impressions.\u003c\/div\u003e\n    \u003cdiv class=\"cpm-sr-only\" id=\"cpm-chart-desc\"\u003e\u003c\/div\u003e\n    \u003cdiv class=\"cpm-sr-only cpm-chart-data\"\u003e\u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003csection class=\"cpm-table-card\" aria-labelledby=\"cpm-table-title\"\u003e\n    \u003ch3 id=\"cpm-table-title\"\u003eCampaign detail table\u003c\/h3\u003e\n    \u003cdiv class=\"cpm-table-wrap\"\u003e\n      \u003ctable class=\"cpm-table\"\u003e\n        \u003cthead\u003e\u003ctr\u003e\n\u003cth scope=\"col\"\u003eCampaign\u003c\/th\u003e\n\u003cth scope=\"col\"\u003eTotal cost\u003c\/th\u003e\n\u003cth scope=\"col\"\u003eImpressions\u003c\/th\u003e\n\u003cth scope=\"col\"\u003eCPM\u003c\/th\u003e\n\u003cth scope=\"col\"\u003eCost \/ impression\u003c\/th\u003e\n\u003cth scope=\"col\"\u003eImpressions \/ $1\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n        \u003ctbody class=\"cpm-table-body\"\u003e\u003c\/tbody\u003e\n      \u003c\/table\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"cpm-table-note\"\u003eUse CPM to compare reach cost, but evaluate click quality, conversions, audience fit, and placement quality before deciding which campaign is better.\u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003carticle class=\"cpm-education\"\u003e\n    \u003ch2\u003eHow to use and interpret the CPM calculator\u003c\/h2\u003e\n    \u003cdiv class=\"cpm-education-grid\"\u003e\n      \u003csection\u003e\n        \u003ch3\u003eWhat CPM measures\u003c\/h3\u003e\n        \u003cp\u003eCPM means “cost per mille,” where \u003cem\u003emille\u003c\/em\u003e means one thousand. It standardizes advertising cost by showing how much you pay for every 1,000 ad impressions. This makes campaigns with different budgets and audience sizes easier to compare. A $500 campaign that delivers 100,000 impressions has a CPM of $5.00, while a $500 campaign that delivers only 50,000 impressions has a CPM of $10.00.\u003c\/p\u003e\n        \u003cp\u003eCPM is a reach-efficiency metric, not a profitability metric. A low CPM indicates inexpensive exposure, but it does not prove that the audience noticed the ad, clicked it, or purchased. For measurement terminology and media standards, consult the \u003ca href=\"https:\/\/www.iab.com\/guidelines\/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eInteractive Advertising Bureau guidelines\u003c\/a\u003e. Platform reporting conventions may differ, so confirm how each platform defines an impression.\u003c\/p\u003e\n        \u003cdiv class=\"cpm-formula\"\u003eCPM = Total campaign cost ÷ Impressions × 1,000\u003c\/div\u003e\n      \u003c\/section\u003e\n      \u003csection\u003e\n        \u003ch3\u003eField-by-field guidance\u003c\/h3\u003e\n        \u003cul\u003e\n          \u003cli\u003e\n\u003cstrong\u003eCalculate:\u003c\/strong\u003e Select the missing metric. Choose CPM when you know spend and impressions. Choose total cost when you know a quoted CPM and target reach. Choose impressions when you know the budget and CPM.\u003c\/li\u003e\n          \u003cli\u003e\n\u003cstrong\u003eTotal campaign cost:\u003c\/strong\u003e Enter the media spend that corresponds to the reported impressions. Keep the scope consistent. Including creative production in one campaign but excluding it in another makes the comparison misleading.\u003c\/li\u003e\n          \u003cli\u003e\n\u003cstrong\u003eCost per 1,000 impressions:\u003c\/strong\u003e Enter the platform’s CPM quote or let the calculator derive it. Higher CPM means each thousand impressions costs more. Zero CPM cannot be used to calculate impressions because division by zero has no meaningful campaign interpretation.\u003c\/li\u003e\n          \u003cli\u003e\n\u003cstrong\u003eNumber of impressions:\u003c\/strong\u003e Enter total ad displays, not unique people. One person can generate several impressions. Impressions must be greater than zero when calculating CPM.\u003c\/li\u003e\n          \u003cli\u003e\n\u003cstrong\u003eCompare a second campaign:\u003c\/strong\u003e Turn this on to evaluate two campaigns using the same formulas and cost scope. The lower-CPM campaign buys reach more cheaply, but may not produce better outcomes.\u003c\/li\u003e\n        \u003c\/ul\u003e\n      \u003c\/section\u003e\n      \u003csection\u003e\n        \u003ch3\u003eUnderstanding every result\u003c\/h3\u003e\n        \u003cp\u003e\u003cstrong\u003eCampaign CPM\u003c\/strong\u003e is the primary result: the cost of 1,000 impressions. \u003cstrong\u003eTotal cost\u003c\/strong\u003e is the spend needed or observed. \u003cstrong\u003eImpressions\u003c\/strong\u003e is the delivered or estimated ad exposure count. \u003cstrong\u003eCost per impression\u003c\/strong\u003e divides the campaign cost by all impressions and is usually a small fraction of a dollar. \u003cstrong\u003eImpressions per $1\u003c\/strong\u003e reverses that relationship and shows the amount of exposure purchased by one dollar.\u003c\/p\u003e\n        \u003cp\u003eThe chart represents active campaigns with one bar per CPM value. A longer bar means more expensive reach. The legend and detail table use the same computed data as the chart. When only one campaign is active, its bar is explicitly treated as the sole 100% comparison category. When both campaigns are active, the comparison message reports the absolute and percentage CPM difference.\u003c\/p\u003e\n        \u003cp\u003eA zero or blank result usually means the required inputs are missing or invalid. Negative spend, negative CPM, and negative impressions are rejected because they do not describe a standard paid-media campaign. Extremely small impression counts can create very high CPM values; verify that the platform export covers the intended reporting period.\u003c\/p\u003e\n      \u003c\/section\u003e\n      \u003csection\u003e\n        \u003ch3\u003ePractical interpretation and common mistakes\u003c\/h3\u003e\n        \u003cp\u003eUse CPM to compare channels that serve a similar objective, audience, geography, format, and time period. Display, video, connected TV, and social placements can have structurally different CPMs because inventory quality and targeting differ. The \u003ca href=\"https:\/\/support.google.com\/google-ads\/answer\/6310\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGoogle Ads CPM explanation\u003c\/a\u003e describes cost-per-thousand bidding, while the \u003ca href=\"https:\/\/www.facebook.com\/business\/help\/447834205249495\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eMeta Business Help Center\u003c\/a\u003e provides context for reach and impression reporting.\u003c\/p\u003e\n        \u003cp\u003eCommon mistakes include mixing gross and net media cost, comparing different attribution windows, using reach instead of impressions, and optimizing only for the lowest CPM. A campaign can have a higher CPM yet deliver a more valuable audience, better viewability, or stronger conversion rate. Pair CPM with click-through rate, cost per click, conversion rate, cost per acquisition, and return on ad spend when those outcomes matter.\u003c\/p\u003e\n        \u003cp\u003eChanging assumptions has predictable effects. With impressions fixed, increasing cost raises CPM proportionally. With cost fixed, increasing impressions lowers CPM. With CPM fixed, doubling the target impressions doubles the required budget. With budget fixed, reducing CPM increases achievable impressions. Run several scenarios to establish a realistic range rather than relying on a single forecast.\u003c\/p\u003e\n      \u003c\/section\u003e\n      \u003csection\u003e\n        \u003ch3\u003eFormula rearrangements\u003c\/h3\u003e\n        \u003cp\u003eThe same relationship solves all three variables:\u003c\/p\u003e\n        \u003cul\u003e\n          \u003cli\u003e\n\u003cstrong\u003eCPM:\u003c\/strong\u003e cost ÷ impressions × 1,000.\u003c\/li\u003e\n          \u003cli\u003e\n\u003cstrong\u003eTotal cost:\u003c\/strong\u003e CPM × impressions ÷ 1,000.\u003c\/li\u003e\n          \u003cli\u003e\n\u003cstrong\u003eImpressions:\u003c\/strong\u003e cost ÷ CPM × 1,000.\u003c\/li\u003e\n        \u003c\/ul\u003e\n        \u003cp\u003eThe calculator keeps full precision internally and rounds currency only for display and workbook presentation. This prevents repeated rounding from accumulating when you switch the metric being solved. The Excel export captures the current state at the moment you click Download Excel, including the active campaigns, inputs, computed outputs, comparison, formulas, and interpretation notes.\u003c\/p\u003e\n      \u003c\/section\u003e\n      \u003csection\u003e\n        \u003ch3\u003eDecision checklist\u003c\/h3\u003e\n        \u003cul\u003e\n          \u003cli\u003eConfirm the reporting period and currency are consistent.\u003c\/li\u003e\n          \u003cli\u003eUse impressions rather than unique reach in the CPM formula.\u003c\/li\u003e\n          \u003cli\u003eCompare similar audiences, placements, and optimization goals.\u003c\/li\u003e\n          \u003cli\u003eCheck whether fees, taxes, and agency markups are included.\u003c\/li\u003e\n          \u003cli\u003eReview downstream quality metrics before shifting budget.\u003c\/li\u003e\n        \u003c\/ul\u003e\n        \u003cp\u003eFor broader campaign planning, the \u003ca href=\"https:\/\/www.sba.gov\/business-guide\/manage-your-business\/marketing-sales\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eU.S. Small Business Administration marketing guide\u003c\/a\u003e offers general guidance on connecting promotion decisions to business goals. This calculator provides a mathematical estimate and does not replace platform analytics or professional financial advice.\u003c\/p\u003e\n      \u003c\/section\u003e\n    \u003c\/div\u003e\n  \u003c\/article\u003e\n\u003c\/div\u003e","brand":"FinancialModelsLab","offers":[{"title":"Default Title","offer_id":49909484978419,"sku":"cpm","price":0.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0522\/6191\/2762\/files\/cpm.webp?v=1783935459","url":"https:\/\/financialmodelslab.com\/products\/cpm","provider":"Financial Models Lab","version":"1.0","type":"link"}