# Full results

Every metric CookieBench measures for ten consent managers in a Next.js app. Mobile (emulated) profile: 390 × 844, DPR 3 · Mid-tier phone CPU (4× slowdown) · 200 KB/s, 150 ms latency. Columns follow the [leaderboard](https://cookiebench.com/mobile.md) order: banner time, fastest first. A value without a "vs no CMP" change had no measurable change from the same page without a consent manager.

- [c15t](https://cookiebench.com/benchmarks/c15t.md)
- [Osano](https://cookiebench.com/benchmarks/osano.md)
- [CookieYes](https://cookiebench.com/benchmarks/cookieyes.md)
- [Cookie Control](https://cookiebench.com/benchmarks/cookie-control.md)
- [iubenda](https://cookiebench.com/benchmarks/iubenda.md)
- [Enzuzo](https://cookiebench.com/benchmarks/enzuzo.md)
- [OneTrust](https://cookiebench.com/benchmarks/onetrust.md)
- [Usercentrics](https://cookiebench.com/benchmarks/usercentrics.md)
- [Didomi](https://cookiebench.com/benchmarks/didomi.md)
- [Ketch](https://cookiebench.com/benchmarks/ketch.md)

## Core Web Vitals

LCP, CLS and TBT come from the page load. INP comes from the Accept click. Google rates LCP good up to 2.5 s and poor above 4 s. It rates INP good up to 200 ms and poor above 500 ms. It rates CLS good up to 0.1 and poor above 0.25. It does not rate TBT.

| Metric | c15t | Osano | CookieYes | Cookie Control | iubenda | Enzuzo | OneTrust | Usercentrics | Didomi | Ketch |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| LCP: Largest Contentful Paint | 3.86 s (Needs improvement), +408 ms vs no CMP | 3.87 s (Needs improvement), +424 ms vs no CMP | 3.64 s (Needs improvement), +176 ms vs no CMP | 3.94 s (Needs improvement), +492 ms vs no CMP | 4.06 s (Poor), +612 ms vs no CMP | 4.22 s (Poor), +768 ms vs no CMP | 3.93 s (Needs improvement), +476 ms vs no CMP | 4.30 s (Poor), +844 ms vs no CMP | 4.72 s (Poor), +1.28 s vs no CMP | 5.19 s (Poor), +1.74 s vs no CMP |
| INP: Interaction to Next Paint, for the Accept click | 32 ms (Good) | 128 ms (Good) | 24 ms (Good) | 24 ms (Good) | 32 ms (Good) | 56 ms (Good) | 16 ms (Good) | 16 ms (Good) | 16 ms (Good) | 40 ms (Good) |
| CLS: Cumulative Layout Shift | 0.00 (Good) | 0.00 (Good) | 0.00 (Good) | 0.00 (Good) | 0.00 (Good) | 0.00 (Good) | 0.00 (Good) | 0.00 (Good) | 0.00 (Good) | 0.00 (Good) |
| TBT: Total Blocking Time during load | 66 ms, −1 ms vs no CMP | 223 ms, +156 ms vs no CMP | 83 ms, +5 ms vs no CMP | 255 ms, +188 ms vs no CMP | 115 ms, +48 ms vs no CMP | 264 ms, +197 ms vs no CMP | 183 ms, +116 ms vs no CMP | 154 ms, +87 ms vs no CMP | 357 ms, +290 ms vs no CMP | 1.05 s, +982 ms vs no CMP |

## Page load

Google rates TTFB good up to 0.8 s and FCP good up to 1.8 s. Content paint is the paint time of the article image. We time it even when the banner was the largest element.

| Metric | c15t | Osano | CookieYes | Cookie Control | iubenda | Enzuzo | OneTrust | Usercentrics | Didomi | Ketch |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| TTFB: Time to First Byte | 21 ms (Good), +15 ms vs no CMP | 5 ms (Good) | 8 ms (Good) | 7 ms (Good) | 6 ms (Good) | 6 ms (Good), +1 ms vs no CMP | 6 ms (Good) | 7 ms (Good) | 5 ms (Good) | 6 ms (Good), +1 ms vs no CMP |
| FCP: First Contentful Paint | 268 ms (Good), +28 ms vs no CMP | 248 ms (Good) | 264 ms (Good) | 248 ms (Good) | 252 ms (Good) | 248 ms (Good), +8 ms vs no CMP | 248 ms (Good) | 252 ms (Good) | 248 ms (Good) | 252 ms (Good), +12 ms vs no CMP |
| Content paint: The article image painted | 3.86 s, +408 ms vs no CMP | 3.87 s, +424 ms vs no CMP | 3.64 s, +176 ms vs no CMP | 3.94 s, +492 ms vs no CMP | 4.06 s, +612 ms vs no CMP | 4.22 s, +768 ms vs no CMP | 4.54 s, +1.09 s vs no CMP | 4.30 s, +844 ms vs no CMP | 4.72 s, +1.28 s vs no CMP | 5.19 s, +1.74 s vs no CMP |
| LCP element: What the browser picked as the largest element | Not measured (No eligible visits to attribute) | Not measured (No eligible visits to attribute) | Not measured (No eligible visits to attribute) | Not measured (No eligible visits to attribute) | Not measured (No eligible visits to attribute) | Not measured (No eligible visits to attribute) | Not measured (No eligible visits to attribute) | Not measured (No eligible visits to attribute) | Not measured (No eligible visits to attribute) | Not measured (No eligible visits to attribute) |

## Banner

Milliseconds from navigation. p75 is where the slowest quarter of visits starts.

| Metric | c15t | Osano | CookieYes | Cookie Control | iubenda | Enzuzo | OneTrust | Usercentrics | Didomi | Ketch |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| CMP requested: First request for the CMP’s script or config | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) |
| CMP loaded: The download of the CMP’s main script is complete | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) | Not measured (A proposed metric that v3 does not summarise yet) |
| Consent known: The CMP reports the visitor’s consent state | 1.98 s | Not measured (This CMP exposes no consent-ready signal) | Not measured (This CMP exposes no consent-ready signal) | Not measured (This CMP exposes no consent-ready signal) | Not measured (This CMP exposes no consent-ready signal) | Not measured (This CMP exposes no consent-ready signal) | Not measured (This CMP exposes no consent-ready signal) | Not measured (This CMP exposes no consent-ready signal) | Not measured (This CMP exposes no consent-ready signal) | Not measured (This CMP exposes no consent-ready signal) |
| Banner visible: The banner is on screen | 240 ms | 2.15 s | 2.42 s | 2.47 s | 2.66 s | 2.75 s | 3.92 s | 4.16 s | 4.41 s | 7.95 s |
| Screen covered: Share of the viewport the banner covers | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) |

## Click response

Time until the screen updates. We rate it like INP: good up to 200 ms, poor above 500 ms. The browser reports these times in 8 ms steps. It does not report clicks under 16 ms.

| Metric | c15t | Osano | CookieYes | Cookie Control | iubenda | Enzuzo | OneTrust | Usercentrics | Didomi | Ketch |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Accept: Accept all, from the banner | 32 ms (Good) | 128 ms (Good) | 24 ms (Good) | 24 ms (Good) | 32 ms (Good) | 56 ms (Good) | 16 ms (Good) | 16 ms (Good) | 16 ms (Good) | 40 ms (Good) |
| Reject: Reject all, from the banner | 40 ms (Good) | 88 ms (Good) | 24 ms (Good) | 24 ms (Good) | 24 ms (Good) | 56 ms (Good) | 16 ms (Good) | 16 ms (Good) | 24 ms (Good) | 32 ms (Good) |
| Save: Save, in the preferences dialog | 40 ms (Good) | 80 ms (Good) | Not measured (There is no granular save-preferences flow to test) | Not measured (There is no granular save-preferences flow to test) | 40 ms (Good) | 48 ms (Good) | 40 ms (Good) | 16 ms (Good) | 104 ms (Good) | 32 ms (Good) |
| Next click: A click on the page 500 ms after Accept | 16 ms (Good) | Failed (A page control clicked 500 ms later did not respond, so there is no timing) | 16 ms (Good) | 16 ms (Good) | 16 ms (Good) | 16 ms (Good) | 24 ms (Good) | 16 ms (Good) | 16 ms (Good) | 16 ms (Good) |

## After Accept

Milliseconds from the click. Main thread is the long-task blocking time after it.

| Metric | c15t | Osano | CookieYes | Cookie Control | iubenda | Enzuzo | OneTrust | Usercentrics | Didomi | Ketch |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Banner gone: Banner and any overlay removed | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) |
| Consent applied: The CMP’s consent state matches the choice | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) |
| Scripts ran: Every script that the choice lets run is complete | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) |
| Main thread: Long-task blocking time after the click | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) |

## After Reject

Reject lets no scripts run, so there is no script time to report.

| Metric | c15t | Osano | CookieYes | Cookie Control | iubenda | Enzuzo | OneTrust | Usercentrics | Didomi | Ketch |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Banner gone: Banner and any overlay removed | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) |
| Consent applied: The CMP’s consent state matches the choice | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) |
| Main thread: Long-task blocking time after the click | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) |

## After Save

From the Save click in the preferences dialog.

| Metric | c15t | Osano | CookieYes | Cookie Control | iubenda | Enzuzo | OneTrust | Usercentrics | Didomi | Ketch |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Banner gone: Banner and any overlay removed | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) |
| Consent applied: The CMP’s consent state matches the choice | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) |
| Scripts ran: Every script that the choice lets run is complete | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) |
| Main thread: Long-task blocking time after the click | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) | Not measured (This run published only the next paint after a click) |

## Download size

The first load. Unpacked is the size after decompression. That is the code that the browser must parse.

| Metric | c15t | Osano | CookieYes | Cookie Control | iubenda | Enzuzo | OneTrust | Usercentrics | Didomi | Ketch |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Transferred: Bytes over the network during the first load | 725 KB, +112 KB vs no CMP | 698 KB, +85 KB vs no CMP | 644 KB, +31 KB vs no CMP | 712 KB, +99 KB vs no CMP | 735 KB, +122 KB vs no CMP | 766 KB, +153 KB vs no CMP | 824 KB, +211 KB vs no CMP | 777 KB, +164 KB vs no CMP | 866 KB, +253 KB vs no CMP | 1.15 MB, +532 KB vs no CMP |
| Unpacked: The same bytes after decompression | 1.45 MB, +472 KB vs no CMP | 1.33 MB, +348 KB vs no CMP | 1.07 MB, +98 KB vs no CMP | 1.32 MB, +346 KB vs no CMP | 1.44 MB, +458 KB vs no CMP | 1.57 MB, +592 KB vs no CMP | 1.83 MB, +855 KB vs no CMP | 1.69 MB, +711 KB vs no CMP | 1.98 MB, +1.00 MB vs no CMP | 8.18 MB, +7.20 MB vs no CMP |
| Deferred: Bytes transferred after the first load settled | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) |
| Requests: Requests during the first load | 16, +6 vs no CMP | 14, +4 vs no CMP | 19, +9 vs no CMP | 12, +2 vs no CMP | 14, +4 vs no CMP | 12, +2 vs no CMP | 22, +12 vs no CMP | 27, +17 vs no CMP | 16, +6 vs no CMP | 19, +9 vs no CMP |
| Third-party: Requests to other hosts during the first load | 0 | 4 | 9 | 2 | 4 | 2 | 12 | 17 | 6 | 9 |

## Returning visitors

A visitor who accepted earlier loads the page again. We expect the banner to stay hidden.

| Metric | c15t | Osano | CookieYes | Cookie Control | iubenda | Enzuzo | OneTrust | Usercentrics | Didomi | Ketch |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Banner hidden: The banner stayed hidden on the return visit | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) |
| Consent known: Time from navigation until the CMP restores the stored choice | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) | Not measured (Not published for this run) |

## Consent checks

No tracker or cookie before the visitor chooses, and the choice holds afterwards. A check we could not run is not a failure.

| Metric | c15t | Osano | CookieYes | Cookie Control | iubenda | Enzuzo | OneTrust | Usercentrics | Didomi | Ketch |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Checks: Load, Accept, Reject, Save, withdrawal and keyboard checks | 4 of 4 passed | 2 of 4 passed (2 failed) | 3 of 4 passed (1 could not run) | 3 of 4 passed (1 could not run) | 4 of 4 passed | 4 of 4 passed | 4 of 4 passed | 4 of 4 passed | 4 of 4 passed | 4 of 4 passed |

## Other views

- [Desktop, Next.js](https://cookiebench.com/results.md)
- [Desktop, React](https://cookiebench.com/results/react.md)
- [Desktop, Nuxt](https://cookiebench.com/results/nuxt.md)
- [Desktop, Astro](https://cookiebench.com/results/astro.md)
- [Desktop, TanStack Start](https://cookiebench.com/results/tanstack-start.md)
- [Desktop, Script tag](https://cookiebench.com/results/script-tag.md)
- [Mobile, React](https://cookiebench.com/results/mobile/react.md)
- [Mobile, Nuxt](https://cookiebench.com/results/mobile/nuxt.md)
- [Mobile, Astro](https://cookiebench.com/results/mobile/astro.md)
- [Mobile, TanStack Start](https://cookiebench.com/results/mobile/tanstack-start.md)
- [Mobile, Script tag](https://cookiebench.com/results/mobile/script-tag.md)

Methodology [cookiebench-v3.2.4](https://cookiebench.com/methodology). inth, the team behind c15t, maintains CookieBench. c15t is one of the consent managers we measure ([disclosure](https://cookiebench.com/methodology)). Feature support comes from vendor documentation unless a row says "Verified by test".
