# Accessibility Conformance Report — HelloGrowthCRM

### Voluntary Product Accessibility Template® (VPAT®) Version 2.5 — WCAG Edition

**Name of Product/Version:** HelloGrowthCRM — Marketing Website (`hellogrowthcrm.com`) and CRM Web Application
**Report Date:** 2026-07-07
**Product Description:** HelloGrowthCRM is an AI-native, WhatsApp-first B2B CRM for small and mid-market businesses, together with its public marketing website.
**Contact Information:** sales@hellogrowthcrm.com
**Notes:** This report documents conformance for two web surfaces we control — the public marketing website (Next.js) and the authenticated CRM web application (React/Vite SPA). Native mobile (iOS/Android via Capacitor) is out of scope for this edition.
**Evaluation Methods Used:** Automated testing with **axe-core** (WCAG 2.0/2.1 A & AA rulesets) and **Google Lighthouse**, run in continuous integration on every change across representative pages/flows; supplemented by **manual static source-code review** of shared chrome, UI primitives, modals, authentication, and the primary data-grid flow. Manual assistive-technology testing (screen reader + keyboard-only) is performed on key flows and is being expanded.

---

## Applicable Standards / Guidelines

| Standard / Guideline | Included in Report |
|---|---|
| Web Content Accessibility Guidelines (WCAG) 2.1 | **Level A — Yes; Level AA — Yes;** Level AAA — No |

## Terms

- **Supports:** The functionality of the product has at least one method that meets the criterion without known defects, or meets with equivalent facilitation.
- **Partially Supports:** Some functionality of the product does not meet the criterion.
- **Does Not Support:** The majority of product functionality does not meet the criterion.
- **Not Applicable:** The criterion is not relevant to the product.

---

## WCAG 2.1 Report

### Table 1: Success Criteria, Level A

| Criteria | Conformance Level | Remarks and Explanations |
|---|---|---|
| **1.1.1 Non-text Content** | Partially Supports | Logos, QR codes, and informative icons carry `alt`/`aria-label`; icon-only controls are labeled. A small number of ad-hoc images/icons still rely on adjacent text. Enforced going forward by the `image-alt`/`button-name`/`link-name` CI gates. |
| **1.2.1 Audio-only and Video-only (Prerecorded)** | Not Applicable | No prerecorded audio-only or video-only content in the audited scope. |
| **1.2.2 Captions (Prerecorded)** | Not Applicable | No first-party prerecorded synchronized media in scope; embedded third-party video, where present, is captioned by its source. |
| **1.2.3 Audio Description or Media Alternative (Prerecorded)** | Not Applicable | See 1.2.2. |
| **1.3.1 Info and Relationships** | Partially Supports | Semantic HTML, headings, associated form labels, and a real `<table>` for the CRM data grid are used. Gaps: CRM sortable column headers lacked `aria-sort` and the header control was a `<div>` (remediated 2026-07-07); some grouping `aria-label`s were on non-landmark elements (remediated). |
| **1.3.2 Meaningful Sequence** | Supports | DOM order matches visual/reading order; no CSS-driven reordering that changes meaning. |
| **1.3.3 Sensory Characteristics** | Partially Supports | Instructions do not rely on shape/location alone. Exception: CRM sort direction was conveyed by icon only — a text/`aria-sort` cue was added 2026-07-07. |
| **1.4.1 Use of Color** | Partially Supports | Color is generally not the sole information carrier. Some CRM status/reply labels used color alone; paired with `aria-sort`/text remediation and tracked for the remaining status chips. |
| **1.4.2 Audio Control** | Not Applicable | No auto-playing audio. |
| **2.1.1 Keyboard** | Partially Supports | Navigation, forms, modals, menus, and grid actions are keyboard-operable (nav dropdown false-menu semantics fixed; modal focus fixed). Residual: CRM column-resize handle and whole-row click are pointer-first (accessible alternatives exist — per-row "Edit" menu item; documented in the app audit as A-05/A-08). |
| **2.1.2 No Keyboard Trap** | Supports | Radix modals manage focus correctly; the one hand-rolled marketing modal was given a proper focus trap with Escape/restore (2026-07-07). |
| **2.1.4 Character Key Shortcuts** | Partially Supports | The CRM data grid offers single-key navigation shortcuts scoped to the focused grid; a global mechanism to remap/disable is tracked. Marketing site has no single-character shortcuts. |
| **2.2.1 Timing Adjustable** | Not Applicable | No time limits on content. |
| **2.2.2 Pause, Stop, Hide** | Supports | `prefers-reduced-motion` is honored globally; no auto-updating content that cannot be paused. |
| **2.3.1 Three Flashes or Below Threshold** | Supports | No flashing content. |
| **2.4.1 Bypass Blocks** | Supports | A skip-to-content link is present on both the website (`app/layout.tsx` → `#main-content`) and the app (`ui/skip-link.tsx` → `<main id="main-content">`). |
| **2.4.2 Page Titled** | Supports | Descriptive, unique page titles (website via Next.js metadata; app via `usePageTitle`). Enforced by the Lighthouse `document-title` gate. |
| **2.4.3 Focus Order** | Supports | Focus order follows a meaningful sequence; the hand-rolled marketing modal now moves and restores focus correctly (2026-07-07). |
| **2.4.4 Link Purpose (In Context)** | Supports | Link text is descriptive in context; icon links carry accessible names. Enforced by the `link-name` gate. |
| **2.5.1 Pointer Gestures** | Supports | No multipoint/path-based gestures required. |
| **2.5.2 Pointer Cancellation** | Supports | Actions fire on `click`/pointer-up, not down. |
| **2.5.3 Label in Name** | Supports | Visible labels are contained in the accessible name of controls. |
| **2.5.4 Motion Actuation** | Not Applicable | No motion-actuated functionality on web. |
| **3.1.1 Language of Page** | Supports | `<html lang="en">` on both surfaces. Enforced by the `html-has-lang`/`html-lang-valid` gates. |
| **3.2.1 On Focus** | Supports | Focus does not trigger unexpected context changes. |
| **3.2.2 On Input** | Supports | Changing a form control does not auto-submit or cause an unexpected context change without warning. |
| **3.3.1 Error Identification** | Partially Supports | Errors are surfaced. Website lead forms announce via a live-region toast but did not always tie the message to the field (`aria-invalid`/`aria-describedby`) — tracked (W-08). App: Login is exemplary; Signup error association and the login-lockout banner announcement were remediated 2026-07-07 (A-02, A-03). |
| **3.3.2 Labels or Instructions** | Supports | Form fields have associated `<label>`s (or `sr-only` labels) and appropriate instructions/`autocomplete`. Enforced by the `label` gate. |
| **4.1.1 Parsing** | Supports | Markup is well-formed; no duplicate IDs flagged (`duplicate-id-aria` gate). |
| **4.1.2 Name, Role, Value** | Partially Supports | Controls generally expose correct name/role/state. Remediated 2026-07-07: sitewide nav dropdowns advertised `role="menu"` without menu keyboard semantics (now a disclosure); CRM sort headers were non-semantic `<div>`s (now buttons with `aria-sort`); one icon button relied on `title` only (now `aria-label`). |

### Table 2: Success Criteria, Level AA

| Criteria | Conformance Level | Remarks and Explanations |
|---|---|---|
| **1.2.4 Captions (Live)** | Not Applicable | No live media. |
| **1.2.5 Audio Description (Prerecorded)** | Not Applicable | See 1.2.2. |
| **1.3.4 Orientation** | Supports | Content is not locked to a single orientation; responsive layout reflows. |
| **1.3.5 Identify Input Purpose** | Supports | Inputs collecting user data use standard `autocomplete` tokens (`name`, `email`, `tel`, `given-name`, `family-name`, `current-password`, `new-password`). |
| **1.4.3 Contrast (Minimum)** | Partially Supports | Brand purple and body/muted text meet AA. Remediated 2026-07-07: paid get-started page `text-green-600` (≈3.3:1 → `green-700` ≈4.9:1); CRM small status/reply labels queued to move to AA-tuned tokens (A-04). Residual: "G2" logotype text (brand exception likely). Enforced going forward by the Lighthouse `color-contrast` gate + axe in CI. |
| **1.4.4 Resize Text** | Supports | Text resizes to 200% without loss of content/function; `meta-viewport` does not disable zoom (`maximum-scale=5`). Enforced by the `meta-viewport` gate. |
| **1.4.5 Images of Text** | Supports | Text is real text; logos are the only images of text. |
| **1.4.10 Reflow** | Supports | Content reflows to a 320px-equivalent viewport without two-dimensional scrolling. |
| **1.4.11 Non-text Contrast** | Partially Supports | Focus indicators, buttons, and form borders generally meet 3:1. Some low-contrast UI accents in the CRM grid are tracked with 1.4.3 remediation. |
| **1.4.12 Text Spacing** | Supports | No loss of content when text spacing is overridden. |
| **1.4.13 Content on Hover or Focus** | Supports | Nav dropdowns and hover content are dismissible (Escape), hoverable, and persistent; the false `menu` semantics were removed and Escape dismissal retained (2026-07-07). |
| **2.4.5 Multiple Ways** | Supports | Multiple ways to locate pages: global navigation, footer sitemap, search/command palette (app), and internal linking (website). |
| **2.4.6 Headings and Labels** | Supports | Headings and labels are descriptive; single `<h1>` per page is enforced on the website. |
| **2.4.7 Focus Visible** | Supports | Global `:focus-visible` indicator plus per-component `focus-visible:ring-2` on Button/Input/Select on both surfaces. |
| **3.1.2 Language of Parts** | Partially Supports | Primary language is set. Localized/regional marketing pages exist; per-part `lang` on inline foreign-language phrases is applied inconsistently and is tracked. |
| **3.2.3 Consistent Navigation** | Supports | Navigation and footer are consistent across pages. |
| **3.2.4 Consistent Identification** | Supports | Components with the same function are identified consistently. |
| **3.3.3 Error Suggestion** | Partially Supports | Validation messages describe the problem and often the fix; some hand-rolled forms give generic messages. Tied to the W-08/A-02 field-association work. |
| **3.3.4 Error Prevention (Legal, Financial, Data)** | Supports | Billing/subscription and destructive actions in the app use confirmation steps and are reversible or reviewable before commit. |
| **4.1.3 Status Messages** | Partially Supports | Toasts use live regions (Radix Toast / Sonner) and announce without focus change. Remediated 2026-07-07: the app login-lockout banner and Signup field errors now use `role="alert"` (A-02, A-03). Some dynamically inserted banners are still being swept. |

---

## Level AAA
Not evaluated / not claimed in this report.

---

## Legal Disclaimer
This report describes HelloGrowthCRM's current conformance based on the evaluation methods and date above and is provided for informational purposes. Accessibility is an ongoing program; conformance for specific pages may change as content and features ship. The most current version of this report and our remediation status is available from sales@hellogrowthcrm.com.

## Change Log
- **2026-07-07** — Initial VPAT 2.5 ACR published. Accompanied by the first formal WCAG 2.1 AA audit of the website and CRM app, a strengthened axe-core + Lighthouse CI conformance gate, and remediation of the serious/high-leverage findings (see the per-repo `docs/accessibility/ACCESSIBILITY_AUDIT_2026-07-07.md`).
