Christian SchreiberWeb Performance Consulting Book a performance analysis

Core Web Vitals Acceptance Criteria Ticket templates with a definition of done for LCP, INP, CLS and TTFB, ready for Jira or Azure DevOps

A performance ticket without an acceptance criterion ends in a discussion about Lighthouse points. The templates on this page turn every metric into a task that a development team can implement and an independent party can sign off: with baseline, target value per page type, checks before merge, evidence in field data after go-live and a definition of done for every release.

Values in square brackets are placeholdersDownload the templates as PDF

Acceptance criteria for Core Web Vitals: thresholds, percentile and time window

Google assesses the Core Web Vitals at the 75th percentile of visits, separately for mobile and desktop, over a rolling 28-day window. An acceptance criterion adopts these three definitions, otherwise it measures something other than Google. The thresholds come from web.dev, for Time to First Byte from web.dev/articles/ttfb.

Google thresholds and measurability in the lab
MetricGoodPoorIn the lab
Largest Contentful Paintup to 2.5 sover 4 smeasurable
Interaction to Next Paintup to 200 msover 500 msonly with an executed interaction, Total Blocking Time as approximation
Cumulative Layout Shiftup to 0.1over 0.25loading phase only in navigation mode
Time to First Byteup to 800 msover 1.8 smeasurable

This defines the structure of every template: a lab measurement under defined conditions checks before merge whether the change works in the right direction. Sign-off only happens with field data after go-live. How the two sources differ is described in Measuring Core Web Vitals.

Structure of the ticket templates: baseline, target value, checks and evidence

Largest Contentful Paint ticket template: name the LCP element, shorten its loading path

Ticket title: [Page type]: Largest Contentful Paint on mobile at most [2.5] seconds at the 75th percentile

Context: Baseline at the 75th percentile on mobile: [value] seconds according to [Chrome User Experience Report or real user monitoring], as of [date]. LCP element on this page type: [image, heading or text block]. Reference URLs: [list].

LCP before merge: LCP element, image size and lab measurement

LCP after go-live: 75th percentile of field data over 28 days

Evidence: Measurement log with conditions, URLs, date and values before and after the change, plus a link to the field data analysis after 28 days.

Interaction to Next Paint ticket template: measure the most frequent interactions, relieve the main thread

Ticket title: [Page type]: Interaction to Next Paint on mobile at most [200] milliseconds at the 75th percentile

Context: Baseline at the 75th percentile on mobile: [value] milliseconds according to [source], as of [date]. Slowest interaction according to real user monitoring: [element and interaction].

INP before merge: named interactions with CPU throttling

INP after go-live: field data with interaction attribution

Evidence: Recording of every named interaction with duration, device and throttling, plus a link to the field data analysis after 28 days.

Cumulative Layout Shift ticket template: reserve space, including for late-loading components

Ticket title: [Page type]: Cumulative Layout Shift at most [0.1] at the 75th percentile

Context: Baseline at the 75th percentile on mobile: [value] according to [source], as of [date]. Largest shift according to measurement: [component].

CLS before merge: dimensions, reserved space and a manual test

CLS after go-live: field data including scrolling and interaction

Evidence: Measurement log with the shifted elements before and after the change, result of the manual test, link to the field data analysis after 28 days.

Time to First Byte ticket template: cache hit ratio as an acceptance criterion

Ticket title: [Page type]: Time to First Byte at most [800] milliseconds at the 75th percentile

Context: Baseline at the 75th percentile on mobile: [value] milliseconds according to [source], as of [date]. Cache hit ratio for this page type: [value] percent.

TTFB before release: cache hit ratio, parameters and invalidation

TTFB after go-live: response time for real visitors per page type

Evidence: Excerpt from the cache and CDN logs with cache hit ratio per page type, result of both test cases, link to the field data analysis after 28 days.

Definition of done for performance: five points for every release

The tickets cover targeted improvements. To keep a platform from getting slower again after optimization, five points belong in the team's definition of done:

  1. For every affected page type, there is a measurement log with defined conditions, before and after the change.
  2. Budgets for JavaScript, CSS and images are checked in the build pipeline. Exceeding a budget fails the build.
  3. Every new third-party script is approved against the performance budget and has a named owner.
  4. No metric gets worse by more than [tolerance] percent compared with the last release.
  5. 28 days after go-live, the field data is checked. Every deviation from the target value becomes a new ticket.

The budget check in the pipeline can be implemented with Lighthouse CI or with PerfDelta, which checks budgets per URL against field and lab data. How target values are set and prioritized is described in Website Performance Optimization.

Download: ticket templates as PDF under CC BY 4.0

The templates as a PDF contain all four tickets and the definition of done with checklists to transfer into Jira, Azure DevOps, GitLab or GitHub. They are licensed under Creative Commons Attribution 4.0: clients, agencies and IT service providers may use and adapt them, including in commercial projects, with the attribution "Christian Schreiber, ch-schreiber.net".

The requirements these tickets come from are in the specification templates AEM Performance Requirements Template and Magnolia Performance Requirements Template.

Book a free performance analysis

30 minutes by video. You receive Google's real-user data for your platform compared with two competitors, whether or not a collaboration follows.

Frequently asked questions about acceptance criteria for Core Web Vitals

Why is a Lighthouse score not enough as an acceptance criterion?

Lighthouse measures a simulated page view without real devices, without real networks and without consent given, so without the tags that only load after consent. Google, by contrast, assesses the 75th percentile of real visits over 28 days. A Lighthouse score works as a check before merge, sign-off happens with field data per page type.

How is Interaction to Next Paint checked before go-live?

With named interactions that are executed and measured in the Performance panel of Chrome DevTools or in Lighthouse timespan mode with CPU throttling. A pure load check does not capture any interaction. Total Blocking Time only serves as an approximation of main thread load there.

Who signs off performance tickets?

Ideally a party that is not itself responsible for the implementation. The team checks the criteria before merge itself. An independent party checks the evidence in field data after 28 days against target value and baseline.