{"product_id":"grp","title":"GRP Calculator","description":"\u003cstyle\u003e\n.grp-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  container-type: inline-size;\n  width: 100%;\n  max-width: 1200px;\n  margin: 0 auto;\n  color: var(--ink);\n  background: var(--surface);\n  border: 1px solid var(--border);\n  border-radius: 8px;\n  box-shadow: 0 1px 2px rgba(15, 23, 42, .06);\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n  font-size: 15px;\n  line-height: 1.55;\n  overflow-wrap: anywhere;\n}\n.grp-calculator,\n.grp-calculator *,\n.grp-calculator *::before,\n.grp-calculator *::after {\n  box-sizing: border-box;\n}\n.grp-calculator .grp-shell,\n.grp-calculator .grp-header,\n.grp-calculator .grp-toolbar,\n.grp-calculator .grp-workspace,\n.grp-calculator .grp-panel,\n.grp-calculator .grp-card,\n.grp-calculator .grp-field,\n.grp-calculator .grp-result-grid,\n.grp-calculator .grp-chart-card,\n.grp-calculator .grp-chart-cluster,\n.grp-calculator .grp-visual-box,\n.grp-calculator .grp-legend,\n.grp-calculator .grp-table-card,\n.grp-calculator .grp-table-wrap,\n.grp-calculator .grp-education,\n.grp-calculator .grp-education-grid,\n.grp-calculator .grp-pill-row,\n.grp-calculator .grp-mode-options,\n.grp-calculator .grp-mode-option,\n.grp-calculator .grp-primary-result,\n.grp-calculator .grp-callout,\n.grp-calculator .grp-table-note {\n  min-width: 0;\n}\n.grp-calculator .grp-shell {\n  padding: 24px;\n}\n.grp-calculator .grp-header {\n  display: grid;\n  gap: 12px;\n  padding-bottom: 20px;\n  border-bottom: 1px solid var(--border);\n}\n.grp-calculator .grp-title {\n  margin: 0;\n  color: var(--ink);\n  font-size: 24px;\n  font-weight: 700;\n  line-height: 1.25;\n  letter-spacing: -.02em;\n}\n.grp-calculator .grp-subtitle {\n  max-width: 780px;\n  margin: 0;\n  color: var(--muted);\n  font-size: 15px;\n}\n.grp-calculator .grp-pill-row {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n}\n.grp-calculator .grp-pill {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  min-height: 32px;\n  padding: 6px 10px;\n  border: 1px solid var(--border);\n  border-radius: 999px;\n  background: var(--tint);\n  color: var(--muted);\n  font-size: 13px;\n  font-weight: 500;\n  white-space: nowrap;\n}\n.grp-calculator .grp-pill strong {\n  color: var(--ink);\n  font-weight: 700;\n  font-variant-numeric: tabular-nums;\n}\n.grp-calculator .grp-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 8px;\n  padding: 16px 0 20px;\n}\n.grp-calculator .grp-button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: 10px;\n  min-height: 44px;\n  padding: 12px 18px;\n  border: 1px solid transparent;\n  border-radius: 6px;\n  font: inherit;\n  font-size: 15px;\n  font-weight: 650;\n  line-height: 1;\n  text-decoration: none;\n  cursor: pointer;\n  white-space: nowrap;\n  transition: background-color .15s ease, border-color .15s ease, box-shadow .15s ease, transform .15s ease;\n}\n.grp-calculator .grp-button:hover {\n  box-shadow: 0 2px 5px rgba(15, 23, 42, .13);\n  transform: translateY(-1px);\n}\n.grp-calculator .grp-button:active {\n  transform: translateY(0);\n}\n.grp-calculator .grp-button:focus-visible,\n.grp-calculator input:focus-visible,\n.grp-calculator select:focus-visible,\n.grp-calculator summary:focus-visible {\n  outline: 3px solid rgba(29, 78, 216, .35);\n  outline-offset: 2px;\n}\n.grp-calculator .grp-download {\n  order: 0;\n  background: var(--accent);\n  color: #ffffff;\n  border-color: var(--accent);\n}\n.grp-calculator .grp-download:hover,\n.grp-calculator .grp-download:active {\n  background: var(--accent-hover);\n  border-color: var(--accent-hover);\n}\n.grp-calculator .grp-download svg {\n  width: 18px;\n  height: 18px;\n  flex: 0 0 18px;\n  fill: none;\n  stroke: currentColor;\n  stroke-width: 2;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n}\n.grp-calculator .grp-reset {\n  order: 1;\n  background: var(--surface);\n  color: var(--ink);\n  border-color: #cbd5e1;\n}\n.grp-calculator .grp-reset:hover {\n  background: var(--tint);\n  border-color: #94a3b8;\n}\n.grp-calculator .grp-workspace {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: 16px;\n  align-items: start;\n}\n.grp-calculator .grp-panel,\n.grp-calculator .grp-card,\n.grp-calculator .grp-chart-card,\n.grp-calculator .grp-table-card {\n  border: 1px solid var(--border);\n  border-radius: 8px;\n  background: var(--surface);\n  box-shadow: 0 1px 2px rgba(15, 23, 42, .04);\n}\n.grp-calculator .grp-panel,\n.grp-calculator .grp-card,\n.grp-calculator .grp-chart-card,\n.grp-calculator .grp-table-card {\n  padding: 20px;\n}\n.grp-calculator .grp-section-title {\n  margin: 0 0 16px;\n  color: var(--ink);\n  font-size: 18px;\n  font-weight: 650;\n  line-height: 1.3;\n}\n.grp-calculator .grp-section-intro {\n  margin: -8px 0 16px;\n  color: var(--muted);\n  font-size: 13px;\n  font-weight: 500;\n}\n.grp-calculator .grp-form-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));\n  gap: 16px;\n}\n.grp-calculator .grp-field {\n  display: flex;\n  flex-direction: column;\n  gap: 7px;\n}\n.grp-calculator .grp-label,\n.grp-calculator .grp-mode-legend {\n  color: var(--ink);\n  font-size: 14px;\n  font-weight: 600;\n  line-height: 1.35;\n}\n.grp-calculator .grp-control {\n  width: 100%;\n  min-height: 44px;\n  padding: 10px 12px;\n  border: 1px solid #cbd5e1;\n  border-radius: 6px;\n  background: var(--surface);\n  color: var(--ink);\n  font: inherit;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.35;\n  font-variant-numeric: tabular-nums;\n  appearance: none;\n}\n.grp-calculator .grp-control:hover {\n  border-color: #94a3b8;\n}\n.grp-calculator .grp-control[readonly],\n.grp-calculator .grp-control:disabled {\n  background: var(--tint);\n  color: #334155;\n  cursor: not-allowed;\n  opacity: 1;\n}\n.grp-calculator .grp-helper,\n.grp-calculator .grp-error {\n  min-height: 38px;\n  margin: 0;\n  font-size: 13px;\n  font-weight: 500;\n  line-height: 1.45;\n}\n.grp-calculator .grp-helper {\n  color: var(--muted);\n}\n.grp-calculator .grp-error {\n  display: none;\n  color: #b91c1c;\n}\n.grp-calculator .grp-field.grp-invalid .grp-control {\n  border-color: #b91c1c;\n  box-shadow: 0 0 0 1px #b91c1c;\n}\n.grp-calculator .grp-field.grp-invalid .grp-helper {\n  display: none;\n}\n.grp-calculator .grp-field.grp-invalid .grp-error {\n  display: block;\n}\n.grp-calculator .grp-mode-fieldset {\n  grid-column: 1 \/ -1;\n  margin: 0;\n  padding: 0;\n  border: 0;\n}\n.grp-calculator .grp-mode-legend {\n  margin-bottom: 8px;\n}\n.grp-calculator .grp-mode-options {\n  display: inline-grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: 4px;\n  width: min(100%, 440px);\n  padding: 4px;\n  border: 1px solid var(--border);\n  border-radius: 8px;\n  background: var(--tint);\n}\n.grp-calculator .grp-mode-option {\n  position: relative;\n}\n.grp-calculator .grp-mode-option input {\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  margin: 0;\n  opacity: 0;\n  cursor: pointer;\n}\n.grp-calculator .grp-mode-option label {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-height: 38px;\n  padding: 8px 10px;\n  border: 1px solid transparent;\n  border-radius: 6px;\n  color: var(--muted);\n  font-size: 13px;\n  font-weight: 650;\n  line-height: 1.25;\n  text-align: center;\n  cursor: pointer;\n}\n.grp-calculator .grp-mode-option input:checked + label {\n  border-color: #bfdbfe;\n  background: var(--surface);\n  color: var(--primary);\n  box-shadow: 0 1px 2px rgba(15, 23, 42, .08);\n}\n.grp-calculator .grp-mode-option input:focus-visible + label {\n  outline: 3px solid rgba(29, 78, 216, .35);\n  outline-offset: 1px;\n}\n.grp-calculator .grp-results-panel {\n  display: grid;\n  gap: 16px;\n}\n.grp-calculator .grp-primary-result {\n  padding: 18px;\n  border: 1px solid #bfdbfe;\n  border-radius: 8px;\n  background: #eff6ff;\n}\n.grp-calculator .grp-primary-label {\n  margin: 0 0 5px;\n  color: #1e3a8a;\n  font-size: 13px;\n  font-weight: 650;\n}\n.grp-calculator .grp-primary-value {\n  margin: 0;\n  color: #172554;\n  font-size: 30px;\n  font-weight: 700;\n  line-height: 1.15;\n  letter-spacing: -.02em;\n  font-variant-numeric: tabular-nums;\n}\n.grp-calculator .grp-primary-note {\n  margin: 8px 0 0;\n  color: #334155;\n  font-size: 13px;\n  font-weight: 500;\n}\n.grp-calculator .grp-result-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(min(100%, 155px), 1fr));\n  gap: 12px;\n}\n.grp-calculator .grp-metric {\n  min-height: 105px;\n  padding: 14px;\n  border: 1px solid var(--border);\n  border-radius: 8px;\n  background: var(--tint);\n}\n.grp-calculator .grp-metric-label {\n  margin: 0 0 6px;\n  color: var(--muted);\n  font-size: 13px;\n  font-weight: 600;\n}\n.grp-calculator .grp-metric-value {\n  margin: 0;\n  color: var(--ink);\n  font-size: 20px;\n  font-weight: 700;\n  line-height: 1.25;\n  font-variant-numeric: tabular-nums;\n}\n.grp-calculator .grp-metric-sub {\n  margin: 6px 0 0;\n  color: var(--muted);\n  font-size: 13px;\n  font-weight: 500;\n}\n.grp-calculator .grp-chart-card,\n.grp-calculator .grp-table-card {\n  margin-top: 16px;\n}\n.grp-calculator .grp-chart-head,\n.grp-calculator .grp-table-head {\n  margin-bottom: 16px;\n}\n.grp-calculator .grp-chart-head .grp-section-title,\n.grp-calculator .grp-table-head .grp-section-title {\n  margin-bottom: 6px;\n}\n.grp-calculator .grp-chart-interpretation,\n.grp-calculator .grp-table-intro {\n  margin: 0;\n  color: var(--muted);\n  font-size: 13px;\n  font-weight: 500;\n}\n.grp-calculator .grp-chart-cluster {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  justify-items: center;\n  align-items: center;\n  gap: 20px;\n  width: min(100%, 720px);\n  margin: 0 auto;\n}\n.grp-calculator .grp-visual-box {\n  display: grid;\n  place-items: center;\n  width: min(100%, 300px);\n  aspect-ratio: 1;\n}\n.grp-calculator .grp-chart-svg {\n  display: block;\n  width: 100%;\n  height: auto;\n  max-width: 300px;\n  overflow: visible;\n}\n.grp-calculator .grp-chart-svg text {\n  font-family: inherit;\n  fill: var(--ink);\n  text-anchor: middle;\n  font-variant-numeric: tabular-nums;\n}\n.grp-calculator .grp-empty-state {\n  display: none;\n  width: min(100%, 520px);\n  margin: 0 auto;\n  padding: 18px;\n  border: 1px dashed #cbd5e1;\n  border-radius: 8px;\n  background: var(--tint);\n  color: var(--muted);\n  font-size: 13px;\n  font-weight: 600;\n  text-align: center;\n}\n.grp-calculator .grp-legend {\n  display: grid;\n  gap: 10px;\n  justify-content: center;\n  width: 100%;\n}\n.grp-calculator .grp-legend-row {\n  display: grid;\n  grid-template-columns: 12px minmax(80px, max-content) max-content max-content;\n  align-items: center;\n  justify-content: start;\n  gap: 8px 12px;\n  width: max-content;\n  max-width: 100%;\n  color: var(--ink);\n  font-size: 13px;\n  font-weight: 500;\n}\n.grp-calculator .grp-legend-swatch {\n  width: 12px;\n  height: 12px;\n  border-radius: 3px;\n}\n.grp-calculator .grp-legend-label {\n  font-weight: 650;\n}\n.grp-calculator .grp-legend-value,\n.grp-calculator .grp-legend-percent {\n  font-variant-numeric: tabular-nums;\n  white-space: nowrap;\n}\n.grp-calculator .grp-legend-percent {\n  color: var(--muted);\n}\n.grp-calculator .grp-callout,\n.grp-calculator .grp-table-note {\n  margin-top: 16px;\n  padding: 10px 12px;\n  border: 1px solid var(--border);\n  border-radius: 6px;\n  background: var(--tint);\n  color: var(--muted);\n  font-size: 13px;\n  font-weight: 500;\n  line-height: 1.5;\n}\n.grp-calculator .grp-chart-summary {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n.grp-calculator .grp-chart-table-wrap {\n  margin-top: 16px;\n}\n.grp-calculator .grp-table-wrap,\n.grp-calculator .grp-chart-table-wrap {\n  width: 100%;\n  overflow-x: auto;\n  overscroll-behavior-inline: contain;\n  border: 1px solid var(--border);\n  border-radius: 8px;\n}\n.grp-calculator table {\n  width: 100%;\n  min-width: 620px;\n  border-collapse: collapse;\n  color: var(--ink);\n  font-size: 13px;\n  font-variant-numeric: tabular-nums;\n}\n.grp-calculator .grp-chart-data-table {\n  min-width: 420px;\n}\n.grp-calculator th,\n.grp-calculator td {\n  padding: 11px 12px;\n  border-bottom: 1px solid var(--border);\n  text-align: left;\n  vertical-align: middle;\n}\n.grp-calculator th {\n  background: #172554;\n  color: #ffffff;\n  font-size: 13px;\n  font-weight: 650;\n  white-space: nowrap;\n}\n.grp-calculator td.grp-num,\n.grp-calculator th.grp-num {\n  text-align: right;\n}\n.grp-calculator tbody tr:last-child td {\n  border-bottom: 0;\n}\n.grp-calculator tbody tr:hover td {\n  background: #f8fafc;\n}\n.grp-calculator .grp-current-row td {\n  background: #eff6ff;\n  font-weight: 650;\n}\n.grp-calculator .grp-safe-stack .grp-chart-cluster {\n  grid-template-columns: minmax(0, 1fr) !important;\n  gap: 20px !important;\n  justify-items: center !important;\n  width: min(100%, 560px) !important;\n}\n.grp-calculator .grp-safe-stack .grp-callout {\n  margin-top: 20px !important;\n}\n.grp-calculator .grp-safe-table-stack .grp-table-wrap {\n  height: auto !important;\n  max-height: none !important;\n}\n.grp-calculator .grp-safe-table-stack .grp-table-note {\n  margin-top: 20px !important;\n}\n.grp-calculator .grp-education {\n  margin-top: 24px;\n  padding-top: 24px;\n  border-top: 1px solid var(--border);\n}\n.grp-calculator .grp-education \u003e .grp-section-title {\n  margin-bottom: 10px;\n}\n.grp-calculator .grp-education-lead {\n  max-width: 850px;\n  margin: 0 0 20px;\n  color: var(--muted);\n}\n.grp-calculator .grp-education-grid {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: 20px;\n}\n.grp-calculator .grp-education-section {\n  padding: 18px;\n  border: 1px solid var(--border);\n  border-radius: 8px;\n  background: var(--surface);\n}\n.grp-calculator .grp-education-section h3 {\n  margin: 0 0 10px;\n  color: var(--ink);\n  font-size: 18px;\n  font-weight: 650;\n  line-height: 1.35;\n}\n.grp-calculator .grp-education-section p {\n  margin: 0 0 12px;\n  color: #334155;\n}\n.grp-calculator .grp-education-section p:last-child {\n  margin-bottom: 0;\n}\n.grp-calculator .grp-education-section ul {\n  margin: 0;\n  padding-left: 20px;\n  color: #334155;\n}\n.grp-calculator .grp-education-section li + li {\n  margin-top: 8px;\n}\n.grp-calculator .grp-link {\n  color: var(--primary);\n  text-decoration: underline;\n  text-decoration-thickness: 1px;\n  text-underline-offset: 2px;\n}\n.grp-calculator .grp-link:hover {\n  color: #1e3a8a;\n}\n.grp-calculator .grp-formula {\n  display: block;\n  margin: 12px 0;\n  padding: 12px;\n  border-left: 4px solid var(--primary);\n  border-radius: 0 6px 6px 0;\n  background: #eff6ff;\n  color: #172554;\n  font-weight: 700;\n  font-variant-numeric: tabular-nums;\n}\n.grp-calculator .grp-visually-hidden {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n@container (min-width: 640px) {\n  .grp-calculator .grp-chart-cluster {\n    grid-template-columns: minmax(250px, 300px) max-content;\n    gap: 24px;\n    justify-content: center;\n    justify-items: stretch;\n  }\n  .grp-calculator .grp-education-grid {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n}\n@container (min-width: 900px) {\n  .grp-calculator .grp-workspace {\n    grid-template-columns: minmax(0, 1.08fr) minmax(0, .92fr);\n    gap: 20px;\n  }\n}\n@container (max-width: 639px) {\n  .grp-calculator .grp-shell {\n    padding: 16px;\n  }\n  .grp-calculator .grp-panel,\n  .grp-calculator .grp-card,\n  .grp-calculator .grp-chart-card,\n  .grp-calculator .grp-table-card {\n    padding: 16px;\n  }\n  .grp-calculator .grp-toolbar {\n    align-items: stretch;\n  }\n  .grp-calculator .grp-button {\n    flex: 1 1 auto;\n  }\n  .grp-calculator .grp-download {\n    flex-basis: 100%;\n  }\n  .grp-calculator .grp-mode-options {\n    width: 100%;\n  }\n  .grp-calculator .grp-legend-row {\n    grid-template-columns: 12px minmax(0, max-content) max-content;\n    gap: 7px 10px;\n    width: 100%;\n  }\n  .grp-calculator .grp-legend-percent {\n    grid-column: 2 \/ 4;\n    padding-left: 0;\n  }\n  .grp-calculator .grp-chart-cluster {\n    gap: 16px;\n  }\n  .grp-calculator .grp-callout,\n  .grp-calculator .grp-table-note {\n    margin-top: 16px;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .grp-calculator .grp-button {\n    transition: none;\n  }\n}\n\u003c\/style\u003e\n\u003cdiv class=\"grp-calculator\" data-calculator-root\u003e\n  \u003cdiv class=\"grp-shell\"\u003e\n    \u003cheader class=\"grp-header\"\u003e\n      \u003cdiv\u003e\n        \u003ch2 class=\"grp-title\"\u003eGRP Calculator\u003c\/h2\u003e\n        \u003cp class=\"grp-subtitle\"\u003eCalculate gross rating points from campaign reach and average exposure frequency, then review audience coverage, gross impressions, and frequency sensitivity.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"grp-pill-row\" aria-label=\"Live campaign summary\"\u003e\n        \u003cspan class=\"grp-pill\"\u003eReach \u003cstrong data-grp-pill-reach\u003e20.00%\u003c\/strong\u003e\u003c\/span\u003e\n        \u003cspan class=\"grp-pill\"\u003eFrequency \u003cstrong data-grp-pill-frequency\u003e4.00\u003c\/strong\u003e\u003c\/span\u003e\n        \u003cspan class=\"grp-pill\"\u003eGRP \u003cstrong data-grp-pill-grp\u003e80.00\u003c\/strong\u003e\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/header\u003e\n\n    \u003cdiv class=\"grp-toolbar\" aria-label=\"Calculator actions\"\u003e\n      \u003cbutton class=\"grp-button grp-download\" type=\"button\" data-grp-download\u003e\n        \u003csvg viewbox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"\u003e\u003cpath d=\"M12 3v11m0 0 4-4m-4 4-4-4M5 17v3h14v-3\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n        \u003cspan\u003eDownload Excel\u003c\/span\u003e\n      \u003c\/button\u003e\n      \u003cbutton class=\"grp-button grp-reset\" type=\"button\" data-grp-reset\u003eReset\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"grp-workspace\"\u003e\n      \u003csection class=\"grp-panel\" aria-labelledby=\"grp-inputs-title\"\u003e\n        \u003ch3 class=\"grp-section-title\" id=\"grp-inputs-title\"\u003eCampaign inputs\u003c\/h3\u003e\n        \u003cp class=\"grp-section-intro\"\u003eUse audience counts or enter the reach percentage directly. Results update as you type.\u003c\/p\u003e\n        \u003cdiv class=\"grp-form-grid\"\u003e\n          \u003cfieldset class=\"grp-mode-fieldset\"\u003e\n            \u003clegend class=\"grp-mode-legend\"\u003eReach calculation method\u003c\/legend\u003e\n            \u003cdiv class=\"grp-mode-options\"\u003e\n              \u003cdiv class=\"grp-mode-option\"\u003e\n                \u003cinput type=\"radio\" id=\"grp-mode-counts\" name=\"grp-mode\" value=\"counts\" checked\u003e\n                \u003clabel for=\"grp-mode-counts\"\u003eUse audience counts\u003c\/label\u003e\n              \u003c\/div\u003e\n              \u003cdiv class=\"grp-mode-option\"\u003e\n                \u003cinput type=\"radio\" id=\"grp-mode-direct\" name=\"grp-mode\" value=\"direct\"\u003e\n                \u003clabel for=\"grp-mode-direct\"\u003eEnter reach directly\u003c\/label\u003e\n              \u003c\/div\u003e\n            \u003c\/div\u003e\n          \u003c\/fieldset\u003e\n\n          \u003cdiv class=\"grp-field\" data-grp-field=\"totalAudience\"\u003e\n            \u003clabel class=\"grp-label\" for=\"grp-total-audience\"\u003eTotal target audience\u003c\/label\u003e\n            \u003cinput class=\"grp-control\" id=\"grp-total-audience\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" value=\"10,000\" aria-describedby=\"grp-total-help grp-total-error\"\u003e\n            \u003cp class=\"grp-helper\" id=\"grp-total-help\"\u003eThe full target population for the campaign.\u003c\/p\u003e\n            \u003cp class=\"grp-error\" id=\"grp-total-error\"\u003eEnter a non-negative audience size.\u003c\/p\u003e\n          \u003c\/div\u003e\n\n          \u003cdiv class=\"grp-field\" data-grp-field=\"audienceReached\"\u003e\n            \u003clabel class=\"grp-label\" for=\"grp-audience-reached\"\u003eAudience reached\u003c\/label\u003e\n            \u003cinput class=\"grp-control\" id=\"grp-audience-reached\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" value=\"2,000\" aria-describedby=\"grp-reached-help grp-reached-error\"\u003e\n            \u003cp class=\"grp-helper\" id=\"grp-reached-help\"\u003eUnique people exposed at least once.\u003c\/p\u003e\n            \u003cp class=\"grp-error\" id=\"grp-reached-error\"\u003eEnter a value from zero to the total audience.\u003c\/p\u003e\n          \u003c\/div\u003e\n\n          \u003cdiv class=\"grp-field\" data-grp-field=\"reachPercent\"\u003e\n            \u003clabel class=\"grp-label\" for=\"grp-reach-percent\"\u003eReach percentage\u003c\/label\u003e\n            \u003cinput class=\"grp-control\" id=\"grp-reach-percent\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" value=\"20.00%\" readonly aria-describedby=\"grp-reach-help grp-reach-error\"\u003e\n            \u003cp class=\"grp-helper\" id=\"grp-reach-help\"\u003eShare of the target audience reached at least once.\u003c\/p\u003e\n            \u003cp class=\"grp-error\" id=\"grp-reach-error\"\u003eEnter a percentage from 0% to 100%.\u003c\/p\u003e\n          \u003c\/div\u003e\n\n          \u003cdiv class=\"grp-field\" data-grp-field=\"frequency\"\u003e\n            \u003clabel class=\"grp-label\" for=\"grp-frequency\"\u003eFrequency per viewer\u003c\/label\u003e\n            \u003cinput class=\"grp-control\" id=\"grp-frequency\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" value=\"4.00\" aria-describedby=\"grp-frequency-help grp-frequency-error\"\u003e\n            \u003cp class=\"grp-helper\" id=\"grp-frequency-help\"\u003eAverage number of exposures among reached viewers.\u003c\/p\u003e\n            \u003cp class=\"grp-error\" id=\"grp-frequency-error\"\u003eEnter a non-negative frequency.\u003c\/p\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/section\u003e\n\n      \u003csection class=\"grp-panel grp-results-panel\" aria-labelledby=\"grp-results-title\"\u003e\n        \u003cdiv\u003e\n          \u003ch3 class=\"grp-section-title\" id=\"grp-results-title\"\u003eLive results\u003c\/h3\u003e\n          \u003cdiv class=\"grp-primary-result\" aria-live=\"polite\" aria-atomic=\"true\"\u003e\n            \u003cp class=\"grp-primary-label\"\u003eGross rating points\u003c\/p\u003e\n            \u003cp class=\"grp-primary-value\" data-grp-primary\u003e80.00 GRP\u003c\/p\u003e\n            \u003cp class=\"grp-primary-note\" data-grp-primary-note\u003e20.00% reach × 4.00 average frequency\u003c\/p\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"grp-result-grid\"\u003e\n          \u003carticle class=\"grp-metric\"\u003e\n            \u003cp class=\"grp-metric-label\"\u003eReach percentage\u003c\/p\u003e\n            \u003cp class=\"grp-metric-value\" data-grp-result-reach\u003e20.00%\u003c\/p\u003e\n            \u003cp class=\"grp-metric-sub\"\u003eUnique audience coverage\u003c\/p\u003e\n          \u003c\/article\u003e\n          \u003carticle class=\"grp-metric\"\u003e\n            \u003cp class=\"grp-metric-label\"\u003eGross impressions\u003c\/p\u003e\n            \u003cp class=\"grp-metric-value\" data-grp-result-impressions\u003e8,000\u003c\/p\u003e\n            \u003cp class=\"grp-metric-sub\"\u003eReached audience × frequency\u003c\/p\u003e\n          \u003c\/article\u003e\n          \u003carticle class=\"grp-metric\"\u003e\n            \u003cp class=\"grp-metric-label\"\u003eAudience reached\u003c\/p\u003e\n            \u003cp class=\"grp-metric-value\" data-grp-result-reached\u003e2,000\u003c\/p\u003e\n            \u003cp class=\"grp-metric-sub\"\u003eEstimated unique viewers\u003c\/p\u003e\n          \u003c\/article\u003e\n          \u003carticle class=\"grp-metric\"\u003e\n            \u003cp class=\"grp-metric-label\"\u003eAudience not reached\u003c\/p\u003e\n            \u003cp class=\"grp-metric-value\" data-grp-result-unreached\u003e8,000\u003c\/p\u003e\n            \u003cp class=\"grp-metric-sub\"\u003eRemaining target audience\u003c\/p\u003e\n          \u003c\/article\u003e\n        \u003c\/div\u003e\n      \u003c\/section\u003e\n    \u003c\/div\u003e\n\n    \u003csection class=\"grp-chart-card\" data-grp-chart-card aria-labelledby=\"grp-breakdown-title\"\u003e\n      \u003cdiv class=\"grp-chart-head\"\u003e\n        \u003ch3 class=\"grp-section-title\" id=\"grp-breakdown-title\"\u003eAudience reach breakdown\u003c\/h3\u003e\n        \u003cp class=\"grp-chart-interpretation\" data-grp-chart-interpretation\u003e2,000 people are reached and 8,000 remain unreached.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"grp-chart-cluster\" data-grp-chart-cluster\u003e\n        \u003cdiv class=\"grp-visual-box\" data-grp-visual-box\u003e\n          \u003csvg class=\"grp-chart-svg\" data-grp-chart-svg viewbox=\"0 0 300 300\" role=\"img\" aria-labelledby=\"grp-chart-title grp-chart-desc\"\u003e\n            \u003ctitle id=\"grp-chart-title\"\u003eAudience reach breakdown chart\u003c\/title\u003e\n            \u003cdesc id=\"grp-chart-desc\"\u003eReached audience 2,000, 20 percent. Audience not reached 8,000, 80 percent.\u003c\/desc\u003e\n            \u003cg data-grp-chart-marks\u003e\u003c\/g\u003e\n            \u003cg data-grp-chart-center\u003e\u003c\/g\u003e\n          \u003c\/svg\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"grp-legend\" data-grp-legend aria-label=\"Audience breakdown legend\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"grp-empty-state\" data-grp-chart-empty\u003eEnter a target audience and reach values to see the breakdown.\u003c\/div\u003e\n      \u003cp class=\"grp-chart-summary\" data-grp-chart-summary\u003e\u003c\/p\u003e\n      \u003cdiv class=\"grp-callout\" data-grp-chart-caption\u003eReach counts unique people, while frequency describes repeated exposure among those people. GRP combines both dimensions but does not by itself show whether additional points came from wider reach or heavier repetition.\u003c\/div\u003e\n      \u003cdiv class=\"grp-chart-table-wrap\" data-grp-chart-table-wrap\u003e\n        \u003ctable class=\"grp-chart-data-table\"\u003e\n          \u003cthead\u003e\n            \u003ctr\u003e\n\u003cth scope=\"col\"\u003eAudience category\u003c\/th\u003e\n\u003cth class=\"grp-num\" scope=\"col\"\u003ePeople\u003c\/th\u003e\n\u003cth class=\"grp-num\" scope=\"col\"\u003eShare\u003c\/th\u003e\n\u003c\/tr\u003e\n          \u003c\/thead\u003e\n          \u003ctbody data-grp-breakdown-body\u003e\u003c\/tbody\u003e\n        \u003c\/table\u003e\n      \u003c\/div\u003e\n    \u003c\/section\u003e\n\n    \u003csection class=\"grp-table-card\" data-grp-table-card aria-labelledby=\"grp-scenarios-title\"\u003e\n      \u003cdiv class=\"grp-table-head\"\u003e\n        \u003ch3 class=\"grp-section-title\" id=\"grp-scenarios-title\"\u003eFrequency sensitivity\u003c\/h3\u003e\n        \u003cp class=\"grp-table-intro\"\u003eSee how GRP and gross impressions change when reach remains constant and average frequency changes.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"grp-table-wrap\" data-grp-table-wrap\u003e\n        \u003ctable\u003e\n          \u003cthead\u003e\n            \u003ctr\u003e\n              \u003cth scope=\"col\"\u003eScenario\u003c\/th\u003e\n              \u003cth class=\"grp-num\" scope=\"col\"\u003eFrequency\u003c\/th\u003e\n              \u003cth class=\"grp-num\" scope=\"col\"\u003eReach\u003c\/th\u003e\n              \u003cth class=\"grp-num\" scope=\"col\"\u003eGRP\u003c\/th\u003e\n              \u003cth class=\"grp-num\" scope=\"col\"\u003eGross impressions\u003c\/th\u003e\n            \u003c\/tr\u003e\n          \u003c\/thead\u003e\n          \u003ctbody data-grp-scenario-body\u003e\u003c\/tbody\u003e\n        \u003c\/table\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"grp-table-note\" data-grp-table-note\u003eThe table is a sensitivity view, not a forecast. It holds reach constant so you can isolate the mathematical effect of frequency on GRP and impressions.\u003c\/div\u003e\n    \u003c\/section\u003e\n\n    \u003csection class=\"grp-education\" aria-labelledby=\"grp-education-title\"\u003e\n      \u003ch3 class=\"grp-section-title\" id=\"grp-education-title\"\u003eHow to use and interpret the GRP calculator\u003c\/h3\u003e\n      \u003cp class=\"grp-education-lead\"\u003eGross rating points provide a compact way to describe the delivery weight of an advertising schedule. They combine the percentage of a defined target audience reached at least once with the average number of exposures among those reached. The calculator is designed for planning and reporting checks, not as a substitute for audited audience measurement or campaign-effectiveness analysis.\u003c\/p\u003e\n      \u003cdiv class=\"grp-education-grid\"\u003e\n        \u003carticle class=\"grp-education-section\"\u003e\n          \u003ch3\u003eWhat does the calculator estimate?\u003c\/h3\u003e\n          \u003cp\u003eThe primary output is GRP, measured in points rather than percent. A campaign with 20% reach and an average frequency of 4 produces 80 GRPs. The same 80 points could also come from 40% reach at frequency 2, so GRP is a delivery-volume measure, not a complete description of audience quality or duplication.\u003c\/p\u003e\n          \u003cspan class=\"grp-formula\"\u003eGRP = reach percentage × average frequency\u003c\/span\u003e\n          \u003cp\u003eWhen reach is entered as a decimal inside the model, the equivalent formula is reach fraction × frequency × 100. This is why 0.20 × 4 × 100 equals 80 points. Industry measurement discussions commonly pair reach, frequency, impressions, and GRPs; Nielsen’s overview of TV audience measurement explains how reach and frequency are used together in media buying.\u003c\/p\u003e\n          \u003cp\u003e\u003ca class=\"grp-link\" href=\"https:\/\/www.nielsen.com\/insights\/2023\/how-to-measure-tv-audiences\/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eRead Nielsen’s audience-measurement overview\u003c\/a\u003e.\u003c\/p\u003e\n        \u003c\/article\u003e\n\n        \u003carticle class=\"grp-education-section\"\u003e\n          \u003ch3\u003eHow should each input be entered?\u003c\/h3\u003e\n          \u003cul\u003e\n            \u003cli\u003e\n\u003cstrong\u003eReach calculation method:\u003c\/strong\u003e choose “Use audience counts” when you know the target population and unique audience reached. Choose “Enter reach directly” when a media report already provides the percentage.\u003c\/li\u003e\n            \u003cli\u003e\n\u003cstrong\u003eTotal target audience:\u003c\/strong\u003e enter the number of people in the defined buying or reporting universe. It is required for count-based reach and for converting direct reach into estimated people.\u003c\/li\u003e\n            \u003cli\u003e\n\u003cstrong\u003eAudience reached:\u003c\/strong\u003e enter unduplicated people exposed at least once. It cannot exceed the target audience. Higher reach increases GRP when frequency stays unchanged.\u003c\/li\u003e\n            \u003cli\u003e\n\u003cstrong\u003eReach percentage:\u003c\/strong\u003e enter a value from 0% to 100% in direct mode. The calculator accepts a percent sign, commas, spaces, or a plain number.\u003c\/li\u003e\n            \u003cli\u003e\n\u003cstrong\u003eFrequency per viewer:\u003c\/strong\u003e enter average exposures among reached viewers. It may be fractional, such as 3.6, because it is an average rather than a literal exposure count for every person.\u003c\/li\u003e\n          \u003c\/ul\u003e\n        \u003c\/article\u003e\n\n        \u003carticle class=\"grp-education-section\"\u003e\n          \u003ch3\u003eHow should the results be read?\u003c\/h3\u003e\n          \u003cp\u003e\u003cstrong\u003eGRP\u003c\/strong\u003e is the campaign’s gross delivery weight. A higher number means more aggregate exposure, but it may reflect broader reach, more repetition, or both. A zero value means either no reach or no frequency. GRP is normally non-negative because reach and exposure counts cannot be negative.\u003c\/p\u003e\n          \u003cp\u003e\u003cstrong\u003eReach percentage\u003c\/strong\u003e is unique audience coverage. \u003cstrong\u003eGross impressions\u003c\/strong\u003e equal estimated reached people multiplied by average frequency. \u003cstrong\u003eAudience reached\u003c\/strong\u003e is the unduplicated count, while \u003cstrong\u003eaudience not reached\u003c\/strong\u003e is the remainder of the target population. The donut chart visualizes these two mutually exclusive audience groups, and its table exposes the exact counts and shares used to draw the segments.\u003c\/p\u003e\n          \u003cp\u003eThe Media Rating Council and IAB publish detailed guidance on audience reach measurement, including the importance of clearly defined universes, qualified impressions, and disclosed methodology.\u003c\/p\u003e\n          \u003cp\u003e\u003ca class=\"grp-link\" href=\"https:\/\/mediaratingcouncil.org\/sites\/default\/files\/Standards\/AudienceReachMeasurementGuidelines-2.pdf\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eReview the MRC\/IAB Audience Reach Measurement Guidelines\u003c\/a\u003e.\u003c\/p\u003e\n        \u003c\/article\u003e\n\n        \u003carticle class=\"grp-education-section\"\u003e\n          \u003ch3\u003eWhat does the sensitivity table show?\u003c\/h3\u003e\n          \u003cp\u003eThe frequency table holds the current reach constant and recalculates delivery at several exposure levels. This isolates the arithmetic relationship: every additional average exposure adds another block of rating points equal to the reach percentage. At 20% reach, moving frequency from 3 to 4 adds 20 GRPs and adds one more impression for each reached person.\u003c\/p\u003e\n          \u003cp\u003eThe highlighted row is the current input when it matches one of the displayed scenarios. Treat the table as a planning comparison rather than a claim that reach will stay constant in a real campaign. In practice, additional impressions may increase both reach and repetition, and the balance depends on inventory, targeting, channel mix, deduplication, and frequency controls.\u003c\/p\u003e\n        \u003c\/article\u003e\n\n        \u003carticle class=\"grp-education-section\"\u003e\n          \u003ch3\u003eWhich assumptions matter most?\u003c\/h3\u003e\n          \u003cp\u003eReach quality depends on a consistent target-audience definition and an unduplicated count across the relevant reporting period. Frequency depends on how impressions are assigned to people or households and whether exposures are qualified, viewable, and filtered for invalid traffic. Cross-device or cross-platform duplication can materially change both metrics.\u003c\/p\u003e\n          \u003cp\u003eThe Association of National Advertisers describes unduplicated cross-media reach and frequency as a strategic measurement priority. That context matters because simply adding platform-level reach figures can overstate true campaign reach when the same person appears on multiple services.\u003c\/p\u003e\n          \u003cp\u003e\u003ca class=\"grp-link\" href=\"https:\/\/www.ana.net\/content\/show\/id\/pr-2024-06-cmm\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eSee the ANA’s cross-media measurement discussion\u003c\/a\u003e.\u003c\/p\u003e\n        \u003c\/article\u003e\n\n        \u003carticle class=\"grp-education-section\"\u003e\n          \u003ch3\u003eCommon mistakes and practical limits\u003c\/h3\u003e\n          \u003cul\u003e\n            \u003cli\u003eDo not divide total audience by audience reached; reach percentage is audience reached divided by total audience.\u003c\/li\u003e\n            \u003cli\u003eDo not interpret 100 GRPs as 100% unique reach. Repetition can produce mor\ne than 100 GRPs even though reach cannot exceed 100%.\u003c\/li\u003e\n            \u003cli\u003eDo not add reach percentages from different channels without deduplicating overlapping people.\u003c\/li\u003e\n            \u003cli\u003eDo not treat GRP as a direct measure of sales, brand lift, attention, or profitability. It describes exposure delivery, not business outcomes.\u003c\/li\u003e\n            \u003cli\u003eMatch the reporting period, target definition, geography, and measurement basis before comparing two campaigns.\u003c\/li\u003e\n          \u003c\/ul\u003e\n          \u003cp\u003eUse the workbook export to preserve the current assumptions, calculated outputs, audience breakdown, and sensitivity rows for review. Recheck source methodology before using the figures in contracts, billing, or formal performance claims.\u003c\/p\u003e\n        \u003c\/article\u003e\n      \u003c\/div\u003e\n    \u003c\/section\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e","brand":"FinancialModelsLab","offers":[{"title":"Default Title","offer_id":49909484290291,"sku":"grp","price":0.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0522\/6191\/2762\/files\/grp.webp?v=1783935440","url":"https:\/\/financialmodelslab.com\/products\/grp","provider":"Financial Models Lab","version":"1.0","type":"link"}