The Email QA Tool is a standalone browser-based tool that lets QA testers, producers and developers run automated checks on an American Express email HTML file — without installing Cypress, Node.js or any other software.
What you need
A modern browser
Chrome, Edge, Firefox or Safari — any current version works. Internet Explorer is not supported.
The email HTML file
Your .html or .htm email file, saved locally.
Image folder (optional)
The folder that contains all images referenced by the email. Only needed if the email uses relative local image paths and you want to see them rendered correctly in the preview.
Upload your Email HTML file
In the left sidebar, click the "Email HTML File" upload zone (or drag your .html file onto it). Once loaded, a green confirmation badge will appear showing the file name, and the Run QA Checks button will become active.
Upload your Image Folder (optional)
If your email uses relative image paths (e.g. images/hero.jpg instead of a full URL), click the "Email Image Folder" zone and select the folder that contains all the email's images. The tool will rewrite those paths as blob URLs so images appear correctly in the preview panel.
Click "Run QA Checks"
Press the blue Run QA Checks button. The tool will parse your HTML, run all 39 automated checks across four categories, and display the results in the right panel within seconds. A spinning indicator will show while checks are running.
💡 You can re-run checks at any time after uploading a new fileReview results and export
Use the filter tabs (All / Fail / Warn) to focus on issues. Each result shows the check name, a status badge, and a detail message explaining what was found. Scroll down to see the Email Preview panel. When finished, click Export Report to download a .txt summary file.
Email is 620px wide (1240px for Retina)
Scans all <table> elements for a width attribute of 620 or 1240.
All images have a valid src attribute
Checks every <img> tag for a non-empty, non-placeholder src value.
All local images found in uploaded folder
When a folder is uploaded, resolves each relative image path against the folder. Reports any images not found. (Skipped if no folder is uploaded.)
No stacked line breaks (3+ consecutive <br>)
Flags any run of 3 or more consecutive <br> tags which can cause unwanted spacing on some clients.
Footnote markers detected in email body
Looks for numeric markers (1.–20.) in the visible text. A WARN means none were found — not necessarily a failure.
Horizontal divider elements present
Counts <hr> tags and elements with inline border styles. A WARN means none were found — verify visually in the preview.
Common misspellings check
Scans visible text against a 40-word list of frequently misspelled words.
Special characters encoded
Compares raw apostrophe and em dash counts against encoded equivalents (’ — etc.).
No AMPscript variable leaks
Detects unresolved %%VARIABLE%% tokens that would appear as raw code in the live email.
Preview / preheader text markup present
Looks for class names or IDs containing "preview" or "preheader" in the HTML.
Preview spacer / white-space code after preheader
Checks for ͏, ‌, , or white-space CSS used to push preheader text out of the preview snippet.
Title tag is not empty
Checks the <title> tag exists and contains text.
All alt tags in place (non-empty)
Every <img> must have a non-empty alt attribute.
Footnotes use sup / span / entity tags
Detects <sup>, vertical-align spans, or ¹ / ² / ³ entities.
No href="#" placeholder links
Flags every <a href="#"> that hasn't been replaced with a real URL.
No extra spaces in src or href attributes
Checks for leading or trailing whitespace inside src="" and href="" values.
No <script> tags in email HTML
Script tags will be stripped by most email clients and can trigger spam filters.
All external links open in a new tab
Checks every http/https link for target="_blank".
Every external link has aria-label "opens a new tab"
Accessibility requirement for screen reader users opening links.
‑ non-breaking hyphen not present
‑ causes rendering issues in most email clients — use CSS nowrap instead.
role="main" aria-roledescription="email" aria-label present
Required ARIA landmark for screen reader compatibility per accessibility standards.
Heroes wrapped in <H1> or aria-level="1"
Desktop and mobile hero images/copy should be wrapped in <h1> or role="heading" aria-level="1".
Body headlines use <H2>/<H3> or aria-level="2/3"
Headline-like images below the hero should be marked up with appropriate heading hierarchy.
T&C heading aria-level="2"
The Terms and Conditions heading must use role="heading" aria-level="2".
Numbered T&C headings aria-level="3"
Numbered sub-sections inside T&C should use role="heading" aria-level="3".
T&C URLs blue and underlined (class="a5u")
All links inside Terms sections must carry the class="a5u" styling.
List items use role="list" / role="listitem"
Any list-like layout must use ARIA list roles for screen reader compatibility.
lang="en" and dir="ltr" present
Required on the main container for internationalization and RTL safety.
Subject Line and Preview in the script
Checks for SubjectLine and preview/preheader references in the AMPscript block.
SFMC Business header/footer ContentBlockByName
Verifies bus_header and bus_footer embed strings are present for SFMC emails.
Blue links on grey backgrounds use #005dae
Scans for the correct hex value for links placed on grey backgrounds.
Blue links on white backgrounds use #006fcf
Scans for the correct hex value for links on white/light backgrounds.
Body text color is #3D3D3D, not #333333
Flags any use of the incorrect dark grey hex value for body copy.
Background/divider is #E0E0E0, not #D9D9D6
Flags the incorrect background grey that was used in older templates.
Dividers use #595959, not #CCCCCC
Checks that horizontal divider lines use the correct divider color.
CMPGN_VER_CELL_ID conditional logic present
Checks for the campaign version cell ID variable used for multi-version sends.
RaiseError present for invalid cell IDs
Ensures error handling logic exists for unrecognized cell IDs in AMPscript.
HTML_disclosure ContentBlockByName present
Verifies the footer disclosure embed code is included.
Physical address / copyright ContentBlockByName present
Checks footer contains either a physical_address or copyright content block.
CTA URL variable(s) set in AMPscript
Looks for CTA_URL references to confirm call-to-action links are wired up.
PERSONALIZATION variable(s) present
Checks whether personalization tokens appear in the email (required for personalised emails).
Status meanings
The check ran successfully and the condition was met. No action required for this item.
The check detected a definite issue that needs to be fixed before the email is deployed. Address all FAIL items.
The check found a potential issue or could not fully verify the condition automatically. A human should review the detail message and confirm.
Using the filter tabs
Above the results list, three filter tabs let you quickly isolate specific result types:
All
Shows every check result across all four categories. Default view.
Fail
Shows only failed checks — the critical issues that must be resolved before deployment.
Warn
Shows only warning checks — items that need a human to confirm or investigate.
Summary bar
At the top of the results area, a summary bar shows totals at a glance:
Aim for zero FAIL results before handing off. WARN results should each be reviewed manually.
After running checks, click the ⬇ Export Report button in the summary bar. A plain-text file called amex-qa-report.txt will be downloaded to your default downloads folder.
AMEX EMAIL QA REPORT
Generated: 4/23/2026, 10:15:00 AM
════════════════════════════════════════════════════════════
[ VISUALS / UI ]
[PASS] Email is 620px wide (1240px for Retina)
620px or 1240px outer table detected.
[FAIL] All images have a valid src attribute
Missing/empty src: images/hero.jpg, images/cta.png
[PASS] No stacked line breaks
No stacked <br> tags found.
[ COPY ]
[PASS] Common misspellings check
No common misspellings detected.
[WARN] Preview/preheader text markup present
No preheader markup detected — verify manually.
════════════════════════════════════════════════════════════
SUMMARY: 28 pass | 3 fail | 8 warn | 39 total
.txt file to your project ticket or paste it into the Account Notes section of your QA sheet for a permanent record.
.html or .htm extension. Once the file loads, a green badge will appear and the button will become active.
href attributes (not empty, not #, no extra spaces) and that they open in new tabs. Verifying that each URL leads to the correct page must be done manually by clicking each link — this cannot be automated safely in a browser-based tool.
- PDF vs. HTML visual comparison
- GIF frame-by-frame review and watermark check
- Font size, weight, orientation and spacing visual check
- Grammar and punctuation review
- TM / brand name consistency with PDF
- Clicking each link to confirm it goes to the right page
- Confirming Hero/GIF/CTA URLs match the HTML form
- Litmus cross-client rendering tests
- Image file size check (<500KB non-animated, <2MB animated)
- PZN / MI code matching against documentation
webkitdirectory) may not be supported on all mobile browsers.
#006fcf (all lowercase) or #006FCF (uppercase) — both should match, but mixed case may occasionally cause issues depending on how the value is written.