{"modules":[{"id":"email-accessibility","name":"Accessibility criteria met (WCAG, source-decidable)","category":"accessibility-compliance","severity":"recommended","description":"Source-decidable WCAG checks over the email: language declaration, table semantics, colour contrast, link naming, tap-target size, and animation duration — enabled by conformance level (A, AA default, AAA). Checks that cannot be decided from source abstain with a typed reason rather than guessing, and the result is never a compliance verdict. See docs/EMAIL-ACCESSIBILITY.md.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-accessibility/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-cta-button-visible","name":"CTA button visible and unclipped","category":"content-quality","severity":"recommended","description":"At least one call-to-action button must be visible and fully rendered at each selected viewport.","subjectType":"email","executionKind":"visual","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":null,"defaultClients":{"mobile":["gmail_chrome_mobile","outlook_chrome_mobile"],"desktop":["gmail_chrome","outlook_chrome"]},"price":{"unitCredits":6,"unit":"per_capture","captureCount":4,"captureMailboxes":2,"captureCredits":20,"configuredCredits":24}},{"id":"email-footer-complete","name":"Footer complete with required elements","category":"brand-compliance","severity":"required","description":"The email footer must contain every element you ask this check to look for. There is no default list: a curated standard states the elements its category owes, or you state your own. Selecting the check without either skips it rather than grading your footer against an assumed category.","subjectType":"email","executionKind":"visual","runnable":true,"requiresValidationId":null,"requiresConfiguration":true,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-footer-complete/custom","defaultClients":{"mobile":["gmail_chrome_mobile","outlook_chrome_mobile"],"desktop":["gmail_chrome","outlook_chrome"]},"price":{"unitCredits":5,"unit":"per_capture","captureCount":4,"captureMailboxes":2,"captureCredits":20,"configuredCredits":20}},{"id":"email-from-domain-match","name":"From-domain match","category":"brand-compliance","severity":"recommended","description":"Parse From: header; extract domain. Fail if domain is not in allowedFromDomains parameter list (case-insensitive). Error if From: header is absent.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":true,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-from-domain-match/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-gmail-clip-size","name":"Email opens fully in Gmail","category":"deliverability","severity":"recommended","description":"Gmail truncates a message whose HTML source exceeds roughly 102KB and hides the rest behind \"View entire message\" — taking the footer, the unsubscribe link and the tracking pixel with it. The HTML body must stay under the configured byte limit. See docs/EMAIL-GMAIL-CLIPPING.md.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-gmail-clip-size/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-hero-image-renders","name":"Hero / banner image renders","category":"content-quality","severity":"recommended","description":"The primary hero or banner image in the email body must load and render fully.","subjectType":"email","executionKind":"visual","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":null,"defaultClients":{"mobile":["gmail_chrome_mobile","outlook_chrome_mobile"],"desktop":["gmail_chrome","outlook_chrome"]},"price":{"unitCredits":4,"unit":"per_capture","captureCount":4,"captureMailboxes":2,"captureCredits":20,"configuredCredits":16}},{"id":"email-image-alt-text","name":"Images have usable ALT text","category":"accessibility-compliance","severity":"recommended","description":"Every image must carry an alt attribute: informative images with real alternative text (not filenames, URLs, or placeholders), decorative images marked alt=\"\", and image-only links must keep an accessible name. Spacers and tracking pixels are ignored.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-image-alt-text/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1},"addons":[{"id":"email-images-off-legibility","name":"Email still legible with images off","category":"accessibility-compliance","severity":"optional","description":"With images blocked — what Outlook shows every recipient who has not added you to their Safe Senders list — the email must still convey what it is offering and give the reader a way to act. Requires the Images have usable ALT text check, which supplies the free half of the same question.","subjectType":"email","executionKind":"visual","runnable":true,"requiresValidationId":"email-image-alt-text","requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":null,"defaultClients":{"desktop":["gmail_chrome","outlook_chrome"]},"price":{"unitCredits":5,"unit":"per_capture","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":10}}]},{"id":"email-image-clipping","name":"Images unclipped and displayed properly","category":"content-quality","severity":"recommended","description":"No image in the rendered email may be clipped, cropped, or scaled in a way that damages its message — cut-off text inside images, truncated faces or products, or visibly broken framing.","subjectType":"email","executionKind":"visual","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":null,"defaultClients":{"mobile":["gmail_chrome_mobile","outlook_chrome_mobile"],"desktop":["gmail_chrome","outlook_chrome"]},"price":{"unitCredits":7,"unit":"per_capture","captureCount":4,"captureMailboxes":2,"captureCredits":20,"configuredCredits":28}},{"id":"email-image-rendering","name":"Images render and scale correctly","category":"content-quality","severity":"recommended","description":"Every image in the email must load, and must be displayed at a size its file can actually fill. Stretching an image beyond its own pixels forces the mail client to invent the ones it does not have, which is what makes an image look soft or blocky — so an image displayed more than a quarter larger than its file is reported, as is one squashed or stretched out of its true shape. Good practice is to export at twice the display size and set the width attribute to half, so images stay sharp on the high-resolution screens most email is read on.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-image-rendering/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-image-source-integrity","name":"Image sources resolve and are permitted","category":"link-functional-testing","severity":"recommended","description":"Inventory img/background/style-block image references; resolve cid/data/remote with manual redirect following (chain recorded, capped at 5 hops); fail on unresolvable/undecodable sources, hosts outside approvedAssetHosts (source or redirect destination; empty list = no restriction), and http-only sources whose https upgrade fails.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-image-source-integrity/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-layout-not-broken","name":"Layout not broken at any viewport","category":"content-quality","severity":"required","description":"The overall email layout must not be broken at any selected viewport.","subjectType":"email","executionKind":"visual","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":null,"defaultClients":{"mobile":["gmail_chrome_mobile","outlook_chrome_mobile"],"tablet":["gmail_chrome_tablet","outlook_chrome_tablet"],"desktop":["gmail_chrome","outlook_chrome"]},"price":{"unitCredits":4,"unit":"per_capture","captureCount":6,"captureMailboxes":2,"captureCredits":20,"configuredCredits":24}},{"id":"email-link-integrity","name":"Links valid, reachable, and correctly redirected","category":"link-functional-testing","severity":"recommended","description":"Every link in the email must parse as a valid absolute URL with a legitimate scheme, resolve over HTTP (redirect chains followed and recorded), and land on an approved destination when a domain list is configured. Bot-protected links are reported unverifiable, never failed. See docs/EMAIL-LINK-INTEGRITY.md.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-link-integrity/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-logo-visible","name":"Brand logo visible in header","category":"brand-compliance","severity":"required","description":"The brand logo must be present and clearly visible in the header area of the email at all selected viewports.","subjectType":"email","executionKind":"visual","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":null,"defaultClients":{"mobile":["gmail_chrome_mobile","outlook_chrome_mobile"],"desktop":["gmail_chrome","outlook_chrome"]},"price":{"unitCredits":4,"unit":"per_capture","captureCount":4,"captureMailboxes":2,"captureCredits":20,"configuredCredits":16}},{"id":"email-no-placeholder-text","name":"No placeholder / merge-tag text","category":"content-quality","severity":"required","description":"Scan subject, first 200 chars of text/plain (preheader proxy), and HTML body text against placeholderPatterns.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-no-placeholder-text/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-physical-address-present","name":"Physical mailing address present","category":"legal-privacy-compliance","severity":"required","description":"Strip HTML tags from body and match physical address patterns (street number + street + city/state/postal code).","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-physical-address-present/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-plaintext-alt-present","name":"Plain-text alternative part present","category":"deliverability","severity":"required","description":"Parse MIME structure. Fail when not multipart/alternative or text/plain part is absent/empty.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":null,"price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-preheader","name":"Preheader / inbox preview text intentional","category":"content-quality","severity":"recommended","description":"The inbox preview snippet must be intentional: no boilerplate (\"view in browser\", unsubscribe) or leaked merge tokens next to the subject line, required preheader content present within the visible window, and no preview-garbling defects in the source.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-preheader/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-subject-content","name":"Subject line matches approved content","category":"content-quality","severity":"optional","description":"Customer-configured subject verification: the received subject must exactly match an approved subject, contain required phrases, avoid prohibited patterns, and match a required pattern when configured. Skips until approvedSubjects is configured. See docs/EMAIL-SUBJECT-CONTENT.md.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":true,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-subject-content/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-subject-line-length","name":"Subject line within length limit","category":"content-quality","severity":"recommended","description":"Extract Subject header; count Unicode characters; fail when count exceeds maxSubjectLength.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-subject-line-length/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-tracking-integrity","name":"Tracking parameters present, well-formed, and preserved","category":"link-functional-testing","severity":"recommended","description":"Tracking on email links must be intact: no unresolved merge tags, empty UTM values, typo'd utm_ keys, duplicate parameters, ad-platform click-ids, or raw email addresses in query strings. When tracked domains are configured, marketing links must carry the required parameters (UTM or custom names), match the required link pattern, and keep their parameters through redirect chains; a required tracking pixel can also be enforced. See docs/EMAIL-TRACKING-INTEGRITY.md.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-tracking-integrity/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-typography","name":"Typography follows approved brand rules","category":"brand-compliance","severity":"optional","description":"Customer-configured typography verification: every font stack in the email must match an approved brand stack, webfonts must ship an Outlook defense, and weights/sizes must use client-safe vocabulary. Skips until approvedFontStacks is configured. See docs/EMAIL-TYPOGRAPHY.md.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":true,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/email-typography/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-unsubscribe-present","name":"Unsubscribe mechanism present","category":"legal-privacy-compliance","severity":"required","description":"Check MIME List-Unsubscribe header and rendered HTML anchors for unsubscribe URL/text patterns. Pass if either check passes.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":null,"price":{"unitCredits":1,"unit":"per_run","captureCount":2,"captureMailboxes":2,"captureCredits":20,"configuredCredits":1}},{"id":"email-utm-inventory","name":"Link UTM and query parameters inventoried","category":"link-functional-testing","severity":"recommended","description":"Lists every http(s) link in the email and returns its decoded query parameters, with utm_-prefixed keys surfaced separately. Does not judge correctness — inventory only. See docs/EMAIL-UTM-INVENTORY.md.","subjectType":"email","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":null,"price":null},{"id":"font-size-body-min-max","name":"Minimum font size for body text","category":"accessibility-compliance","severity":"required","description":"In order for any webpage to be minimally readable, a font size minimum and maximum should be set","subjectType":"url","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/font-size-body-min-max/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":3,"captureMailboxes":3,"captureCredits":1,"configuredCredits":1}},{"id":"footer-compliance","name":"Footer Compliance","category":"brand-compliance","severity":"required","description":"Verify footer includes required brand elements","subjectType":"url","executionKind":"visual","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/footer-compliance/custom","price":{"unitCredits":5,"unit":"per_capture","captureCount":3,"captureMailboxes":3,"captureCredits":1,"configuredCredits":15}},{"id":"logo-usage","name":"Logo Usage","category":"brand-compliance","severity":"required","description":"Verify logo is present and follows brand guidelines","subjectType":"url","executionKind":"visual","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/logo-usage/custom","price":{"unitCredits":5,"unit":"per_capture","captureCount":3,"captureMailboxes":3,"captureCredits":1,"configuredCredits":15}},{"id":"no-lorem-ipsum","name":"No Lorem Ipsum","category":"content-quality","severity":"required","description":"No placeholder text - prohibited phrases must not be present","subjectType":"url","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/no-lorem-ipsum/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":1,"captureMailboxes":1,"captureCredits":1,"configuredCredits":1}},{"id":"page-load-speed","name":"Page load speed within budget","category":"performance-testing","severity":"recommended","description":"Measures the page load from the browser's own performance timeline: Largest Contentful Paint, time to first byte, first paint, page weight and a per-resource-type breakdown of bytes and time, plus the heaviest and slowest resources. Only LCP is judged, against the configurable maxLcpMs budget (2500 ms by default); everything else is reported, because the harness measures one unthrottled load and no published threshold settles them. See docs/PAGE-LOAD-SPEED.md.","subjectType":"url","executionKind":"functional","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/page-load-speed/custom","price":{"unitCredits":1,"unit":"per_run","captureCount":1,"captureMailboxes":1,"captureCredits":1,"configuredCredits":1}},{"id":"visual-diff","name":"Visual Diff Detection","category":"change-detection","severity":"recommended","description":"Optional monitoring check for pages that should not change. Compares the current screenshot against the previous capture of the same URL and viewport; fails when a meaningful difference is detected so a human can confirm whether the change was intended. Requires a prior capture — the first run always passes. Best used on a recurring schedule.","subjectType":"url","executionKind":"visual","runnable":true,"requiresValidationId":null,"requiresConfiguration":false,"schemaStandardUrl":"https://www.schemafirst.org","customPublicUrl":"https://app.arbiterqa.com/validations/visual-diff/custom","price":{"unitCredits":5,"unit":"per_capture","captureCount":3,"captureMailboxes":3,"captureCredits":1,"configuredCredits":15}}],"count":29}