# Apex Sentinel — Better Cannabis Monthly Audit

**URL:** https://bettercannabis.com/
**Platform:** unknown
**Archetype:** wellness
**Run ID:** 2026-04-19T06-18-18-831Z
**Scanned:** 2026-04-19T06:45:44.054Z
**Duration:** 658s

This is a **monthly deep audit**. The crawler performed a full-site scan including
Lighthouse performance, axe-core accessibility (WCAG 2.2 AA), cross-browser compatibility,
security headers, schema markup validation, and SEO best-practice checks.

Because this site is not a repository we control, Apex Sentinel **cannot automatically
apply fixes** — instead, each finding below includes an AI-generated plain-English
explanation + step-by-step recommended fix you can hand to a developer or execute
in your CMS directly.

---

## Executive Summary

**Overall grade:** **F**

| Dimension | Count | Meaning |
|---|---|---|
| Pages crawled | 10 | Full sitemap + linked pages |
| P0 (critical) | 1 | Site-down or compliance-breaking |
| P1 (urgent) | 3 | Significant revenue / SEO / UX impact |
| P2 (high) | 43 | Quality / ranking / trust degradation |
| P3 (medium) | 42 | Polish + optimization |
| "Do first" items | 5 | AI-flagged top priorities |
| Quick wins (< 30 min) | 46 | Fastest ROI items |

---

## Top 10 Actions (Ranked)

If you only have time for ten things this month, do these — in this order.

1. **[P0] 🔴 DO FIRST Sensitive artifact exposed: /wp-login.php** — _Exposed login pages make your site a target for credential-stuffing attacks, which could compromise customer data, payment information, and your ability to serve patients—potentially triggering compliance violations and lost revenue._
   Page: https://bettercannabis.com/wp-login.php
   Effort: Quick win (< 30 min)
2. **[P1] 🔴 DO FIRST A11y: ARIA dialog and alertdialog nodes should have an accessible name** — _Screen reader users—including customers with visual disabilities—cannot understand the purpose of your age gate and may abandon the site before confirming they're of legal age, reducing traffic and potentially exposing you to liability if an inaccessible age gate fails to deter minors._
   Page: https://bettercannabis.com/
   Effort: Quick win (< 30 min)
3. **[P1] 🔴 DO FIRST A11y: Elements must meet minimum color contrast ratio thresholds (×11)** — _Poor contrast reduces accessibility for customers with vision impairments, increases bounce rate, and exposes you to potential ADA compliance claims—particularly serious for a retail site where age verification and product information must be readable by all visitors._
   Page: https://bettercannabis.com/
   Effort: Moderate (1-3 hours)
4. **[P1] 🔴 DO FIRST A11y: Links must have discernible text (×3)** — _Inaccessible links expose you to ADA compliance risk, lock out customers with disabilities, and harm SEO credibility — search engines penalize sites that fail basic accessibility standards._
   Page: https://bettercannabis.com/
   Effort: Quick win (< 30 min)
5. **[P2] 🔴 DO FIRST 20 image(s) missing alt text** — _Inaccessible sites invite ADA lawsuits, alienate disabled customers, and lose image search traffic; for a wellness brand, these visitors often use assistive tech and represent loyal, high-intent audiences._
   Page: https://bettercannabis.com/
   Effort: Moderate (1-3 hours)
6. **[P2] 🟠 HIGH No JSON-LD schema** — _Missing schema means lower click-through rates in search results, lost local visibility for "dispensaries near me" queries, and reduced trust signals that could push customers to competitors with better search listings._
   Page: https://bettercannabis.com/hello-world/
   Effort: Moderate (1-3 hours)
7. **[P2] 🟠 HIGH 6 image(s) missing alt text** — _Missing alt text reduces your visibility in Google Images, cuts off potential customers using accessibility tools, and may expose you to legal risk under accessibility standards that cannabis retailers should follow._
   Page: https://bettercannabis.com/hello-world/
   Effort: Quick win (< 30 min)
8. **[P2] 🟠 HIGH Missing meta description** — _Without a crafted meta description, searchers see a generic snippet instead of your key selling points (e.g., licensed products, compliance, local delivery), directly lowering clicks from search traffic and revenue._
   Page: https://bettercannabis.com/
   Effort: Quick win (< 30 min)
9. **[P2] 🟠 HIGH Missing meta description** — _A weak or missing meta description reduces click-through rate from search results, meaning fewer potential customers visit your site even when you rank for relevant keywords._
   Page: https://bettercannabis.com/story/
   Effort: Quick win (< 30 min)
10. **[P2] 🟠 HIGH No JSON-LD schema** — _Missing schema reduces your visibility in local search results and Google Maps, making it harder for customers actively searching for cannabis dispensaries near them to find and choose your business._
   Page: https://bettercannabis.com/story/
   Effort: Moderate (1-3 hours)

---

## Findings by Severity

### P0 — 1 finding

### 1. Sensitive artifact exposed: /wp-login.php

- **Severity:** P0   |   **Priority:** 🔴 DO FIRST
- **Effort:** Quick win (< 30 min)
- **Business category:** security
- **Page URL:** https://bettercannabis.com/wp-login.php
- **Rule:** `tier5.exposed.artifact`

**What it means (plain English)**

Your WordPress admin login page is publicly accessible at /wp-login.php. This is a common entry point for hackers trying to break into sites. While it's normal for WordPress sites to have this file, it should be hidden or protected to reduce your exposure to automated attacks that try thousands of password combinations.

**Why it matters for your business:** Exposed login pages make your site a target for credential-stuffing attacks, which could compromise customer data, payment information, and your ability to serve patients—potentially triggering compliance violations and lost revenue.

**Technical root cause:** WordPress installs the wp-login.php file by default and allows it to be accessed directly. The site lacks edge-level (firewall or CDN) restrictions or server rules to block or redirect this sensitive administrative path.

**Recommended fix — step by step**

1. Log in to your hosting control panel (cPanel, Plesk, or equivalent) and locate the .htaccess file in your site root; if using Nginx, find the server block configuration.
2. Add a rule to block direct access to /wp-login.php: for Apache, add `<Files wp-login.php> Order Allow,Deny Deny from all </Files>`; for Nginx, add `location = /wp-login.php { deny all; }` and reload.
3. Alternatively, install a WordPress security plugin like Wordfence or iThemes Security (free versions available) and enable 'Two-Factor Authentication' + 'Limit Login Attempts' under their settings.
4. Change your WordPress username from the default 'admin' to something non-obvious via Users > Your Profile in the WordPress admin dashboard.
5. Verify the change worked by visiting https://bettercannabis.com/wp-login.php in an incognito browser window—you should see a 403 Forbidden error or a redirect instead of the login form.
6. If using a CDN (Cloudflare, AWS CloudFront, etc.), add a WAF rule to block requests to /wp-login.php, /wp-admin/, and /xmlrpc.php from outside your office IP addresses.

---

### P1 — 3 findings

### 1. A11y: ARIA dialog and alertdialog nodes should have an accessible name

- **Severity:** P1   |   **Priority:** 🔴 DO FIRST
- **Effort:** Quick win (< 30 min)
- **Business category:** compliance
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier9.a11y.aria-dialog-name`

**What it means (plain English)**

Your age-gate dialog (the overlay that appears when visitors first arrive) doesn't have a label that screen readers can announce. Screen reader users won't know what this dialog is for—they'll just hear "dialog" with no context. This is especially problematic for an age-restricted site, because the accessibility requirement to clearly label dialogs becomes a compliance requirement when the dialog is enforcing legal age verification.

**Why it matters for your business:** Screen reader users—including customers with visual disabilities—cannot understand the purpose of your age gate and may abandon the site before confirming they're of legal age, reducing traffic and potentially exposing you to liability if an inaccessible age gate fails to deter minors.

**Technical root cause:** The dialog element with id='baag3-gate' has role='dialog' and aria-modal='true' but is missing an aria-label, aria-labelledby, or title attribute. Without one of these, assistive technology cannot announce the dialog's purpose.

**Recommended fix — step by step**

1. Inspect the age-gate HTML (likely in your header or body template). Locate the div with id='baag3-gate' and role='dialog'.
2. Add aria-label='Age Verification' to that div element. Example: <div id="baag3-gate" class="baag3-overlay" role="dialog" aria-modal="true" aria-label="Age Verification">
3. If the dialog has a visible heading inside it (e.g., <h1>Are you 21+?</h1>), use aria-labelledby instead: add aria-labelledby='heading-id' to the div and id='heading-id' to the heading.
4. Test with a screen reader (NVDA on Windows or VoiceOver on Mac/iOS) to confirm the dialog name is announced when the page loads.
5. If you're using a third-party age-gate library (baag3 appears to be one), check its documentation for a configuration option to add aria-label or aria-labelledby, or contact the vendor for an accessible version.

### 2. A11y: Elements must meet minimum color contrast ratio thresholds (×11)

- **Severity:** P1   |   **Priority:** 🔴 DO FIRST
- **Effort:** Moderate (1-3 hours)
- **Business category:** compliance
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier9.a11y.color-contrast`

**What it means (plain English)**

Your website has 11 places where text color and background color don't have enough contrast—meaning some visitors, especially those with low vision or color blindness, can't read the text clearly. The audit found examples like tan text (#f7e5d3) on a muted olive background (#798441) and cream text on a burnt orange background. These fail the WCAG 2 AA standard, which requires a 4.5:1 contrast ratio for normal text.

**Why it matters for your business:** Poor contrast reduces accessibility for customers with vision impairments, increases bounce rate, and exposes you to potential ADA compliance claims—particularly serious for a retail site where age verification and product information must be readable by all visitors.

**Technical root cause:** The site uses a custom color palette (likely set in the Elementor page builder or theme CSS) that prioritizes visual aesthetics over accessibility requirements. Light tan/cream text on warm mid-tone backgrounds inherently fails contrast thresholds.

**Recommended fix — step by step**

1. Open the Elementor page builder (Dashboard → Pages → Edit with Elementor) and identify the heading and menu elements flagged in the audit.
2. For the h2 heading (.elementor-heading-title): change text color from #f7e5d3 to either #2d3436 (dark charcoal) or #1a1a1a (near-black) while keeping the background #798441.
3. For menu items (.elementor-item): change text color from #f7e5d3 to #ffffff (white) or #1a1a1a, ensuring the ratio against background #cb7651 reaches 4.5:1 or higher.
4. Use the WebAIM Contrast Checker (https://webaim.org/resources/contrastchecker/) to verify each color pair before publishing.
5. Run the entire site through axe DevTools (free browser extension) to catch any remaining contrast failures on other pages.
6. Document the new color palette in a style guide to prevent future contrast regressions during content updates.

### 3. A11y: Links must have discernible text (×3)

- **Severity:** P1   |   **Priority:** 🔴 DO FIRST
- **Effort:** Quick win (< 30 min)
- **Business category:** compliance
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier9.a11y.link-name`

**What it means (plain English)**

Your website has 3 links that screen reader users cannot identify. These are clickable elements with no visible text, no hidden label, and no title attribute — so a visually impaired visitor using a screen reader has no idea what those links do. This is a serious accessibility failure that blocks users and violates web accessibility law.

**Why it matters for your business:** Inaccessible links expose you to ADA compliance risk, lock out customers with disabilities, and harm SEO credibility — search engines penalize sites that fail basic accessibility standards.

**Technical root cause:** Links are likely styled with background images or icons only (no text content), and no aria-label, title, or alt text was added to compensate. Elementor's page builder sometimes creates these when you use icon-only buttons without proper labeling.

**Recommended fix — step by step**

1. Log into WordPress admin → Pages → Homepage (or whichever page contains these links) → Edit with Elementor
2. Find each affected link (search for the selector .elementor-element-9724463, .elementor-element-9dff949, .elementor-element-86ee027 in browser DevTools if needed, or visually locate empty/icon-only links)
3. Click each link element in Elementor → go to Advanced tab → scroll to Accessibility section
4. Add descriptive text in the 'Aria Label' field (e.g., 'Return to homepage', 'Visit Bud Authority partners page')
5. Alternatively, if the link has visible text that's just hidden by CSS, ensure that text is present in the HTML and not display:none
6. Click Update/Publish and re-test with axe DevTools or WAVE browser extension to confirm all 3 links now have discernible names
7. Document the fix in your compliance log (cannabis retailers should track accessibility remediation for potential audit trails)

---

### P2 — 43 findings

### 1. 20 image(s) missing alt text

- **Severity:** P2   |   **Priority:** 🔴 DO FIRST
- **Effort:** Moderate (1-3 hours)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier2.a11y.img-missing-alt`

**What it means (plain English)**

Every image on your homepage lacks alt text—a short description that screen readers announce to blind and low-vision visitors, and that search engines use to understand image content. You have 20 images and 20 are missing these descriptions. This blocks both accessibility (legal exposure) and image SEO (lost traffic).

**Why it matters for your business:** Inaccessible sites invite ADA lawsuits, alienate disabled customers, and lose image search traffic; for a wellness brand, these visitors often use assistive tech and represent loyal, high-intent audiences.

**Technical root cause:** Images are served without the HTML 'alt' attribute. This is typically a CMS configuration or theme setting where alt fields were not filled in during upload, or the template does not render the alt attribute.

**Recommended fix — step by step**

1. Audit which images are decorative (e.g., background patterns) vs. functional (product photos, logos): decorative images get alt="" (empty), functional ones get a 1-2 word description like alt="Indica flower strain in glass jar".
2. If using WordPress: install Yoast SEO or Rank Math (free versions included), go to Media Library, filter by 'missing alt text', and bulk-edit alt fields or use the plugin's inline editor for each image.
3. If using Shopify: navigate to Products, open each product, upload/edit images, and fill in the 'Alt text' field (visible in the image settings) with the product name or a brief description.
4. If using a custom site or unfamiliar CMS: use a free tool like WAVE (wave.webaim.org) or axe DevTools to re-scan and confirm each image now has a non-empty alt attribute in the HTML source.
5. Prioritize product and hero images first (highest impact on both SEO and user trust), then supporting lifestyle/educational images.
6. Add a process: before uploading any future image, draft the alt text in a shared doc or CMS field—do not leave it blank.

### 2. No JSON-LD schema

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/hello-world/
- **Rule:** `tier2.schema.none`

**What it means (plain English)**

Your website lacks JSON-LD structured data—a standardized format that tells search engines what your pages are about. This is like leaving your storefront unlabeled; Google has to guess. Without it, search results can't show rich details like your hours, reviews, product info, or location.

**Why it matters for your business:** Missing schema means lower click-through rates in search results, lost local visibility for "dispensaries near me" queries, and reduced trust signals that could push customers to competitors with better search listings.

**Technical root cause:** The page template does not include JSON-LD markup in the <head> or <body>. This is typically missing from the theme or page builder defaults and requires manual addition.

**Recommended fix — step by step**

1. Identify your CMS or page builder (check page source for Yoast, Rank Math, Elementor, or raw HTML)
2. If using WordPress: install Yoast SEO or Rank Math, enable 'Knowledge Graph' and 'Organization' schema in settings, and verify output in page source
3. If using page builder (Elementor, Webflow, etc.): check if schema addon is installed; if not, add it from the plugin/integrations marketplace
4. For custom/static sites: manually add Organization schema (name, address, phone, license) and LocalBusiness schema to the <head> of your template
5. Add Product schema for any catalog pages listing strains or items (name, price, availability, THC%)
6. Test with Google's Rich Results Test (search.google.com/test/rich-results) and fix any errors
7. Monitor Search Console > Enhancements to track schema coverage over time

### 3. 6 image(s) missing alt text

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/hello-world/
- **Rule:** `tier2.a11y.img-missing-alt`

**What it means (plain English)**

Your blog post on the homepage has 6 images, but none of them have alt text — a short description that appears if the image doesn't load and helps screen readers (software used by people with vision loss) understand what the image shows. Search engines also use alt text to index images, which can drive traffic via image search.

**Why it matters for your business:** Missing alt text reduces your visibility in Google Images, cuts off potential customers using accessibility tools, and may expose you to legal risk under accessibility standards that cannabis retailers should follow.

**Technical root cause:** Images were likely uploaded without alt text filled in. Most content management systems allow alt text to be left blank during upload, so it requires manual attention to complete.

**Recommended fix — step by step**

1. Open https://bettercannabis.com/hello-world/ in your browser and inspect each image visually to understand what it depicts
2. Log into your website admin panel (WordPress, Shopify, or similar) and find the media library or the blog post editor
3. For each of the 6 images, click Edit or Properties and locate the Alt Text field
4. Write a concise, descriptive alt text for each image (e.g., 'CBD tincture bottle on wooden shelf' rather than just 'image' or leaving it blank)
5. Save and republish the blog post
6. Test by running a free tool like WAVE (wave.webaim.org) or your browser's Inspector on the page to confirm alt text is now present

### 4. Missing meta description

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier2.meta.no-description`

**What it means (plain English)**

Your homepage doesn't have a meta description — the 150-160 character summary that appears below your page title in Google search results. Search engines will auto-generate one from your page content, but it's often incomplete or poorly worded, reducing click-through rates.

**Why it matters for your business:** Without a crafted meta description, searchers see a generic snippet instead of your key selling points (e.g., licensed products, compliance, local delivery), directly lowering clicks from search traffic and revenue.

**Technical root cause:** The HTML <head> section is missing a <meta name="description" content="..."> tag on the homepage.

**Recommended fix — step by step**

1. Open the homepage HTML source and locate the <head> section
2. Add this line after the <title> tag: <meta name="description" content="[Your text: 150–160 characters describing Better Cannabis, products, and key differentiator]">
3. Example: <meta name="description" content="Licensed cannabis dispensary offering premium flower, edibles, and wellness products. Lab-tested, compliant delivery & in-store shopping in [your city].">
4. If using a CMS (WordPress, Webflow, etc.), use the SEO plugin field (Yoast → Meta Description) to set it
5. Verify the description displays correctly in Google search results by searching your site name + wait 1–2 weeks for Google to re-crawl
6. Apply the same pattern to all other key pages (product pages, about, menu)

### 5. Missing meta description

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/story/
- **Rule:** `tier2.meta.no-description`

**What it means (plain English)**

Your /story/ page is missing a meta description — the 150-160 character summary that appears below your page title in Google search results. Without it, Google will auto-generate a snippet from your page content, which is often less compelling and may not highlight your key message.

**Why it matters for your business:** A weak or missing meta description reduces click-through rate from search results, meaning fewer potential customers visit your site even when you rank for relevant keywords.

**Technical root cause:** The HTML <head> section of this page lacks a <meta name="description" content="..."> tag. This is typically omitted during initial site build or when pages are added without following a template.

**Recommended fix — step by step**

1. Log into your site admin or code editor and open the /story/ page template or file.
2. Locate the <head> section and add: <meta name="description" content="[Your 150-160 character summary here]">
3. Write a description that includes a benefit or key differentiator (e.g., "Better Cannabis: Award-winning strains, expert staff, and lab-tested products for wellness seekers in [City].").
4. If using WordPress, install Yoast SEO plugin (free), go to the /story/ post, scroll to the Yoast box, and fill in the "Meta description" field.
5. Save and publish the page.
6. Use Google Search Console (search.google.com/search-console) to request indexing of the updated page.

### 6. No JSON-LD schema

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/story/
- **Rule:** `tier2.schema.none`

**What it means (plain English)**

Your website doesn't include structured data (JSON-LD)—machine-readable labels that tell search engines what content is on your pages. Without it, Google can't easily understand that you're a dispensary, what products you sell, your location, or your hours. This means search results may not display rich snippets (like ratings, hours, or address directly in Google).

**Why it matters for your business:** Missing schema reduces your visibility in local search results and Google Maps, making it harder for customers actively searching for cannabis dispensaries near them to find and choose your business.

**Technical root cause:** The page HTML does not contain any <script type="application/ld+json"> blocks that define the page's content type, business details, or product information according to schema.org standards.

**Recommended fix — step by step**

1. Install a schema markup plugin (e.g., Yoast SEO, RankMath, or Schema Pro if on WordPress; check your platform's app/plugin marketplace).
2. Configure the plugin to auto-generate LocalBusiness schema for your homepage with: business name, address, phone, hours of operation, license number.
3. Add Organization schema to your homepage header including: name, logo URL, contact email, social media profiles.
4. Add Product schema to any product listing or menu pages with: product name, description, THC/CBD info (if public-facing).
5. Test the resulting JSON-LD using Google's Rich Results Test (search.google.com/test/rich-results) and fix any validation errors.
6. Submit updated URLs to Google Search Console → URL Inspection to prompt re-crawl.

### 7. 7 image(s) missing alt text

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/story/
- **Rule:** `tier2.a11y.img-missing-alt`

**What it means (plain English)**

All 7 images on your story page lack alt text — alternative descriptions that screen readers use to describe images to visually impaired visitors, and that search engines use to understand image content. This is a accessibility barrier and a missed opportunity for search visibility.

**Why it matters for your business:** You're losing potential customers who use screen readers, and search engines can't index these images, which reduces organic traffic and hurts your ability to rank for product/lifestyle imagery searches.

**Technical root cause:** Images were added to the page without alt attributes (the HTML alt="" field). This is often a content management or template oversight.

**Recommended fix — step by step**

1. Open https://bettercannabis.com/story/ in your browser and identify each image visually (product photos, lifestyle, brand imagery, etc.)
2. If you use a CMS (WordPress, Shopify, etc.), log in, navigate to the Story page editor, and click each image to reveal its properties panel
3. For each image, fill in the alt field with a 5–12 word description: e.g., 'Woman holding CBD wellness product outdoors' or 'Cannabis flower close-up on wooden surface'
4. If editing raw HTML: add alt="[description]" to each <img> tag, e.g. <img src="product.jpg" alt="THC-free hemp oil bottle">
5. Save changes and refresh the page in your browser
6. Use a free tool like WAVE (wave.webaim.org) to re-scan the page and confirm all images now show alt text

### 8. Missing meta description

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/rewards/
- **Rule:** `tier2.meta.no-description`

**What it means (plain English)**

The Rewards page is missing a meta description — the 160-character summary that appears below your page title in Google search results. Without it, Google generates a random snippet from your page content, which often looks unprofessional and doesn't encourage clicks. This is a quick fix that applies to every important page.

**Why it matters for your business:** Missing meta descriptions reduce click-through rates from search results; potential customers see a generic preview instead of a compelling reason to visit your Rewards program.

**Technical root cause:** The page HTML lacks a `<meta name="description" content="...">` tag in the document head section.

**Recommended fix — step by step**

1. Log in to your site CMS or hosting control panel and locate the Rewards page editor.
2. Find the SEO, Meta, or Head section (exact name varies by platform; common locations: WordPress plugin like Yoast/Rank Math, Shopify theme settings, or custom HTML head)
3. Write a 150–160 character meta description for the Rewards page, such as: 'Join our loyalty rewards program and earn points on every cannabis purchase. Unlock exclusive discounts and member benefits at Better Cannabis.'
4. Paste this text into the 'Meta Description' field and save.
5. Repeat this process for all other pages identified in the audit as missing descriptions (check full audit list).
6. Wait 2–4 weeks for Google to crawl and display the new descriptions in search results.

### 9. 5 image(s) missing alt text

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/rewards/
- **Rule:** `tier2.a11y.img-missing-alt`

**What it means (plain English)**

Five images on your Rewards page have no alt text—that is, no written description that screen readers can announce to visually impaired visitors. This breaks accessibility for a meaningful portion of your audience and also signals to search engines that you haven't optimized these images for discovery.

**Why it matters for your business:** Visually impaired customers cannot understand your rewards program benefits, and search engines may rank your Rewards page lower for image-related queries, reducing organic traffic and conversion opportunities.

**Technical root cause:** Images were uploaded or embedded without the alt attribute (a short text field that describes image content) being filled in during creation or page build.

**Recommended fix — step by step**

1. Navigate to https://bettercannabis.com/rewards/ and identify each of the 5 images on the page.
2. For each image, write a concise, descriptive alt text (2–10 words) that explains what the image shows—for example, 'Tier 1 gold member badge with star icon' or 'Point redemption gift card example'.
3. Right-click (or inspect) the first image, then locate the <img> tag in the HTML; if using a CMS (WordPress, Shopify, etc.), open the image settings and paste your alt text into the 'Alt Text' field.
4. Repeat step 3 for all 5 images, save, and publish the page.
5. Open a screen reader (NVDA on Windows, or VoiceOver on Mac) and navigate the Rewards page to confirm each image is now announced with its alt text.
6. Run the page through an accessibility checker like WAVE (wave.webaim.org) or Axe DevTools to confirm all images now have alt text and no new issues appear.

### 10. Missing meta description

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/curbside/
- **Rule:** `tier2.meta.no-description`

**What it means (plain English)**

The curbside pickup page is missing a meta description — the short text that appears below your page title in Google search results. Without it, search engines may auto-generate a snippet from your page content, which often looks unprofessional or incomplete. This affects how potential customers perceive your business in search results.

**Why it matters for your business:** A missing meta description reduces click-through rates from search results; customers may choose a competitor's listing instead if yours looks incomplete or unclear.

**Technical root cause:** The HTML <head> section on this page does not contain a <meta name="description" content="..."> tag, or it is empty.

**Recommended fix — step by step**

1. Open https://bettercannabis.com/curbside/ in your browser and view the page source (Ctrl+U / Cmd+U).
2. Search for <meta name="description" to confirm it is missing or blank.
3. Craft a 155–160 character description that includes your service (e.g., 'Quick and safe curbside cannabis pickup at Better Cannabis. Order online, pick up in minutes.').
4. Access your site's CMS or HTML editor and add or replace the meta description tag in the <head> section of the curbside page.
5. Save and publish the page.
6. Wait 48–72 hours, then search for your curbside page on Google and verify the new description appears in results.

### 11. No JSON-LD schema

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/connect-2/
- **Rule:** `tier2.schema.none`

**What it means (plain English)**

Your website is missing JSON-LD structured data—code that tells search engines what your pages are about in a machine-readable format. Without it, Google has to guess whether a page is a product listing, a blog post, or a directory entry, which can result in lower visibility in search results and missed opportunities for rich snippets (those fancy boxes with ratings, prices, or availability that appear above regular listings).

**Why it matters for your business:** Cannabis retailers depend heavily on local search visibility; without structured data, your store location, hours, inventory, and compliance information may not display correctly in Google Search or Maps, reducing foot traffic and online orders.

**Technical root cause:** The page lacks JSON-LD markup in the <head> or <body>. Search engines rely on this standardized format to understand business type, local details, product info, and trust signals.

**Recommended fix — step by step**

1. Identify the page type: determine if /connect-2/ is a product page, location page, blog post, or service offering
2. Add LocalBusiness or MedicalBusiness schema to pages with store location, hours, phone, and license info—use schema.org/LocalBusiness or schema.org/MedicalBusiness as the template
3. Add Product schema if the page lists cannabis products, including name, description, price, and availability
4. For age-gated or compliance pages, consider adding FAQPage or HowTo schema to increase search visibility for common queries
5. Use Google's Structured Data Testing Tool (search.google.com/structured-data/testing-tool) to validate your markup before deployment
6. If using WordPress, install the Yoast SEO plugin (free version includes schema), go to Dashboard → Yoast SEO → XML Sitemaps → toggle on Local Business schema, and fill in business details under Settings → Business Info
7. If not using WordPress, manually add JSON-LD blocks to page templates or inject via your site builder's custom code section

### 12. 5 image(s) missing alt text

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/connect-2/
- **Rule:** `tier2.a11y.img-missing-alt`

**What it means (plain English)**

Every image on your website should have a short text description (called 'alt text') that explains what the image shows. Right now, 5 images on your Connect page have no description. Screen readers—software that reads websites aloud to people with vision loss—can't tell visitors what these images are. Search engines also can't understand unlabeled images, so they won't rank them or your page as well.

**Why it matters for your business:** Unlabeled images reduce organic search visibility for product/strain photos and educational content, and make your site inaccessible to visually impaired customers—a legal liability under the ADA and a market segment you're excluding.

**Technical root cause:** The images on /connect-2/ are missing the 'alt' HTML attribute. Without it, screen readers and search engine crawlers cannot interpret image content.

**Recommended fix — step by step**

1. Open https://bettercannabis.com/connect-2/ in your browser and identify the 5 images visually.
2. Right-click the first image → Inspect (or press F12 to open Developer Tools) → find the <img> tag in the HTML.
3. If you manage this site in WordPress: go to Media Library → find each image → click Edit → fill in the 'Alt Text' field with a short, descriptive phrase (e.g., 'cannabis strain close-up' or 'customer testimonial photo').
4. If you manage this via a page builder (Elementum, Gutenberg, Divi, etc.): click each image block → find the Alt Text input → enter a 5–10 word description of what the image shows.
5. If this is custom HTML/code: add alt='[description]' to each <img> tag (e.g., <img src='strain.jpg' alt='premium indoor-grown cannabis flower'>).
6. Repeat for all 5 images.
7. Save and publish.
8. Run the audit again (or use WebAIM's WAVE tool at wave.webaim.org) to confirm alt text is now present.

### 13. Missing meta description

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/connect/
- **Rule:** `tier2.meta.no-description`

**What it means (plain English)**

Your /connect/ page is missing a meta description — the 150-160 character summary that appears below your page title in Google search results. Without it, Google may auto-generate a snippet from your page content, which often looks incomplete or irrelevant to searchers. This reduces click-through rates even if your page ranks.

**Why it matters for your business:** Missing meta descriptions lower click-through rate from search results, meaning fewer potential customers visit your contact or connection page even when you rank well for relevant searches.

**Technical root cause:** The page HTML is missing a <meta name="description" content="..."> tag in the <head> section, or the tag exists but contains no content.

**Recommended fix — step by step**

1. Visit https://bettercannabis.com/connect/ in your browser and view the page source (Ctrl+U / Cmd+U).
2. Search for <meta name="description" to confirm it's missing or empty.
3. Write a unique 150-160 character description that includes your call-to-action and target keywords, e.g., 'Get in touch with Better Cannabis. Contact our team for product questions, license verification, or delivery inquiries.'
4. If you manage this site via WordPress, go to Posts/Pages → Edit the Connect page → scroll to the SEO plugin section (Yoast, RankMath, All in One SEO, etc.) and paste the description into the 'Meta Description' field.
5. If you manage this site via a static HTML CMS or builder (Webflow, Squarespace, etc.), access the page settings and look for 'Meta Description' or 'SEO' settings, then paste the same description.
6. If you don't have access to the CMS, share the description with your web host or developer and ask them to add it to the page <head>.
7. Save/publish the change.
8. Wait 24 hours, then search for your brand name + 'connect' on Google and verify the new description appears below your page title.

### 14. No JSON-LD schema

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/connect/
- **Rule:** `tier2.schema.none`

**What it means (plain English)**

Your website pages don't include JSON-LD structured data — a machine-readable format that tells search engines what content is on your page. For example, search engines can't automatically recognize your business name, address, hours, or product categories without this data. Adding it won't change what visitors see, but it helps Google and other search engines understand and display your information correctly in search results.

**Why it matters for your business:** Missing schema markup reduces your chances of appearing in local search results, knowledge panels, and rich snippets — all critical for driving foot traffic and online orders to a cannabis retailer.

**Technical root cause:** The page lacks a <script type="application/ld+json"> block in the HTML head or body. This structured data must be explicitly added; it doesn't generate automatically from page content.

**Recommended fix — step by step**

1. Identify your CMS platform (WordPress, Shopify, custom code, etc.) by inspecting the page source or checking the site footer for clues.
2. For WordPress: install the Yoast SEO or RankMath plugin, go to Settings → Yoast SEO → Search Appearance, and enable 'Organization' schema with your business name, phone, address, and hours.
3. For Shopify: install a free app like 'Smart SEO' or 'Boost SEO' from the Shopify App Store and configure LocalBusiness or Organization schema in the app settings.
4. For custom/unknown platform: manually add a LocalBusiness or Organization JSON-LD block to your site template. Use schema.org/LocalBusiness for a dispensary, including name, address, telephone, openingHoursSpecification, and sameAs (links to your social profiles).
5. Test the added schema using Google's Rich Results Test (search.google.com/test/rich-results) — paste your /connect/ URL and verify no errors appear.
6. Add Product schema if you display cannabis products on any page, including name, description, and availability.
7. Monitor Search Console's 'Enhancements' report after 1–2 weeks to confirm schema is being recognized.

### 15. 5 image(s) missing alt text

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/connect/
- **Rule:** `tier2.a11y.img-missing-alt`

**What it means (plain English)**

Five images on your Connect page have no alternative text descriptions. Alt text is read aloud by screen readers (tools used by blind and low-vision visitors) and also helps search engines understand what your images show. Without it, those visitors and search engines see nothing.

**Why it matters for your business:** You're excluding customers with visual disabilities from key pages, risking ADA compliance issues and losing SEO credit for product/brand imagery that could drive search traffic.

**Technical root cause:** Images were uploaded or inserted into the page without the alt attribute being populated in the HTML, likely during page creation or a CMS upload.

**Recommended fix — step by step**

1. Open https://bettercannabis.com/connect/ in your browser and identify each image visually
2. Right-click the first image → Inspect (or press F12) → locate the <img> tag and confirm it has no alt="..." attribute
3. If using a CMS (WordPress, Shopify, etc.), log in to the page editor, select each image, and fill in the 'Alt Text' or 'Alt Description' field with a short, descriptive phrase (e.g., 'CBD wellness tincture bottle' or 'Team member headshot')
4. If editing HTML directly, add alt="[description]" to each <img> tag (e.g., <img src="image.jpg" alt="CBD wellness tincture bottle">)
5. Re-save/publish the page
6. Run the page through WAVE (https://wave.webaim.org/) or axe DevTools (free browser extension) to confirm all 5 images now have alt text

### 16. Missing meta description

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/metform-form/blank-form/
- **Rule:** `tier2.meta.no-description`

**What it means (plain English)**

Your page at /metform-form/blank-form/ is missing a meta description — the 150-160 character summary that appears below your page title in Google search results. Without it, Google will auto-generate a snippet from your page content, which is often incomplete or irrelevant. This reduces click-through rates from search.

**Why it matters for your business:** Missing meta descriptions lower your organic search click-through rate, meaning fewer potential customers find you even when you rank well for relevant searches.

**Technical root cause:** The page either lacks an HTML <meta name="description" content="..."> tag in the head section, or it's empty. This is often caused by incomplete page templates or pages created without SEO metadata populated.

**Recommended fix — step by step**

1. Open the page source (right-click → View Page Source, or press Ctrl+U / Cmd+U) and search for '<meta name="description"' to confirm it's missing or empty
2. If you use WordPress, install Yoast SEO or Rank Math plugin; edit this page and fill in the 'Meta description' field with a 155-character summary (e.g., 'High-quality cannabis products for wellness. Shop lab-tested flower, edibles, and tinctures at Better Cannabis.')
3. If not WordPress, ask your developer to add <meta name="description" content="[your 155-char summary]"> to the <head> section of this page template
4. Audit other pages using your site audit tool (Screaming Frog, Semrush, or Ahrefs) to find additional pages missing descriptions
5. Prioritize high-traffic pages (home, product category, about) and top-performing blog posts first

### 17. No JSON-LD schema

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/metform-form/blank-form/
- **Rule:** `tier2.schema.none`

**What it means (plain English)**

Your website is missing JSON-LD structured data — machine-readable code that tells search engines what your pages contain. Google uses this to understand your business type, products, reviews, and location. Without it, search engines have to guess your content's meaning, which reduces your visibility in local search results and knowledge panels.

**Why it matters for your business:** Missing schema data means you're invisible to local search features (Google Maps, local 3-pack listings) where cannabis customers actively search for nearby dispensaries, hours, and menu availability.

**Technical root cause:** The page lacks <script type="application/ld+json"> blocks in the HTML head or body. This is typically a CMS configuration or theme limitation — the page template is not generating or including structured data markup.

**Recommended fix — step by step**

1. Install and activate Yoast SEO or Rank Math plugin (both have built-in schema generators for small business/local business profiles).
2. Go to plugin settings → Schema/Structured Data → enable LocalBusiness schema and fill in: business name, address, phone, hours, license number (if public-facing).
3. Add Organization schema: go to plugin dashboard → look for 'Company Info' or 'Knowledge Graph' section → enter legal business name, logo URL, contact details.
4. Test schema output: visit Google's Rich Results Test (search.google.com/test/rich-results) → paste affected URL → verify LocalBusiness and Organization blocks appear.
5. If using a page builder (Elementor, Divi, etc.), check if it has native schema options — go to page settings → scroll to 'Schema' or 'Structured Data' tab and enable LocalBusiness.
6. Add schema for cannabis products (if product pages exist): install Schema plugin for WooCommerce or Shopify, or manually add Product + Review schema to menu/product pages.
7. Retest after 48 hours for compliance: use Google Search Console → Coverage report to confirm schema is indexing.

### 18. Missing meta description

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/category/blog/
- **Rule:** `tier2.meta.no-description`

**What it means (plain English)**

Your blog category page is missing a meta description—the short text (150–160 characters) that appears below your page title in Google search results. Without it, search engines may auto-generate a snippet that doesn't highlight your most compelling content, which reduces click-through rates from potential customers.

**Why it matters for your business:** A missing meta description on your blog archive lowers your visibility in organic search and reduces the likelihood that searchers click through to your content, directly impacting traffic to your wellness and product information.

**Technical root cause:** The meta description HTML tag is absent from the page head. This is typically a content management system configuration oversight where the blog category template was not set up to populate or require this field.

**Recommended fix — step by step**

1. Log in to your site admin and navigate to the blog or category settings
2. Find the blog category page (https://bettercannabis.com/category/blog/) in your page/post editor
3. Locate the 'Meta Description' or 'SEO Description' field (usually in a sidebar or beneath the title)
4. Write a 150–160 character description that includes a relevant keyword (e.g., 'Discover wellness insights, cannabis education, and industry updates from Better Cannabis. Read expert tips and product guides.')
5. Save or publish the page
6. Use Google Search Console (google.com/webmasters → your property → Pages) to verify the description now appears in search results within 1–2 weeks

### 19. Missing canonical

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/category/blog/
- **Rule:** `tier2.meta.no-canonical`

**What it means (plain English)**

This page doesn't tell search engines which version of the URL is the official one. If the same content is accessible via multiple URLs (like /category/blog/ and /blog/ and /blog/?sort=date), Google may get confused about which to rank, splitting your search visibility across versions instead of concentrating it on one.

**Why it matters for your business:** Lost search traffic and rankings because Google doesn't know which URL deserves credit for your blog content, making it harder for customers to find your wellness articles and products via search.

**Technical root cause:** The <link rel="canonical" href="..."> tag is missing from the page's <head> section. Search engines use this tag to consolidate ranking signals when duplicate or near-duplicate content exists.

**Recommended fix — step by step**

1. Audit your site structure to identify if /category/blog/ is the primary blog URL or if another version (e.g., /blog/) should be preferred.
2. Add <link rel="canonical" href="https://bettercannabis.com/category/blog/"> to the <head> of this page (or the preferred URL if different).
3. If using a CMS (WordPress, Shopify, etc.), enable automatic canonical tags in SEO settings or install a plugin like Yoast SEO or All in One SEO, then configure the primary blog URL.
4. Check Google Search Console (Google → Search Console → your site → Pages) to see if Google is already consolidating this URL with others; if so, verify the canonical is now respected in the next crawl.
5. Apply the same canonical tag to all other category/archive pages to prevent future duplicate-content issues.

### 20. 5 image(s) missing alt text

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/author/admin-better/
- **Rule:** `tier2.a11y.img-missing-alt`

**What it means (plain English)**

Five images on your author page have no alternative text descriptions. Alt text is read aloud by screen readers for visitors with vision impairments, and it also helps search engines understand what your images show. Without it, you're excluding customers and losing a small SEO signal.

**Why it matters for your business:** Customers using assistive technology cannot access your content, and Google has less context to index and rank your pages—both reduce potential customer reach.

**Technical root cause:** Images were added to the page without alt attributes in the HTML. This often happens when content is uploaded via CMS without filling in the alt field, or when images are hardcoded in templates.

**Recommended fix — step by step**

1. Open https://bettercannabis.com/author/admin-better/ in your browser and right-click Inspect to identify the 5 images (look for <img> tags with no alt= attribute or alt="")
2. If you use WordPress: Log in → Media Library → filter by 'Unattached' or search author pages → edit each image and fill the Alt Text field with a short, descriptive phrase (e.g., 'Better Cannabis team member portrait')
3. If you edit HTML directly: Add alt="[description]" to each <img> tag (e.g., <img src="photo.jpg" alt="Better Cannabis wellness consultant">)
4. For all images, write alt text that describes what a sighted person sees—avoid 'image of' or 'picture of' (screen readers already announce 'image')
5. Test using WAVE (wave.webaim.org)—paste your URL and verify the alt text errors on that page are gone

### 21. No H1 on homepage

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier4.h1.missing`

**What it means (plain English)**

Your homepage doesn't have an H1 tag — the main heading that tells search engines and screen readers what the page is about. Search engines rely on this tag to understand your page's topic, and visitors using screen readers depend on it for navigation. Without it, you're missing a clear signal about your primary message.

**Why it matters for your business:** Missing H1 reduces homepage SEO visibility for branded and product-related searches, and makes your site harder for assistive technology users to navigate — both hurt customer acquisition and accessibility compliance.

**Technical root cause:** The page either has no H1 tag, or the visible main heading is marked up with a different tag (like a div, span, or image-only logo) instead of semantic HTML.

**Recommended fix — step by step**

1. Inspect your homepage HTML: open https://bettercannabis.com/ in a browser, press F12, use Ctrl+F to search for '<h1' in the code.
2. If no H1 exists, identify the primary page heading (e.g., 'Better Cannabis — Premium Wellness Products' or your brand tagline).
3. Wrap that heading text in an <h1> tag in your page template or CMS editor.
4. Ensure the H1 appears once on the page and is visible to both users and search engines (not hidden with CSS display:none or color:white).
5. Test using a tool like Wave (wave.webaim.org) or axe DevTools browser extension to confirm exactly one H1 is now detected.
6. If you use WordPress, verify via Yoast SEO or Rank Math plugins that the H1 status shows green.

### 22. Missing core schema types: Organization, LocalBusiness, WebSite

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier4.schema.missing-core`

**What it means (plain English)**

Your site doesn't declare structured data (machine-readable information) that tells Google who you are, where you operate, and what your site does. Search engines use this to build a rich knowledge panel, validate your business legitimacy, and improve local search visibility — especially important for cannabis retailers, where trust signals matter.

**Why it matters for your business:** Without Organization and LocalBusiness schema, Google has less confidence in your business identity and location; this reduces your chances of appearing in local search results when customers search 'cannabis dispensary near me' or your city name.

**Technical root cause:** The site's homepage is missing JSON-LD (a structured data format) blocks that declare Organization, LocalBusiness, and WebSite entities in the <head> or <body>.

**Recommended fix — step by step**

1. Open the homepage HTML source (right-click → View Page Source) and locate the <head> section.
2. Add a JSON-LD script block for Organization: include name, URL, logo, contact phone, email, and social profiles.
3. Add a LocalBusiness JSON-LD block with: name, address (street, city, state, ZIP), phone, hours of operation, service areas, and license number if publicly displayable.
4. Add a WebSite JSON-LD block with: name, URL, and a search action template (helps Google index your site search if you have one).
5. Use Google's Structured Data Testing Tool (https://search.google.com/test/rich-results) to validate all three blocks return zero errors.
6. Submit the updated homepage to Google Search Console → Pages → request indexing to refresh Google's cached version.

### 23. Cookie missing Secure flag

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** security
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier5.cookie.no-secure`

**What it means (plain English)**

Your site is setting a cookie (nfd-enable-cf-opt) without the Secure flag, which means it can be transmitted over unencrypted HTTP connections. Even though your site uses HTTPS, if a user is ever redirected to HTTP or uses an older browser, that cookie could be intercepted. This is a security gap, especially for a cannabis retailer handling customer data.

**Why it matters for your business:** An attacker could steal visitor session cookies, potentially accessing customer accounts, purchase history, or compliance records—creating liability and customer trust damage.

**Technical root cause:** The Set-Cookie header on your server is missing the 'Secure' directive. This is typically controlled at the application or CDN/firewall level (possibly Cloudflare, given the cookie name).

**Recommended fix — step by step**

1. Log in to your Cloudflare dashboard (if you use Cloudflare) and navigate to Rules → Cookie Settings, or check if there's a Managed Transform for cookies.
2. If using Cloudflare, enable 'Secure' flag via Workers or Page Rules to force all cookies to include Secure.
3. If you manage this via your web server (Apache/Nginx), add 'Secure' to the Set-Cookie header in your server config or application code.
4. Contact your hosting provider or development team to confirm the exact location of this cookie generation and ask them to add the Secure flag to the Set-Cookie response header.
5. After deployment, re-test using browser DevTools (F12 → Application/Storage → Cookies) to verify the Secure flag appears in the cookie properties.
6. Re-run the security scan to confirm the flag is now present.

### 24. No DMARC policy published

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** security
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier5.fortress.dmarc-missing`

**What it means (plain English)**

Your domain has SPF (a partial email authentication tool) configured, but is missing DMARC—a security standard that tells email providers how to handle messages that fail authentication checks. Without DMARC, bad actors can more easily send fraudulent emails appearing to come from @bettercannabis.com, damaging your reputation and potentially tricking customers.

**Why it matters for your business:** Spoofed emails from your domain can erode customer trust, land your legitimate marketing emails in spam folders, and create compliance risk if phishing emails impersonate your dispensary to collect customer data.

**Technical root cause:** DMARC is a DNS record that must be explicitly published; SPF alone is insufficient. No _dmarc.bettercannabis.com TXT record currently exists in your DNS zone.

**Recommended fix — step by step**

1. Log into your domain registrar (GoDaddy, Namecheap, Route 53, etc.) and navigate to DNS / DNS Records.
2. Create a new TXT record with hostname '_dmarc' (or '_dmarc.bettercannabis.com' depending on UI) and value 'v=DMARC1; p=none; rua=mailto:dmarc-reports@bettercannabis.com; ruf=mailto:dmarc-forensics@bettercannabis.com'.
3. Allow 24–48 hours for DNS propagation, then verify the record with `nslookup -type=TXT _dmarc.bettercannabis.com` or an online DMARC checker.
4. Monitor DMARC aggregate reports (rua address) weekly for 2–4 weeks to confirm SPF/DKIM alignment and identify any failed authentication sources.
5. Once aligned, update the policy from p=none to p=quarantine, then p=reject after confirming no legitimate email is blocked.

### 25. 10 tap targets under 44px at mobile-320

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier6.a11y.small-targets`

**What it means (plain English)**

Your website has 10 interactive elements (buttons, links, form fields) that are smaller than 44×44 pixels when viewed on a mobile phone. This makes them hard to tap accurately, especially for people with motor disabilities or larger fingers. Users will frequently mis-tap and trigger the wrong action.

**Why it matters for your business:** Mobile visitors — particularly older adults researching cannabis products — will experience frustration, abandonment, and potential compliance risk if accessibility violations are detected by regulators or accessibility auditors.

**Technical root cause:** CSS sizing or HTML button/link dimensions are set below the 44×44 pixel WCAG 2.5.5 minimum. Common culprits: navigation icons, small form inputs, or social media links.

**Recommended fix — step by step**

1. Inspect the mobile view at 320px width in Chrome DevTools (F12 → Toggle device toolbar → iPhone SE or 320px width) and identify which 10 elements are too small.
2. For each small element, open DevTools Inspector, select the element, and check its computed width/height in the Styles panel. Note which are below 44×44.
3. Increase padding or width/height of those elements to at least 44×44px in your CSS. If an icon is 24px, wrap it in a 44×44 container or add padding.
4. For touch targets that must remain visually small (e.g., close buttons), use CSS `min-width: 44px; min-height: 44px;` and increase padding rather than icon size.
5. Test the fix by re-measuring in DevTools and running a WCAG checker (e.g., axe DevTools extension) to confirm all targets now pass.
6. If targets are in a form (age-gate, product filters), prioritize those first — compliance depends on users being able to interact.

### 26. 9 tap targets under 44px at mobile-375

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier6.a11y.small-targets`

**What it means (plain English)**

Your site has 9 clickable buttons, links, or other interactive elements that are smaller than 44×44 pixels when viewed on a mobile phone. These small targets are hard to tap accurately, especially for people with motor control challenges or anyone using a phone one-handed. This is a Web Content Accessibility Guideline (WCAG) requirement that also improves usability for all visitors.

**Why it matters for your business:** Smaller tap targets increase accidental mis-clicks, abandoned checkouts, and frustrated customers — particularly important for a cannabis retail site where age verification and product selection must be smooth and trustworthy.

**Technical root cause:** Interactive elements (buttons, links, navigation items, form inputs) have been styled with padding, font size, or spacing that falls below the 44×44 pixel minimum. This often happens when designers optimize for desktop and don't scale up touch targets for mobile.

**Recommended fix — step by step**

1. Open browser DevTools (F12 on Windows/Linux, Cmd+Option+I on Mac) and set viewport to mobile-375; use the element inspector to identify each undersized target and note its pixel dimensions.
2. Increase padding inside buttons from current value to at least 12px on all sides, or increase height/width of the element itself to minimum 44×44px.
3. For navigation links in menus or headers, add vertical padding (at least 16–20px) and horizontal padding (at least 12–16px) so the entire clickable area is 44×44 minimum.
4. For form inputs (text fields, checkboxes, radio buttons), ensure the input itself is 44×44px or add a larger label area that wraps the input and accepts clicks.
5. Test on an actual mobile device or use DevTools device emulation to confirm each element is easy to tap; use a ruler or measure tool if needed.
6. If your site uses a CSS framework (Bootstrap, Tailwind, etc.), check documentation for spacing/sizing utilities and apply classes that enforce 44px minimums.
7. Run an accessibility checker (e.g., axe DevTools, WAVE) after changes to confirm the issue is resolved.

### 27. 9 tap targets under 44px at mobile-414

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier6.a11y.small-targets`

**What it means (plain English)**

Your website has 9 interactive buttons, links, or form fields that are smaller than 44×44 pixels when viewed on mobile phones. This makes them hard to tap accurately—especially for people with motor control difficulties, vision impairment, or simply using a phone with one hand. Mobile visitors may tap the wrong element, get frustrated, and leave.

**Why it matters for your business:** Mobile users (likely 40–60% of your traffic) will experience higher bounce rates and cart abandonment if they cannot reliably tap menu items, product filters, 'Add to Cart' buttons, or age-gate confirmations.

**Technical root cause:** CSS sizing rules or inherited framework defaults have set padding, height, or width values below 44px for clickable elements. This is common when designers optimize for desktop aesthetics without considering mobile touch targets.

**Recommended fix — step by step**

1. Open browser DevTools (F12), switch to mobile view (Ctrl+Shift+M), and use the element inspector to identify which 9 targets are undersized—note their class names or IDs.
2. For each undersized target, check the CSS file (usually in /css/ or <style> tag) and increase padding and/or min-height/min-width to at least 44×44 pixels.
3. If the site uses a framework (Bootstrap, Tailwind, etc.), add a custom CSS rule targeting those elements—e.g., `button, a, input { min-height: 44px; min-width: 44px; padding: 12px 16px; }` to ensure consistent minimum sizing.
4. Test each tappable element on a real mobile device or Chrome DevTools device emulation to confirm the 44×44 rule is met.
5. Pay special attention to the age-gate confirmation button and license/compliance link—ensure those are also 44×44 minimum.
6. Run an accessibility audit tool (e.g., axe DevTools browser extension, free) and re-test mobile-414 to confirm the count drops to zero.

### 28. Lighthouse perf (mobile): 62/100

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** revenue
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lighthouse.perf-mobile`

**What it means (plain English)**

Your mobile site takes about 8 seconds for the largest visual element (like a hero image or product photo) to appear on screen. For a cannabis retail site where customers are comparing products or checking inventory on their phones, this delay causes them to leave before the page fully loads. A score of 62 is significantly below the healthy target of 85.

**Why it matters for your business:** Mobile visitors (typically 50–70% of dispensary traffic) abandon slow sites within 3 seconds; a 8-second LCP directly reduces product views, age-gate completion, and online orders.

**Technical root cause:** Largest Contentful Paint (LCP) delay is typically caused by unoptimized images, render-blocking JavaScript, or slow server response times. Without access to the Lighthouse HTML report, the most common culprits are oversized hero images, unminified CSS/JS, or third-party scripts (analytics, ads, chat widgets) firing before page content.

**Recommended fix — step by step**

1. Download and open the Lighthouse HTML report at /Users/markwallace/BKH/apex-sentinel/runs/2026-04-19T06-18-18-831Z/lighthouse/better-cannabis/lighthouse-mobile.html and scroll to 'Opportunities' — prioritize the top 3 by estimated savings (e.g., 'Eliminate render-blocking resources' or 'Properly size images').
2. If images are the culprit: use a CDN (Cloudflare, Fastly) or image optimization service (TinyPNG, Imgix) to serve WebP format and resize images to mobile viewport width — aim for hero images under 100 KB.
3. Defer non-critical JavaScript: move Google Analytics, chat widgets, and ad pixels to load after page content using the 'defer' or 'async' attribute in <script> tags.
4. Enable browser caching: ask your hosting provider to set Cache-Control: max-age=31536000 for static assets (CSS, JS, fonts) so repeat visitors load faster.
5. Compress server response: enable gzip compression on your server (most hosts offer this in control panel under 'Performance' or 'Compression').
6. Test again on mobile in Chrome DevTools (Ctrl+Shift+I → Lighthouse) after each change to confirm LCP drops below 2.5 seconds.

### 29. A11y: All page content should be contained by landmarks (×11)

- **Severity:** P2   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier9.a11y.region`

**What it means (plain English)**

Your homepage has 11 sections of content that aren't wrapped in semantic landmark regions—these are HTML elements like <main>, <nav>, <aside>, or <section> that tell screen readers and assistive technologies where different parts of the page are. Right now, a visitor using a screen reader has to read through all the content linearly without being able to jump to specific sections (menu, product list, footer, etc.).

**Why it matters for your business:** Customers with visual impairments using assistive technology cannot navigate your site efficiently, which reduces accessibility, increases bounce rate, and may expose you to ADA compliance risk.

**Technical root cause:** Your site (built with Elementor on WordPress) is outputting generic <div> containers instead of semantic HTML5 landmarks. The page structure lacks proper <main>, <nav>, <header>, <footer>, and <section> tags.

**Recommended fix — step by step**

1. Log into WordPress admin → Elementor → edit the homepage → check the structure: each major section (header, navigation, product menu, footer) should be assigned a role or wrapped in a landmark element.
2. In Elementor, select the top-level container for your main content → Advanced → HTML Tag → change from 'div' to 'main'.
3. Wrap your navigation menu in Elementor: select nav container → Advanced → HTML Tag → change to 'nav'.
4. Wrap your footer in Elementor: select footer container → Advanced → HTML Tag → change to 'footer'.
5. Use Elementor's container settings to assign 'role="region"' or 'role="contentinfo"' to secondary sections if they don't have a semantic match.
6. Install and activate the free plugin 'WP Accessibility' (wp-accessibility.org) → Settings → enable 'Skip Links' to ensure the skip-to-content link works.
7. After changes, run a re-test with axe DevTools (free browser extension) on the homepage to confirm all content is now contained by landmarks.

### 30. Missing meta description

- **Severity:** P2   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/hello-world/
- **Rule:** `tier2.meta.no-description`

**What it means (plain English)**

Your blog post at /hello-world/ is missing a meta description — the 150–160 character summary that appears below your page title in Google search results. Without it, Google will auto-generate a snippet from your page content, which often looks choppy or irrelevant. This is a common issue on WordPress blogs where draft or test posts are published without SEO setup.

**Why it matters for your business:** Missing meta descriptions reduce click-through rates from search results because potential customers see a poor preview of your page instead of a compelling, brand-aligned summary.

**Technical root cause:** The page was likely published without filling in the meta description field in your WordPress SEO plugin (if using Yoast, Rankmath, or All in One SEO), or the plugin is not installed. This post appears to be a default WordPress test post ('hello-world') that was never properly optimized.

**Recommended fix — step by step**

1. Log into your WordPress admin dashboard and navigate to Posts → All Posts.
2. Click 'Edit' on the /hello-world/ post (or delete it if it's a test post no longer needed).
3. If you're using Yoast SEO, scroll to the Yoast SEO meta box below the editor and fill in the 'Meta description' field with 2–3 sentences describing the post content (150–160 characters).
4. If you're using Rankmath, click the Rankmath icon in the editor sidebar, find 'Meta', and fill in the description field.
5. If no SEO plugin is active, install Yoast SEO (free version) from Plugins → Add New, activate it, and repeat steps 2–3.
6. Click 'Update' to save changes.
7. After fixing this post, audit other blog posts and landing pages for missing meta descriptions using the same method.

### 31. No JSON-LD schema

- **Severity:** P2   |   **Priority:** 🟡 MEDIUM
- **Effort:** Moderate (1-3 hours)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/rewards/
- **Rule:** `tier2.schema.none`

**What it means (plain English)**

Your rewards page doesn't include JSON-LD structured data — a machine-readable format that tells search engines what type of content they're looking at. Without it, Google can't reliably understand that this is a rewards program page, which means it won't appear in specialized search results and voice assistants won't recognize the program details.

**Why it matters for your business:** Missing schema reduces visibility in Google's rewards/loyalty program rich results, lowering organic traffic to your rewards signup and limiting customer discovery of your loyalty benefits.

**Technical root cause:** The page HTML lacks `<script type="application/ld+json">` blocks with LocalBusiness or Organization schema markup that describe the rewards program structure, eligibility, and benefits.

**Recommended fix — step by step**

1. Audit the rewards page source code (View Page Source) to confirm no JSON-LD blocks exist in the <head> or <body>
2. Add a JSON-LD block in the <head> using schema.org/LoyaltyProgram or schema.org/Organization with membershipBenefits property — include program name, description, benefits array, and eligibility rules
3. Include LocalBusiness schema if the rewards tie to in-store redemption; add address, phone, and cannabisLicense (if compliant with your state regulations)
4. Test the markup using Google's Rich Results Test (search.google.com/test/rich-results) to confirm no errors
5. Monitor Search Console → Enhancements tab after 2–4 weeks for 'Structured Data' or 'Rich Results' impressions
6. If using a CMS (WordPress, Shopify, custom), use Yoast SEO or Schema Pro plugin to generate and maintain the markup automatically

### 32. No JSON-LD schema

- **Severity:** P2   |   **Priority:** 🟡 MEDIUM
- **Effort:** Moderate (1-3 hours)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/curbside/
- **Rule:** `tier2.schema.none`

**What it means (plain English)**

Your curbside pickup page doesn't include structured data — a machine-readable format that tells search engines what your page is about. Without it, Google can't easily understand that you offer curbside service, your address, hours, or phone number, which means you miss out on rich search results (like review stars or service badges) that appear above standard listings.

**Why it matters for your business:** Missing schema reduces your visibility in local search results and Google Maps, directly impacting customers searching for 'cannabis curbside near me' or similar queries — a high-intent audience you're currently losing to competitors with schema markup.

**Technical root cause:** The page lacks JSON-LD blocks in the <head> or <body> that define structured data using schema.org vocabulary (LocalBusiness, BreadcrumbList, etc.). Search engines must guess your business details from plain text instead of explicit markup.

**Recommended fix — step by step**

1. Install Yoast SEO or All in One SEO Pack (WordPress) or equivalent for your platform, which auto-generates LocalBusiness and Service schema
2. If not using an SEO plugin, manually add a JSON-LD LocalBusiness block to the <head> of the curbside page, including name, address, telephone, hours, and serviceArea
3. Include an 'areaServed' property listing cities/regions where you deliver or offer curbside pickup
4. Add a Service schema block describing 'Curbside Pickup' with a brief description, price (if applicable), and availability
5. Test the markup using Google's Rich Results Test (search.google.com/test/rich-results) to ensure no errors
6. Submit the curbside page URL to Google Search Console → Coverage to re-crawl and index the updated markup

### 33. No JSON-LD schema

- **Severity:** P2   |   **Priority:** 🟡 MEDIUM
- **Effort:** Moderate (1-3 hours)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/category/blog/
- **Rule:** `tier2.schema.none`

**What it means (plain English)**

Your blog category page lacks JSON-LD structured data—a standardized format that tells search engines what your content is about. Without it, Google can't easily understand that this is a blog section, which limits your ability to appear in specialized search results (like 'cannabis wellness blogs') and may reduce click-through rates from search.

**Why it matters for your business:** Missing schema data reduces your visibility in Google's rich snippet results and educational content carousels, making it harder for customers searching for cannabis wellness information to find and click through to your blog.

**Technical root cause:** The page HTML contains no <script type="application/ld+json"> blocks. Search engines use this markup to extract metadata about content type, author, publish date, and topic—none of which are present on this page.

**Recommended fix — step by step**

1. Add a CollectionPage schema block to your blog category template: insert <script type="application/ld+json"> with "@type": "CollectionPage", "name": "Blog", "description": "Cannabis wellness articles and guides", "url": "https://bettercannabis.com/category/blog/" before </head>
2. For each individual blog post, add BlogPosting schema with "headline", "datePublished", "author", "articleBody" (or summary), and "image"
3. Validate your schema using Google's Rich Results Test (search.google.com/test/rich-results) to confirm no errors
4. If using WordPress, install Yoast SEO or Rank Math, enable schema output under Settings → SEO → Schema, and configure blog post type as 'Article'
5. If custom HTML/PHP, use schema.org templates (schema.org/BlogPosting) as reference and test with JSON-LD validator before deploying

### 34. Missing meta description

- **Severity:** P2   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/author/admin-better/
- **Rule:** `tier2.meta.no-description`

**What it means (plain English)**

This author archive page is missing a meta description — a 155-character summary that appears below your page title in Google search results. Without it, Google may auto-generate a snippet from your page content, which often looks unprofessional and doesn't include your key message.

**Why it matters for your business:** Incomplete search result listings reduce click-through rates from potential customers searching for cannabis products or information, directly impacting store traffic and sales.

**Technical root cause:** The author archive template (automatically generated by your CMS for admin user pages) lacks a meta description tag in the HTML head section. Author archive pages are typically not manually created, so this fell through during site setup.

**Recommended fix — step by step**

1. If using WordPress: Install Yoast SEO or Rank Math plugin (free version sufficient)
2. Navigate to SEO > Titles & Metas > Archives in the plugin dashboard
3. Locate 'Author Archives' and enable the toggle to show in search results
4. In the template field, enter a description like 'Learn about cannabis products and wellness tips from [Your Business Name]. Visit our store for high-quality selections.'
5. Set the snippet preview to confirm it displays 155–160 characters
6. If platform unknown, add this to your author archive template HTML: <meta name="description" content="Learn about cannabis products and wellness tips from Better Cannabis.">
7. Run Google Search Console > URL Inspection on this URL to request a re-crawl

### 35. Missing canonical

- **Severity:** P2   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/author/admin-better/
- **Rule:** `tier2.meta.no-canonical`

**What it means (plain English)**

This page doesn't tell search engines which version is the 'official' one. When multiple URLs show the same or similar content, search engines can get confused about which to rank and may split your visibility across them. A canonical tag is a single line of HTML that points search engines to the preferred version.

**Why it matters for your business:** Without canonicals on author pages, you risk losing search traffic if Google indexes duplicate or near-duplicate content, and it dilutes the authority you've earned for your main pages.

**Technical root cause:** The author archive page (/author/admin-better/) is generated dynamically but lacks a canonical link element pointing back to the primary content source or confirming it as the authoritative version.

**Recommended fix — step by step**

1. Check if your CMS (WordPress, Shopify, etc.) has an SEO plugin active; if yes, open its settings and confirm 'Canonical URLs' is enabled site-wide.
2. If using WordPress, install or activate Yoast SEO or Rank Math, then go to Settings → General and toggle 'Use canonical URLs' ON.
3. For author archive pages specifically, consider whether they should exist; if not needed for user navigation, go to Dashboard → Settings → Reading and check 'Discourage search engines from indexing this site' for those specific pages, or set robots meta to noindex.
4. If canonicals must be manual, edit your theme's header.php (or equivalent template) and add <link rel="canonical" href="https://bettercannabis.com/"> or point to your homepage as the canonical source.
5. Test the fix using Google Search Console: paste the affected URL, click 'Inspect', and verify the canonical is shown correctly in the 'Coverage' tab.

### 36. No JSON-LD schema

- **Severity:** P2   |   **Priority:** 🟡 MEDIUM
- **Effort:** Moderate (1-3 hours)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/author/admin-better/
- **Rule:** `tier2.schema.none`

**What it means (plain English)**

Your site is missing JSON-LD structured data—a machine-readable format that tells Google what your pages are about (e.g., product info, business details, reviews). Without it, search engines have to guess your content type and may not display rich snippets (like star ratings or pricing) in search results.

**Why it matters for your business:** Missing schema reduces your visibility in search results and prevents Google from showing product prices, availability, or review ratings—leading to lower click-through rates and lost traffic to product pages.

**Technical root cause:** The author archive page lacks any JSON-LD blocks in the HTML head or body. This is common when schema markup is not systematically added to page templates or when an SEO plugin is not configured to auto-generate schema.

**Recommended fix — step by step**

1. Audit your site structure: identify which page types need schema (product pages, dispensary location, author/staff bios, reviews). Author pages typically don't require schema unless they showcase staff credentials.
2. If you're using WordPress, install Yoast SEO or Rank Math plugin; go to Settings → Schema → enable automatic schema for posts, products, and organization.
3. If hand-coding: add Organization schema to your homepage footer or header (name, address, phone, license number) and LocalBusiness schema to location pages.
4. For cannabis-specific compliance: include your license number and regulatory disclaimers in schema where appropriate (consult your compliance team).
5. Test all schema using Google's Rich Results Test (search.google.com/test/rich-results); fix any errors.
6. Prioritize schema on product/menu pages and your main dispensary location page first; author pages are lower priority.

### 37. A11y: The skip-link target should exist and be focusable

- **Severity:** P2   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier9.a11y.skip-link`

**What it means (plain English)**

Your site has a skip link (a keyboard shortcut for screen readers and keyboard users to jump to main content), but the target element it points to—an element with id="content"—either doesn't exist or isn't properly set up to receive focus. Screen reader users and keyboard-only visitors can't actually jump anywhere, defeating the purpose of the skip link.

**Why it matters for your business:** Keyboard and screen reader users (including employees with accessibility needs, and potential customers) have a poor navigation experience, which reduces inclusivity and may expose you to accessibility complaints.

**Technical root cause:** The skip link in your HTML points to #content via href="#content", but either no element has id="content" on the page, or that element lacks tabindex="-1" to make it programmatically focusable when the link is clicked.

**Recommended fix — step by step**

1. Open your site's HTML source or WordPress editor and locate the element where your main content begins (usually a <main> tag or a <div> with a content wrapper).
2. Add id="content" to that element if it doesn't already have one.
3. Add tabindex="-1" to the same element so it becomes focusable when the skip link is activated (this doesn't make it keyboard-focusable in normal flow, only when programmatically focused).
4. Test: Use your keyboard to press Tab repeatedly until you see the skip link become visible (it's usually hidden by default), press Enter, and verify focus moves to the main content area.
5. If using WordPress, check your theme's header.php or functions.php to confirm the skip link and target are both present; if missing, add them or switch to a theme with built-in accessibility support.

### 38. No JSON-LD schema

- **Severity:** P2
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier2.schema.none`

**Detail**

Page has no JSON-LD structured data blocks.

### 39. 14 image(s) missing alt text

- **Severity:** P2
- **Page URL:** https://bettercannabis.com/curbside/
- **Rule:** `tier2.a11y.img-missing-alt`

**Detail**

Images without alt fail a11y + hurt SEO.

### 40. Missing meta description

- **Severity:** P2
- **Page URL:** https://bettercannabis.com/connect-2/
- **Rule:** `tier2.meta.no-description`

**Detail**

Page has no meta description.

### 41. 5 image(s) missing alt text

- **Severity:** P2
- **Page URL:** https://bettercannabis.com/category/blog/
- **Rule:** `tier2.a11y.img-missing-alt`

**Detail**

Images without alt fail a11y + hurt SEO.

### 42. Missing security header: content-security-policy

- **Severity:** P2
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier5.header.content-security-policy`

**Detail**

content-security-policy not present on homepage response. Affects fortress score and CSP posture.

### 43. 6 tap targets under 44px at tablet-768

- **Severity:** P2
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier6.a11y.small-targets`

**Detail**

Interactive elements smaller than 44x44 fail WCAG 2.5.5 target size.

---

### P3 — 42 findings

### 1. Title length 15 chars

- **Severity:** P3   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier2.meta.title-length`

**What it means (plain English)**

Your homepage title — the text that appears in browser tabs and search results — is only 15 characters long. Search engines and users expect titles between 20 and 65 characters. A longer, descriptive title helps both Google and potential customers understand what your site offers at a glance.

**Why it matters for your business:** A vague title reduces click-through rates from search results and misses an opportunity to include location, product type, or differentiators that drive qualified traffic to your dispensary.

**Technical root cause:** The page's <title> tag contains only the brand name without descriptive keywords or location. Search engines use this to rank and display your site; thin titles are underutilized SEO real estate.

**Recommended fix — step by step**

1. Open your site's HTML editor or CMS and locate the <title> tag in the <head> section of your homepage
2. Replace 'Better Cannabis' with a 50–60 character title such as 'Better Cannabis | Premium Cannabis Dispensary in [City]' or 'Better Cannabis – Quality Cannabis Products & Expert Service'
3. Ensure your new title includes your location (if applicable) and one key differentiator (premium, delivery, lab-tested, etc.)
4. Save and publish the change
5. Wait 1–2 weeks, then check Google Search Console (google.com/search-console) to confirm the new title appears in search results

### 2. Cookie missing SameSite flag

- **Severity:** P3   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** security
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier5.cookie.no-samesite`

**What it means (plain English)**

Your website is setting cookies without a SameSite flag, which tells browsers how to handle those cookies when users visit from external links or emails. Without this flag, browsers may block the cookies entirely in future versions, breaking login sessions, shopping carts, and tracking functionality.

**Why it matters for your business:** Customers may experience sudden logouts, lost cart contents, or inability to complete purchases if their browser restricts cookies—especially as Chrome and other browsers tighten defaults.

**Technical root cause:** Cookie headers are being set via HTTP responses (or JavaScript document.cookie calls) without the SameSite attribute. Modern browser security standards now require this flag to prevent cross-site request forgery attacks.

**Recommended fix — step by step**

1. Use your browser's Developer Tools (F12 → Application → Cookies) to identify which cookies are missing SameSite; note the domain and cookie name for each.
2. If cookies are set server-side (PHP, Node, etc.), add SameSite=Lax to each Set-Cookie header: e.g., Set-Cookie: session_id=abc123; SameSite=Lax; Secure; HttpOnly
3. If you use a third-party service (Shopify, WordPress plugin, analytics vendor), contact their support to confirm SameSite is enabled or ask for an update.
4. If you manage the site via WordPress, install a plugin like 'Secure HTTP Headers' or 'Wordfence' and enable SameSite cookie settings in its admin panel.
5. Test in Chrome DevTools by opening DevTools → Issues tab and check for 'cookies without SameSite' warnings.
6. Deploy changes to staging first, verify login and cart work, then push to production.

### 3. SSL Labs grade: unknown

- **Severity:** P3   |   **Priority:** 🟠 HIGH
- **Effort:** Vendor escalation (host/registrar/etc.)
- **Business category:** security
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier5.fortress.ssl-grade`

**What it means (plain English)**

Your SSL certificate configuration returned an error when we tried to test it with Qualys SSL Labs, a trusted third-party security auditor. This usually means the server isn't responding correctly to security scans, or there's a misconfiguration in how your HTTPS is set up. While visitors can likely still browse your site, search engines and security tools can't properly verify your certificate strength.

**Why it matters for your business:** Search engines may deprioritize your site in rankings if they can't confirm your security setup, and customers may see browser warnings if the certificate configuration fails during their visit—both directly harm trust and sales for a regulated industry like cannabis retail.

**Technical root cause:** The SSL certificate or server configuration is rejecting or mis-responding to SSL Labs' security test requests (HTTP 400 error), likely due to firewall rules blocking automated scanning, outdated TLS versions, or misconfigured certificate chain settings.

**Recommended fix — step by step**

1. Contact your hosting provider's support and ask them to run an SSL Labs test from their admin panel—confirm TLS 1.2 and 1.3 are both enabled and that the certificate chain includes all intermediate certificates.
2. If you have server admin access, verify that your firewall or WAF (Web Application Firewall) is not blocking Qualys SSL Labs IP ranges; whitelist 64.41.200.0/24 and 64.41.201.0/24 temporarily and re-test.
3. Visit https://www.ssllabs.com/ssltest/ yourself and enter bettercannabis.com; note any specific error message (e.g., 'cannot resolve', 'connection refused', 'protocol error') and share it with your hosting provider.
4. Once the test succeeds, aim for grade A or A+ by enabling HSTS (HTTP Strict-Transport-Security header) and submitting your domain to the HSTS preload list via https://hstspreload.org/.
5. After implementation, re-test monthly using SSL Labs to catch any certificate expiration or configuration drift.

### 4. No CAA DNS records

- **Severity:** P3   |   **Priority:** 🟠 HIGH
- **Effort:** Quick win (< 30 min)
- **Business category:** security
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier5.fortress.caa-missing`

**What it means (plain English)**

Your domain doesn't have CAA (Certification Authority Authorization) records set up. These are DNS rules that tell the internet which companies are allowed to issue SSL certificates (the padlock security badges) for your domain. Without them, a bad actor could potentially trick a certificate authority into issuing a fake certificate for your site, which could be used to impersonate you or intercept customer data.

**Why it matters for your business:** A compromised SSL certificate could allow attackers to intercept customer payments, login credentials, or age-verification data — exposing you to fraud, data breaches, and regulatory penalties in the cannabis industry where compliance and customer trust are critical.

**Technical root cause:** CAA DNS records are optional but recommended security controls. Your DNS zone currently has no CAA entries, so any certificate authority can issue certificates for bettercannabis.com without restriction.

**Recommended fix — step by step**

1. Log into your domain registrar (GoDaddy, Namecheap, Route 53, etc.) and find the DNS management section.
2. Add a CAA record with the format: Flag=0, Tag=issue, Value=letsencrypt.org (or your current CA, e.g., digicert.com).
3. Add a second CAA record with Flag=0, Tag=issuewild, Value=letsencrypt.org to restrict wildcard certificate issuance.
4. Optionally add a third CAA record with Flag=0, Tag=iodef, Value=mailto:security@bettercannabis.com to receive breach notifications.
5. Wait 15 minutes for DNS to propagate, then verify using a CAA lookup tool (e.g., whatsmycaarecord.com).
6. Document the CAA records in your security policy for compliance audits.

### 5. No DKIM selectors found (standard selectors)

- **Severity:** P3   |   **Priority:** 🟠 HIGH
- **Effort:** Moderate (1-3 hours)
- **Business category:** compliance
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier5.fortress.dkim-missing`

**What it means (plain English)**

DKIM (DomainKeys Identified Mail) is a security standard that signs your outgoing emails with a cryptographic key, proving they really come from your domain. Your domain has SPF enabled but DKIM is not configured. Without it, your marketing emails, account confirmations, and order notifications are more likely to land in spam folders or be rejected entirely.

**Why it matters for your business:** Missing DKIM reduces email deliverability for transactional messages (order confirmations, shipping updates) and marketing campaigns, directly harming customer trust and repeat purchase rates.

**Technical root cause:** DKIM requires DNS TXT records with selector keys (typically 'google', 'default', 'selector1', etc.) to be published on your domain. None of these standard selectors are present, indicating DKIM has never been configured.

**Recommended fix — step by step**

1. Log into your email service provider (Gmail Workspace, Mailchimp, SendGrid, or your hosting provider's email admin panel) and locate the DKIM setup instructions.
2. Generate DKIM DNS records — the provider will give you a selector name (e.g., 'selector1') and a public key value.
3. Access your domain registrar's DNS management (GoDaddy, Namecheap, your hosting control panel, etc.) and add the DKIM TXT record exactly as provided.
4. Return to your email provider and verify the DKIM record was published (usually a 'Verify' or 'Check DNS' button).
5. Once verified, send a test email and check it arrives in the inbox, not spam.
6. Update your DMARC record (currently missing) to p=quarantine and include dkim=pass to enforce DKIM + SPF alignment.

### 6. robots.txt does not reference sitemap

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/robots.txt
- **Rule:** `tier2.robots.no-sitemap`

**What it means (plain English)**

Your robots.txt file (a set of instructions you give to search engines about which pages they can crawl) doesn't tell Google where your XML sitemap is located. A sitemap is like a map of your entire website that helps search engines find and index all your pages more efficiently. Without this connection, search engines may miss some of your product pages or content.

**Why it matters for your business:** Search engines may index your site more slowly or incompletely, reducing organic traffic to your product pages, educational content, and compliance information that drive customer discovery.

**Technical root cause:** The robots.txt file is missing a 'Sitemap:' directive that points to your XML sitemap URL. This directive is a simple text line that tells crawlers where to find the complete list of your site's pages.

**Recommended fix — step by step**

1. Navigate to https://bettercannabis.com/robots.txt in your browser and download or view the current content
2. Add the line 'Sitemap: https://bettercannabis.com/sitemap.xml' to the end of the file (adjust the URL if your sitemap is at a different path)
3. Save and upload the updated robots.txt file back to your server root
4. Verify the change by visiting https://bettercannabis.com/robots.txt in your browser and confirming the Sitemap line appears
5. Submit your sitemap directly to Google Search Console (search.google.com) → Sitemaps → paste your sitemap URL and click Submit

### 7. Missing OpenGraph metadata

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/hello-world/
- **Rule:** `tier2.meta.no-og`

**What it means (plain English)**

When your pages are shared on social media (Facebook, Instagram, LinkedIn), those platforms look for special HTML tags called OpenGraph metadata to decide what title and image to display in the preview card. Without these tags, social platforms fall back to generic or broken-looking previews, which damages how your brand appears when customers share your content.

**Why it matters for your business:** Poor social media previews reduce click-through rates when customers or influencers share your content, and a fragmented brand appearance on social feeds undermines trust and professionalism—especially critical in the cannabis industry where brand legitimacy matters.

**Technical root cause:** The page at /hello-world/ lacks og:title and og:image meta tags in the <head> section of the HTML. This is typically a content management oversight where pages are published without populating OpenGraph fields, or the CMS theme does not auto-generate these tags from page title and featured image.

**Recommended fix — step by step**

1. If using WordPress: install Yoast SEO or Rank Math plugin, navigate to the /hello-world/ post editor, scroll to 'Social' section in Yoast, fill in 'Social title' and upload a 'Social image' (minimum 1200×630px), save.
2. If using Shopify: edit the page, scroll to 'Search engine listing preview', enable 'Edit website SEO', populate 'Page title' and 'Meta description', upload 'Featured image' in the page settings above, save.
3. If using custom/static HTML: add these two lines to the <head> on /hello-world/: <meta property="og:title" content="Your Page Title Here"> and <meta property="og:image" content="https://bettercannabis.com/path-to-1200x630-image.jpg">
4. Audit all other product pages and blog posts for the same missing tags using a bulk SEO crawler (Screaming Frog free tier) to identify scope.
5. Create an internal checklist: before publishing any new page, verify og:title and og:image are filled in before hitting 'Publish'.

### 8. Missing OpenGraph metadata

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier2.meta.no-og`

**What it means (plain English)**

OpenGraph tags are snippets of code that tell social media platforms (Facebook, Instagram, LinkedIn) how to display your website when someone shares a link. Without them, the platform shows a generic preview, which looks unprofessional and discourages clicks.

**Why it matters for your business:** When customers share your dispensary's homepage on social media, a broken preview (no image, vague title) reduces click-through rates and damages brand perception during word-of-mouth marketing.

**Technical root cause:** The <head> section of your homepage is missing og:title and og:image meta tags. Social platforms cannot find visual information to display in the preview card.

**Recommended fix — step by step**

1. Open your homepage HTML in a text editor or your site's backend editor
2. Locate the <head> section (top of the page code, before <body>)
3. Add these four lines before the closing </head> tag: <meta property="og:title" content="Better Cannabis - [Your Tagline]"> and <meta property="og:image" content="[URL to a 1200×630px image of your storefront or logo]"> and <meta property="og:description" content="[2-3 sentence description of your dispensary]"> and <meta property="og:url" content="https://bettercannabis.com/">
4. Use a 1200×630px PNG or JPG image that clearly represents your brand (storefront photo, logo, or product-lifestyle image)
5. Test the result using Facebook's Sharing Debugger (facebook.com/sharing/debugger) — paste your URL and verify the preview card displays correctly
6. If you use WordPress, install Yoast SEO or All in One SEO and fill in the Social tab for the homepage post/page to auto-generate tags
7. If you use Shopify, go to Settings → Publish → Homepage → Social Preview and upload an image

### 9. Missing OpenGraph metadata

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/story/
- **Rule:** `tier2.meta.no-og`

**What it means (plain English)**

When your pages are shared on social media (Facebook, Instagram, LinkedIn), the platform looks for Open Graph tags — metadata code that tells social networks what title, image, and description to display. Without them, shares look unprofessional or show broken/generic previews, which reduces click-through rates from social traffic.

**Why it matters for your business:** Missing social preview metadata decreases engagement when customers share your content or when you promote pages on social platforms, directly reducing referral traffic and brand visibility.

**Technical root cause:** The page HTML is missing `<meta property="og:title">` and `<meta property="og:image">` tags in the `<head>` section. Social platforms fall back to generic or incorrect previews when these are absent.

**Recommended fix — step by step**

1. Inspect the page source: visit https://bettercannabis.com/story/ in your browser, press Ctrl+U (or Cmd+U on Mac), and search for 'og:title' — confirm it's missing
2. If using WordPress: install Yoast SEO plugin → go to Settings → Social → Facebook → enable and fill in 'Social title' and upload 'Social image' for this page type
3. If using Shopify: go to Sales Channels → Facebook & Instagram → Settings → Catalog → set up product/page image and title fields
4. If using a custom site/static HTML: add these two lines to the `<head>` of story.html: `<meta property="og:title" content="Your Story Title Here">` and `<meta property="og:image" content="https://bettercannabis.com/path-to-image.jpg">` (use a 1200×630px image)
5. Test the fix using Facebook's Sharing Debugger: go to facebook.com/sharing/debugger, paste https://bettercannabis.com/story/, and verify the preview shows your custom title and image

### 10. Missing OpenGraph metadata

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** revenue
- **Page URL:** https://bettercannabis.com/rewards/
- **Rule:** `tier2.meta.no-og`

**What it means (plain English)**

Your Rewards page is missing OpenGraph tags — small HTML snippets that control how the page looks when shared on Facebook, Instagram, LinkedIn, and other social platforms. Without them, when customers share your rewards program link, it won't display a custom title or image; instead, it will show generic or broken preview.

**Why it matters for your business:** Poor social sharing appearance reduces click-through rates on shared links, weakening word-of-mouth amplification for your loyalty program and losing potential customer acquisition from social media.

**Technical root cause:** The page's HTML head section lacks og:title and og:image meta tags, which social platforms use to generate preview cards.

**Recommended fix — step by step**

1. Inspect the Rewards page HTML source (right-click → View Page Source) and search for 'og:title' and 'og:image' in the <head> section.
2. If missing, add these lines in the page <head>: <meta property="og:title" content="Better Cannabis Rewards Program"> and <meta property="og:image" content="[URL to 1200x630px image]">.
3. Choose a clear, branded image (1200×630 pixels) that represents the rewards program or your dispensary.
4. If using WordPress, install Yoast SEO or All in One SEO, go to the Rewards page editor, expand the Social preview section, and add the title and image there.
5. Test the fix using Facebook's Sharing Debugger (facebook.com/developers/tools/debug/sharing) — paste the Rewards URL and verify the preview displays correctly.
6. Apply the same og:title and og:image tags to other key pages (product pages, about, contact) for consistent social sharing.

### 11. Missing OpenGraph metadata

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/curbside/
- **Rule:** `tier2.meta.no-og`

**What it means (plain English)**

OpenGraph metadata are HTML tags that tell social media platforms (Facebook, Instagram, LinkedIn) how to display your page when someone shares it. Without them, the platform shows a generic preview—often no image, and sometimes a confusing or truncated title. For a dispensary, this means a customer sharing your curbside ordering page might post a broken-looking preview that doesn't entice others to click.

**Why it matters for your business:** Poor social share previews reduce click-through rates when customers share your pages on social media, directly lowering referral traffic and word-of-mouth digital discovery.

**Technical root cause:** The page HTML is missing og:title and og:image meta tags in the <head> section. These tags are not automatically generated from the page title and image—they must be explicitly added.

**Recommended fix — step by step**

1. Open https://bettercannabis.com/curbside/ in a browser, right-click → View Page Source, and search for '<meta property="og:' to confirm og:title and og:image tags are absent.
2. Add the following meta tags to the <head> section of the curbside page: <meta property="og:title" content="Curbside Pickup – Better Cannabis"> and <meta property="og:image" content="[URL to a high-quality 1200x630px image of your dispensary or curbside service]">.
3. If you use WordPress, install the Yoast SEO plugin (free version), activate it, go to Settings → Titles & Metas, enable OpenGraph, then edit the curbside post and manually set the Preview image in the Yoast metabox.
4. If on a custom CMS or static HTML, use a meta tag generator like opengraphchecker.com to validate your og: tags match your intent, then test the share preview at facebook.com/sharer.
5. Apply the same og:title and og:image pattern to all other important pages (product pages, contact, about, age gate).

### 12. Missing OpenGraph metadata

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/connect-2/
- **Rule:** `tier2.meta.no-og`

**What it means (plain English)**

When someone shares your page on Facebook, Instagram, or other social networks, those platforms look for OpenGraph tags (special metadata) to decide what title and image to display in the preview. Without them, social platforms show generic or broken previews, making your page look unprofessional and less clickable.

**Why it matters for your business:** Poor social preview appearance reduces click-through rates from social media referrals, particularly damaging for a wellness brand where visual presentation and trust are critical to conversion.

**Technical root cause:** The page at /connect-2/ lacks og:title and og:image meta tags in the HTML head section, which social networks require to generate rich previews when the URL is shared.

**Recommended fix — step by step**

1. Open the HTML source of https://bettercannabis.com/connect-2/ and locate the <head> section
2. Add <meta property="og:title" content="[Page Title Here]"> with a clear, benefit-driven title (e.g., 'Connect With Better Cannabis – Wellness Consultations')
3. Add <meta property="og:image" content="https://bettercannabis.com/path/to/image.jpg"> pointing to a 1200×630px image that represents the page (use your logo, a product photo, or a branded graphic)
4. Add <meta property="og:url" content="https://bettercannabis.com/connect-2/"> to specify the canonical URL
5. Add <meta property="og:description" content="..."> with a 2–3 sentence summary of the page content
6. If using WordPress, install Yoast SEO or All in One SEO, enable social previews, and configure og:title and og:image in the plugin settings for this page
7. Test the preview by pasting the URL into Facebook's Sharing Debugger (facebook.com/developers/tools/debug/sharing) and Twitter's Card Validator (cards-dev.twitter.com/validator)

### 13. Missing OpenGraph metadata

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** ux
- **Page URL:** https://bettercannabis.com/connect/
- **Rule:** `tier2.meta.no-og`

**What it means (plain English)**

OpenGraph metadata (og:title, og:image, og:description) are HTML tags that tell social media platforms like Facebook, Instagram, and LinkedIn how to display your page when someone shares a link. Without them, your posts appear generic or broken, which reduces click-through rates when customers share your content.

**Why it matters for your business:** When patients or customers share your connect/contact page on social media, it will display poorly or with no image, reducing trust and engagement — especially critical for a cannabis wellness brand where social proof matters.

**Technical root cause:** The /connect/ page is missing og:title and og:image meta tags in the HTML <head> section. If your site uses a template system, this page may not have inherited or been assigned these tags during creation.

**Recommended fix — step by step**

1. Audit your /connect/ page HTML by right-clicking → View Page Source and searching for '<meta property="og:' — confirm og:title, og:image, og:description, and og:url are absent.
2. If you use a CMS (WordPress, Shopify, etc.), install an SEO plugin (Yoast SEO for WordPress; Shopify has built-in meta fields) and add og:title and og:image to the /connect/ page settings.
3. If editing raw HTML: add these four lines to the <head>: <meta property="og:title" content="Connect with Better Cannabis"> <meta property="og:image" content="https://bettercannabis.com/[path-to-high-res-logo-or-hero-image].jpg"> <meta property="og:description" content="[Brief description of your contact/connect process]"> <meta property="og:url" content="https://bettercannabis.com/connect/">
4. Use Facebook's Sharing Debugger (facebook.com/sharing/debugger) to paste the /connect/ URL and verify og: tags render correctly before publishing.
5. Repeat for any other pages with low social-sharing potential (product pages, about page, blog posts).

### 14. Missing OpenGraph metadata

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Moderate (1-3 hours)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/metform-form/blank-form/
- **Rule:** `tier2.meta.no-og`

**What it means (plain English)**

When someone shares a link to your site on social media (Facebook, LinkedIn, etc.), the platform uses special metadata tags called OpenGraph to pull in a preview image and title. Without these tags, your link appears as plain text with no visual appeal, which hurts click-through rates when customers share product pages or promotions.

**Why it matters for your business:** Poor social sharing appearance reduces organic traffic from word-of-mouth and customer referrals, especially important for a wellness cannabis brand where trust-based recommendations drive visits.

**Technical root cause:** The page (and likely others) lacks og:title and og:image meta tags in the HTML head section. These tags must be explicitly added; they don't auto-generate from page title or images.

**Recommended fix — step by step**

1. Audit all public-facing pages (especially product, landing, and form pages) to identify which ones lack og:title and og:image tags using a free tool like https://www.opengraphcheck.com/ or Facebook's Sharing Debugger (facebook.com/sharing/debugger/).
2. Add og:title (max 65 characters, should match or summarize page purpose), og:image (1200×630px JPG/PNG minimum, under 5MB), and og:description (max 160 characters) to the <head> section of every public page.
3. For the blank form page specifically, add: <meta property="og:title" content="Better Cannabis Wellness Forms"> and <meta property="og:image" content="[your-domain]/images/og-form-preview.jpg">.
4. Test each updated page in Facebook's Sharing Debugger (facebook.com/sharing/debugger/) to confirm preview renders correctly before publishing.
5. If your site uses a CMS (WordPress, Shopify, etc.), install an SEO plugin (Yoast, Rank Math) that auto-generates OG tags — this prevents future missing tags across new pages.

### 15. Missing Twitter card

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/metform-form/blank-form/
- **Rule:** `tier2.meta.no-twitter-card`

**What it means (plain English)**

Your pages are missing Twitter Card meta tags, which tell social platforms how to display your content when someone shares a link. Without these tags, your posts appear plain and unformatted on Twitter/X, LinkedIn, and other platforms, reducing click-through rates from social shares.

**Why it matters for your business:** Missing Twitter Cards reduce social traffic and engagement — fewer people click through from social platforms to your dispensary site, directly impacting customer acquisition from word-of-mouth and community sharing.

**Technical root cause:** The page lacks `<meta name="twitter:card">`, `<meta name="twitter:title">`, `<meta name="twitter:description">`, and `<meta name="twitter:image">` tags in the HTML head section. These are optional but recommended for social media optimization.

**Recommended fix — step by step**

1. Open your page source (Ctrl+U or Cmd+U) and locate the <head> section.
2. Add these four meta tags before the closing </head>: <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:title" content="[Your Page Title]"> <meta name="twitter:description" content="[Your Page Description]"> <meta name="twitter:image" content="[URL to a 1200x630px image]">
3. Use the same image URL as your Open Graph image tag (og:image) for consistency.
4. Test the result at https://cards-dev.twitter.com/ — paste your URL and verify the preview looks correct.
5. If using a CMS (WordPress, Shopify, etc.), install Yoast SEO or All in One SEO plugin and configure Social Media settings to auto-generate Twitter Cards site-wide.

### 16. Missing OpenGraph metadata

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/category/blog/
- **Rule:** `tier2.meta.no-og`

**What it means (plain English)**

When your blog category page is shared on social media (Facebook, Instagram, LinkedIn), there's no image or title preview shown — just a blank or generic link. This happens because the page is missing OpenGraph tags, which are special HTML instructions that tell social platforms how to display your content.

**Why it matters for your business:** Blog traffic and engagement suffer when shares look unprofessional or invisible on social media; customers are less likely to click through from Facebook or Instagram if they can't see what they're sharing.

**Technical root cause:** The page's HTML <head> section does not include og:title and og:image meta tags that social platforms use to generate preview cards when the URL is shared.

**Recommended fix — step by step**

1. Open the page source (right-click → View Page Source) and locate the <head> section.
2. Add this line before the closing </head> tag: <meta property="og:title" content="Better Cannabis Blog" />
3. Add this line: <meta property="og:image" content="https://bettercannabis.com/path/to/blog-preview-image.jpg" /> (use an existing 1200×630px image from your site or upload one).
4. Add this line: <meta property="og:url" content="https://bettercannabis.com/category/blog/" />
5. If using WordPress, install the free Yoast SEO plugin → Settings → Social → Facebook and set a default OG image and title template for category pages.
6. Test the fix by pasting the URL into Facebook's Sharing Debugger (facebook.com/developers/tools/debug/sharing/) to confirm the preview now appears.

### 17. Missing OpenGraph metadata

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/author/admin-better/
- **Rule:** `tier2.meta.no-og`

**What it means (plain English)**

When people share your pages on social media (Facebook, LinkedIn, etc.), those platforms look for special code tags called OpenGraph metadata to decide what title, image, and description to display. Your author page is missing these tags, so it will show a generic preview instead of a branded, professional one.

**Why it matters for your business:** Poor social sharing appearance reduces click-through rates when staff or customers share content, damaging brand perception and reducing referral traffic to your site.

**Technical root cause:** The author archive page template does not include og:title and og:image meta tags in the HTML head section, so social platforms cannot extract rich preview data.

**Recommended fix — step by step**

1. Log into your site backend and navigate to the author page template (usually in wp-admin → Appearance → Theme File Editor, or your CMS's template editor)
2. Add og:title meta tag: <meta property="og:title" content="Better Cannabis - Author Archive" />
3. Add og:image meta tag: <meta property="og:image" content="[URL to your 1200×630px branded logo or staff image]" />
4. Add og:description meta tag: <meta property="og:description" content="[Your dispensary tagline or description]" />
5. If using WordPress, install Yoast SEO or All in One SEO; both allow you to set OpenGraph defaults site-wide and per-page in the plugin settings
6. Test the fix using Facebook's Sharing Debugger (facebook.com/sharing/debugger) — paste the author page URL and verify the preview displays correctly

### 18. DNSSEC not enabled

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Quick win (< 30 min)
- **Business category:** security
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier5.fortress.dnssec-missing`

**What it means (plain English)**

DNSSEC is a security protocol that cryptographically verifies DNS records (the address book that tells browsers where your website lives). Without it, attackers could theoretically intercept or redirect traffic to a fake site. For a cannabis retailer, this is a supply-chain risk: customers could unknowingly land on a phishing clone.

**Why it matters for your business:** A DNS hijack could expose customer data, steal payment information, or damage trust with regulators who expect baseline security controls.

**Technical root cause:** DNSSEC signing is disabled at the DNS registrar level. The DNS response lacks the DNSSEC AD (Authenticated Data) flag, meaning no cryptographic verification is in place.

**Recommended fix — step by step**

1. Log into your domain registrar (GoDaddy, Namecheap, Network Solutions, etc.) with admin credentials.
2. Navigate to DNS settings or DNSSEC management for bettercannabis.com.
3. Enable DNSSEC signing and confirm the DS (delegation signer) records are propagated to the parent zone.
4. Test DNSSEC validation using online tools like DNSViz.net or your registrar's built-in checker.
5. Document the DNSSEC status in your compliance audit file (relevant for cannabis regulatory reviews).

### 19. Lighthouse a11y (mobile): 86/100

- **Severity:** P3   |   **Priority:** 🟡 MEDIUM
- **Effort:** Moderate (1-3 hours)
- **Business category:** accessibility
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lighthouse.a11y-mobile`

**What it means (plain English)**

Your mobile site scores 86 out of 100 on accessibility (the ability for people with disabilities to use your site). Your target is 95. Common issues include missing text descriptions on images, insufficient color contrast, or form fields without proper labels. Since you're a wellness dispensary, accessibility is both a legal consideration and a business one—you're excluding customers who rely on screen readers or have low vision.

**Why it matters for your business:** Poor mobile accessibility reduces your addressable market, exposes you to potential ADA complaints, and signals to Google that your site is lower-quality, which can hurt search rankings for local cannabis queries.

**Technical root cause:** The Lighthouse audit detected one or more accessibility violations on the mobile version of your homepage, likely including alt text gaps, color contrast failures, missing ARIA labels, or keyboard navigation issues.

**Recommended fix — step by step**

1. Download the full Lighthouse HTML report from the file path provided (/Users/markwallace/BKH/apex-sentinel/runs/2026-04-19T06-18-18-831Z/lighthouse/better-cannabis/lighthouse-mobile.html) and open it in a browser to see exactly which elements failed and why.
2. Prioritize the failures listed under 'Accessibility' section—focus on 'Image elements do not have [alt] attributes' and 'Background and foreground colors do not have a sufficient contrast ratio' first, as these are the most common blockers.
3. For images: add descriptive alt text to every image (e.g., alt='Cannabis product package: Indica strain' instead of alt='product'). If using a CMS, edit each image's media properties.
4. For color contrast: use a tool like WebAIM Contrast Checker (https://webaim.org/resources/contrastchecker/) to test your text color against background; aim for at least 4.5:1 ratio for body text.
5. Ensure all form fields (age gate, product filters, contact fields) have visible labels associated with them; if using HTML, pair <label for='fieldID'> with <input id='fieldID'>.
6. Test keyboard navigation: use Tab and arrow keys to move through the page without a mouse. All interactive elements (buttons, links, age gate) must be reachable.
7. Re-run Lighthouse mobile audit after fixes to confirm score reaches ≥95.

### 20. Missing Twitter card

- **Severity:** P3   |   **Priority:** ⚪ LOW
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/hello-world/
- **Rule:** `tier2.meta.no-twitter-card`

**What it means (plain English)**

Your pages don't include Twitter card metadata—special code that tells Twitter (now X) how to display your content when someone shares a link. Without it, X shows a generic preview instead of your custom image, headline, and description, which reduces click-through rates on social shares.

**Why it matters for your business:** Missing Twitter cards lower engagement and click traffic from X/Twitter shares, which is a secondary but measurable referral source for dispensary content and promotions.

**Technical root cause:** The `<meta name="twitter:card" content="summary_large_image">` tag and related Open Graph/Twitter-specific meta tags are not present in the page head. This is a minor SEO signal, not a blocker.

**Recommended fix — step by step**

1. Add the following meta tags to your page template's <head> section: `<meta name="twitter:card" content="summary_large_image">`, `<meta name="twitter:site" content="@YourTwitterHandle">`, `<meta name="twitter:title" content="Page Title">`, `<meta name="twitter:description" content="Brief description">`, and `<meta name="twitter:image" content="https://yoursite.com/image-url.jpg">`.
2. If using WordPress, install the free 'Yoast SEO' plugin, go to SEO → Social, and fill in Twitter username and enable the Twitter card toggle under 'Twitter' settings.
3. If using Shopify, navigate to Online Store → Preferences → Social media and paste your Twitter/X handle and default share image URL.
4. Test the result using Twitter's Card Validator at https://cards-dev.twitter.com/validator—paste your page URL and confirm the preview displays your image and title.
5. Apply the same meta tags to all key pages (product pages, blog posts, promotions) using your site's global template or meta tag management system.

### 21. Missing Twitter card

- **Severity:** P3   |   **Priority:** ⚪ LOW
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier2.meta.no-twitter-card`

**What it means (plain English)**

Your homepage doesn't include a Twitter Card meta tag, which is optional markup that tells Twitter how to display your page when someone shares the link on that platform. Without it, Twitter will use generic defaults, making your link look less polished and less clickable.

**Why it matters for your business:** If customers or advocates share your dispensary link on Twitter/X, the preview will be bland and may reduce click-through rates from social traffic.

**Technical root cause:** The HTML <head> section is missing the `<meta name="twitter:card" content="summary_large_image">` tag (or similar variant).

**Recommended fix — step by step**

1. Open your site's HTML editor or theme settings (WordPress: Appearance → Theme File Editor, or use Yoast SEO plugin)
2. Locate the <head> section of your homepage template
3. Add the line: <meta name="twitter:card" content="summary_large_image">
4. Add: <meta name="twitter:site" content="@YourTwitterHandle"> (replace with your actual handle)
5. Add: <meta name="twitter:title" content="Better Cannabis | [Your tagline]">
6. Add: <meta name="twitter:description" content="[Brief description of your dispensary]">
7. Add: <meta name="twitter:image" content="https://bettercannabis.com/[path-to-social-image.jpg]"> (use a 1200×630px image)
8. Save and test at https://cards-dev.twitter.com/validator

### 22. Missing Twitter card

- **Severity:** P3   |   **Priority:** ⚪ LOW
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/story/
- **Rule:** `tier2.meta.no-twitter-card`

**What it means (plain English)**

Your website doesn't have a Twitter card meta tag, which is a small snippet of code that controls how your pages look when shared on Twitter/X. Without it, social shares default to a plain, unattractive preview with no image or custom description.

**Why it matters for your business:** When customers or advocates share your dispensary's content on Twitter/X, it appears bland and unprofessional, reducing click-through rates and brand perception on social platforms.

**Technical root cause:** The page is missing the `<meta name="twitter:card" content="summary_large_image">` tag and related Twitter-specific meta tags (twitter:title, twitter:description, twitter:image) in the HTML head section.

**Recommended fix — step by step**

1. Open the HTML source of https://bettercannabis.com/story/ and locate the <head> section
2. Add this line: `<meta name="twitter:card" content="summary_large_image">` after your existing og: meta tags
3. Add `<meta name="twitter:title" content="[Your Page Title]">` with your actual page title
4. Add `<meta name="twitter:description" content="[Your Page Description]">` with a compelling 2-sentence description
5. Add `<meta name="twitter:image" content="[Full URL to image]">` pointing to a high-quality image at least 506x506px
6. If using WordPress, install Yoast SEO or Rank Math, navigate to Settings → Social, and enable Twitter card generation
7. Test the card at cards-dev.twitter.com by entering your URL

### 23. Missing Twitter card

- **Severity:** P3   |   **Priority:** ⚪ LOW
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/rewards/
- **Rule:** `tier2.meta.no-twitter-card`

**What it means (plain English)**

Your rewards page is missing a Twitter Card meta tag, which tells Twitter (X) how to display your page when someone shares it. Without this, the social network will show a plain, less-appealing preview that may not include your image or proper description.

**Why it matters for your business:** When customers or influencers share your rewards program on social media, a poorly formatted preview reduces click-through rates and brand credibility compared to a rich, image-backed card.

**Technical root cause:** The HTML head section of the rewards page lacks the `<meta name="twitter:card" content="summary_large_image">` tag (and related Twitter meta tags like twitter:image and twitter:description).

**Recommended fix — step by step**

1. Open the rewards page HTML source (or page template if using a CMS) and locate the <head> section
2. Add the following meta tags before the closing </head>: `<meta name="twitter:card" content="summary_large_image">`, `<meta name="twitter:title" content="Better Cannabis Rewards Program">`, `<meta name="twitter:description" content="[Your rewards description]">`, `<meta name="twitter:image" content="[URL to a 1200x630px image]">`, and `<meta name="twitter:site" content="@[your-twitter-handle]">` (if applicable)
3. Use Twitter's Card Validator tool (cards-dev.twitter.com/validator) to test and preview how your rewards page will appear when shared
4. Repeat this process for any other high-traffic pages (product pages, promotions, blog posts) where social sharing is expected

### 24. Missing Twitter card

- **Severity:** P3   |   **Priority:** ⚪ LOW
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/curbside/
- **Rule:** `tier2.meta.no-twitter-card`

**What it means (plain English)**

Your pages don't include Twitter Card meta tags, which are optional metadata that tell Twitter how to display your content when someone shares a link to your site on that platform. Without them, Twitter falls back to basic information and your posts may look less professional or engaging when shared.

**Why it matters for your business:** Missing Twitter Cards means that when customers or staff share your curbside ordering page or other content on Twitter/X, the preview will be plain and generic, reducing click-through rates and brand visibility in social sharing.

**Technical root cause:** The <head> section of your pages lacks Open Graph and Twitter-specific meta tags (e.g., `<meta name="twitter:card" content="summary_large_image">`). This is typically a template or theme configuration issue.

**Recommended fix — step by step**

1. Open your page source (right-click → View Page Source) and search for existing meta tags in the <head> section to see what's already present.
2. Add Twitter Card meta tags to your page template or header: include `<meta name="twitter:card" content="summary_large_image">`, `<meta name="twitter:title" content="[Page Title]">`, `<meta name="twitter:description" content="[Page Description]">`, and `<meta name="twitter:image" content="[Image URL]">`. If you're on WordPress, install Yoast SEO or All in One SEO and enable Twitter/X integration in Settings → Social Networks.
3. Test each shared URL using Twitter's Card validator at https://cards-dev.twitter.com/validator to confirm cards render correctly before and after publishing.
4. Consider also adding Open Graph tags (`og:title`, `og:image`, `og:description`) which improve sharing on Facebook, Instagram, and other platforms using the same metadata.

### 25. Missing Twitter card

- **Severity:** P3   |   **Priority:** ⚪ LOW
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/connect-2/
- **Rule:** `tier2.meta.no-twitter-card`

**What it means (plain English)**

Your website is missing a Twitter card meta tag, which is a snippet of code that tells Twitter how to display your page when someone shares it on that platform. Without it, Twitter won't show a nice preview with your image and description—it'll just show a plain text link, which looks unprofessional and gets fewer clicks.

**Why it matters for your business:** Missing Twitter cards reduce click-through rates on social shares, limiting organic reach and brand visibility when customers or advocates promote your content on Twitter/X.

**Technical root cause:** The page lacks the `<meta name="twitter:card" content="summary_large_image">` tag (or similar) in the HTML head section. Twitter's crawler cannot find instructions on how to format the preview.

**Recommended fix — step by step**

1. Open the affected page (/connect-2/) in your site editor or CMS and locate the HTML <head> section.
2. Add this meta tag: `<meta name="twitter:card" content="summary_large_image">`
3. Add companion tags for full control: `<meta name="twitter:title" content="[Your page title]">`, `<meta name="twitter:description" content="[Your page description]">`, and `<meta name="twitter:image" content="[Full URL to a 1200x630px image]">`
4. Test the card using Twitter's Card Validator (cards-dev.twitter.com/validator) — paste the page URL and verify the preview displays correctly.
5. If using WordPress, install the Yoast SEO plugin, go to SEO → Social → Twitter, and enable the Twitter card option with your preferred card type.
6. Apply the same tags to all other pages, or configure your site-wide SEO plugin to auto-generate them from existing og:image and description meta tags.

### 26. Missing Twitter card

- **Severity:** P3   |   **Priority:** ⚪ LOW
- **Effort:** Quick win (< 30 min)
- **Business category:** polish
- **Page URL:** https://bettercannabis.com/connect/
- **Rule:** `tier2.meta.no-twitter-card`

**What it means (plain English)**

Your website is missing a Twitter Card meta tag, which is a snippet of code that tells Twitter (now X) how to display your content when someone shares a link. Without it, social shares may look plain or unprofessional, showing only a generic preview instead of your intended headline, image, and description.

**Why it matters for your business:** Poor social media presentation reduces click-through rates when customers share your dispensary's content on Twitter/X, potentially losing foot traffic and online visibility in a competitive market.

**Technical root cause:** The page lacks the `<meta name="twitter:card" content="summary_large_image">` tag and related Twitter Card metadata (twitter:title, twitter:description, twitter:image) in the HTML head section.

**Recommended fix — step by step**

1. Open your site's HTML template or header file and locate the <head> section
2. Add this line before the closing </head>: `<meta name="twitter:card" content="summary_large_image">`
3. Add `<meta name="twitter:title" content="Your Page Title Here">` (use the page's actual heading)
4. Add `<meta name="twitter:description" content="Your page description here">` (120–160 characters, benefit-focused)
5. Add `<meta name="twitter:image" content="https://bettercannabis.com/path-to-image.jpg">` (use a high-quality 1200×630px image)
6. Repeat for key pages: homepage, product/menu pages, and blog posts
7. Test the card by pasting your URL into Twitter's Card Validator (cards-dev.twitter.com/validator)

### 27. Missing Twitter card

- **Severity:** P3   |   **Priority:** ⚪ LOW
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/category/blog/
- **Rule:** `tier2.meta.no-twitter-card`

**What it means (plain English)**

Your blog category page is missing a Twitter Card meta tag — a small code snippet that controls how your content appears when shared on Twitter/X. Without it, Twitter will auto-generate a preview using whatever it can find, which often looks unprofessional and doesn't showcase your best messaging.

**Why it matters for your business:** Missing Twitter Cards reduce click-through rates from social shares and make your brand appear less polished compared to competitors; for a wellness brand, consistent professional presentation across platforms builds trust.

**Technical root cause:** The page's HTML <head> section lacks a `<meta name="twitter:card" content="summary_large_image">` or similar tag that tells Twitter how to format the preview.

**Recommended fix — step by step**

1. Log into your site admin and navigate to the page editing interface for https://bettercannabis.com/category/blog/
2. Locate the meta tags section (usually labeled 'SEO' or 'Head Tags' depending on platform; if using WordPress, install Yoast SEO or RankMath)
3. Add the meta tag: `<meta name="twitter:card" content="summary_large_image">` (or `summary` if you don't have a high-quality featured image)
4. Add companion tags: `<meta name="twitter:title" content="[Your Blog Title]">` and `<meta name="twitter:description" content="[Brief description]">` and `<meta name="twitter:image" content="[URL to featured image]">` pointing to a 1200×630px image
5. Save and publish; verify by pasting the URL into Twitter's Card Validator (https://cards-dev.twitter.com/validator)

### 28. Missing Twitter card

- **Severity:** P3   |   **Priority:** ⚪ LOW
- **Effort:** Quick win (< 30 min)
- **Business category:** seo
- **Page URL:** https://bettercannabis.com/author/admin-better/
- **Rule:** `tier2.meta.no-twitter-card`

**What it means (plain English)**

Your author page is missing a Twitter card meta tag, which is a small HTML instruction that tells Twitter how to display your page when someone shares it. Without this tag, Twitter will guess how to format the preview, often showing a generic or incomplete preview that may not represent your content well.

**Why it matters for your business:** When your pages are shared on Twitter/X, they'll display with less-engaging previews, reducing click-through rates and social visibility for your brand and product education content.

**Technical root cause:** The page's HTML head section lacks the `<meta name="twitter:card" content="summary_large_image">` tag (or equivalent variant). This is a simple meta tag that must be explicitly added to the page template.

**Recommended fix — step by step**

1. Log into your site's admin or code editor and locate the HTML head section (or theme header file if using WordPress/CMS)
2. Add this meta tag: `<meta name="twitter:card" content="summary_large_image">` (or `summary` if you prefer a smaller preview)
3. Add companion meta tags for completeness: `<meta name="twitter:title" content="[Page Title]">`, `<meta name="twitter:description" content="[Page Description]">`, and `<meta name="twitter:image" content="[Image URL]">`
4. Test the fix using Twitter's Card Validator at cards-dev.twitter.com/validator (paste your URL to preview)
5. If using WordPress, install the Yoast SEO plugin, enable Social Features, and configure Twitter settings in Dashboard → SEO → Social → Twitter
6. Apply this to all author pages and key landing pages (product pages, about, contact)

### 29. Lighthouse seo (mobile): 92/100

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lighthouse.seo-mobile`

**Detail**

Score 92 is below target 95. See HTML report for details.

### 30. LH mobile: Preconnect to required origins (Est savings of 280 ms)

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lh-opportunity.uses-rel-preconnect-mobile`

**Detail**

Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).

### 31. LH mobile: Preload Largest Contentful Paint image

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lh-opportunity.prioritize-lcp-image-mobile`

**Detail**

If the LCP element is dynamically added to the page, you should preload the image in order to improve LCP. [Learn more about preloading LCP elements](https://web.dev/articles/optimize-lcp#optimize_when_the_resource_is_discovered).

### 32. LH mobile: Eliminate render-blocking resources (Est savings of 1,650 ms)

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lh-opportunity.render-blocking-resources-mobile`

**Detail**

Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).

### 33. LH mobile: Minify JavaScript (Est savings of 5 KiB)

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lh-opportunity.unminified-javascript-mobile`

**Detail**

Minifying JavaScript files can reduce payload sizes and script parse time. [Learn how to minify JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unminified-javascript/).

### 34. LH mobile: Reduce unused CSS (Est savings of 13 KiB)

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lh-opportunity.unused-css-rules-mobile`

**Detail**

Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).

### 35. Lighthouse a11y (desktop): 87/100

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lighthouse.a11y-desktop`

**Detail**

Score 87 is below target 95. See HTML report for details.

### 36. Lighthouse seo (desktop): 92/100

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lighthouse.seo-desktop`

**Detail**

Score 92 is below target 95. See HTML report for details.

### 37. LH desktop: Preload Largest Contentful Paint image

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lh-opportunity.prioritize-lcp-image-desktop`

**Detail**

If the LCP element is dynamically added to the page, you should preload the image in order to improve LCP. [Learn more about preloading LCP elements](https://web.dev/articles/optimize-lcp#optimize_when_the_resource_is_discovered).

### 38. LH desktop: Eliminate render-blocking resources (Est savings of 290 ms)

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lh-opportunity.render-blocking-resources-desktop`

**Detail**

Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).

### 39. LH desktop: Minify JavaScript (Est savings of 5 KiB)

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lh-opportunity.unminified-javascript-desktop`

**Detail**

Minifying JavaScript files can reduce payload sizes and script parse time. [Learn how to minify JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unminified-javascript/).

### 40. LH desktop: Reduce unused CSS (Est savings of 13 KiB)

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lh-opportunity.unused-css-rules-desktop`

**Detail**

Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).

### 41. LH desktop: Serve images in next-gen formats (Est savings of 106 KiB)

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier8.lh-opportunity.modern-image-formats-desktop`

**Detail**

Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).

### 42. Dutchie menu iframe not found on /, /menu, or /shop

- **Severity:** P3
- **Page URL:** https://bettercannabis.com/
- **Rule:** `tier-revenue.dutchie.iframe-absent`

**Detail**

No Dutchie iframe detected. If this client uses a different menu provider, add it to clients.yaml dutchieSlug=null + we'll stop flagging.

---

## Findings by Page

Grouped by URL — useful when working through the site one page at a time.

### https://bettercannabis.com/
_41 findings on this page_

- **[P1] A11y: ARIA dialog and alertdialog nodes should have an accessible name** 🔴 DO FIRST
  Your age-gate dialog (the overlay that appears when visitors first arrive) doesn't have a label that screen readers can announce. Screen reader users won't know what this dialog is for—they'll just he
- **[P1] A11y: Elements must meet minimum color contrast ratio thresholds (×11)** 🔴 DO FIRST
  Your website has 11 places where text color and background color don't have enough contrast—meaning some visitors, especially those with low vision or color blindness, can't read the text clearly. The
- **[P1] A11y: Links must have discernible text (×3)** 🔴 DO FIRST
  Your website has 3 links that screen reader users cannot identify. These are clickable elements with no visible text, no hidden label, and no title attribute — so a visually impaired visitor using a s
- **[P2] Missing meta description** 🟠 HIGH
  Your homepage doesn't have a meta description — the 150-160 character summary that appears below your page title in Google search results. Search engines will auto-generate one from your page content,
- **[P2] No JSON-LD schema** 
- **[P2] 20 image(s) missing alt text** 🔴 DO FIRST
  Every image on your homepage lacks alt text—a short description that screen readers announce to blind and low-vision visitors, and that search engines use to understand image content. You have 20 imag
- **[P2] No H1 on homepage** 🟠 HIGH
  Your homepage doesn't have an H1 tag — the main heading that tells search engines and screen readers what the page is about. Search engines rely on this tag to understand your page's topic, and visito
- **[P2] Missing core schema types: Organization, LocalBusiness, WebSite** 🟠 HIGH
  Your site doesn't declare structured data (machine-readable information) that tells Google who you are, where you operate, and what your site does. Search engines use this to build a rich knowledge pa
- **[P2] Missing security header: content-security-policy** 
- **[P2] Cookie missing Secure flag** 🟠 HIGH
  Your site is setting a cookie (nfd-enable-cf-opt) without the Secure flag, which means it can be transmitted over unencrypted HTTP connections. Even though your site uses HTTPS, if a user is ever redi
- **[P2] No DMARC policy published** 🟠 HIGH
  Your domain has SPF (a partial email authentication tool) configured, but is missing DMARC—a security standard that tells email providers how to handle messages that fail authentication checks. Withou
- **[P2] 10 tap targets under 44px at mobile-320** 🟠 HIGH
  Your website has 10 interactive elements (buttons, links, form fields) that are smaller than 44×44 pixels when viewed on a mobile phone. This makes them hard to tap accurately, especially for people w
- **[P2] 9 tap targets under 44px at mobile-375** 🟠 HIGH
  Your site has 9 clickable buttons, links, or other interactive elements that are smaller than 44×44 pixels when viewed on a mobile phone. These small targets are hard to tap accurately, especially for
- **[P2] 9 tap targets under 44px at mobile-414** 🟠 HIGH
  Your website has 9 interactive buttons, links, or form fields that are smaller than 44×44 pixels when viewed on mobile phones. This makes them hard to tap accurately—especially for people with motor c
- **[P2] 6 tap targets under 44px at tablet-768** 
- **[P2] Lighthouse perf (mobile): 62/100** 🟠 HIGH
  Your mobile site takes about 8 seconds for the largest visual element (like a hero image or product photo) to appear on screen. For a cannabis retail site where customers are comparing products or che
- **[P2] A11y: All page content should be contained by landmarks (×11)** 🟠 HIGH
  Your homepage has 11 sections of content that aren't wrapped in semantic landmark regions—these are HTML elements like <main>, <nav>, <aside>, or <section> that tell screen readers and assistive techn
- **[P2] A11y: The skip-link target should exist and be focusable** 🟡 MEDIUM
  Your site has a skip link (a keyboard shortcut for screen readers and keyboard users to jump to main content), but the target element it points to—an element with id="content"—either doesn't exist or 
- **[P3] Title length 15 chars** 🟠 HIGH
  Your homepage title — the text that appears in browser tabs and search results — is only 15 characters long. Search engines and users expect titles between 20 and 65 characters. A longer, descriptive 
- **[P3] Missing OpenGraph metadata** 🟡 MEDIUM
  OpenGraph tags are snippets of code that tell social media platforms (Facebook, Instagram, LinkedIn) how to display your website when someone shares a link. Without them, the platform shows a generic 
- **[P3] Missing Twitter card** ⚪ LOW
  Your homepage doesn't include a Twitter Card meta tag, which is optional markup that tells Twitter how to display your page when someone shares the link on that platform. Without it, Twitter will use 
- **[P3] Cookie missing SameSite flag** 🟠 HIGH
  Your website is setting cookies without a SameSite flag, which tells browsers how to handle those cookies when users visit from external links or emails. Without this flag, browsers may block the cook
- **[P3] SSL Labs grade: unknown** 🟠 HIGH
  Your SSL certificate configuration returned an error when we tried to test it with Qualys SSL Labs, a trusted third-party security auditor. This usually means the server isn't responding correctly to 
- **[P3] DNSSEC not enabled** 🟡 MEDIUM
  DNSSEC is a security protocol that cryptographically verifies DNS records (the address book that tells browsers where your website lives). Without it, attackers could theoretically intercept or redire
- **[P3] No CAA DNS records** 🟠 HIGH
  Your domain doesn't have CAA (Certification Authority Authorization) records set up. These are DNS rules that tell the internet which companies are allowed to issue SSL certificates (the padlock secur
- **[P3] No DKIM selectors found (standard selectors)** 🟠 HIGH
  DKIM (DomainKeys Identified Mail) is a security standard that signs your outgoing emails with a cryptographic key, proving they really come from your domain. Your domain has SPF enabled but DKIM is no
- **[P3] Lighthouse a11y (mobile): 86/100** 🟡 MEDIUM
  Your mobile site scores 86 out of 100 on accessibility (the ability for people with disabilities to use your site). Your target is 95. Common issues include missing text descriptions on images, insuff
- **[P3] Lighthouse seo (mobile): 92/100** 
- **[P3] LH mobile: Preconnect to required origins (Est savings of 280 ms)** 
- **[P3] LH mobile: Preload Largest Contentful Paint image** 
- **[P3] LH mobile: Eliminate render-blocking resources (Est savings of 1,650 ms)** 
- **[P3] LH mobile: Minify JavaScript (Est savings of 5 KiB)** 
- **[P3] LH mobile: Reduce unused CSS (Est savings of 13 KiB)** 
- **[P3] Lighthouse a11y (desktop): 87/100** 
- **[P3] Lighthouse seo (desktop): 92/100** 
- **[P3] LH desktop: Preload Largest Contentful Paint image** 
- **[P3] LH desktop: Eliminate render-blocking resources (Est savings of 290 ms)** 
- **[P3] LH desktop: Minify JavaScript (Est savings of 5 KiB)** 
- **[P3] LH desktop: Reduce unused CSS (Est savings of 13 KiB)** 
- **[P3] LH desktop: Serve images in next-gen formats (Est savings of 106 KiB)** 
- **[P3] Dutchie menu iframe not found on /, /menu, or /shop** 

### https://bettercannabis.com/category/blog/
_6 findings on this page_

- **[P2] Missing meta description** 🟠 HIGH
  Your blog category page is missing a meta description—the short text (150–160 characters) that appears below your page title in Google search results. Without it, search engines may auto-generate a sn
- **[P2] Missing canonical** 🟠 HIGH
  This page doesn't tell search engines which version of the URL is the official one. If the same content is accessible via multiple URLs (like /category/blog/ and /blog/ and /blog/?sort=date), Google m
- **[P2] No JSON-LD schema** 🟡 MEDIUM
  Your blog category page lacks JSON-LD structured data—a standardized format that tells search engines what your content is about. Without it, Google can't easily understand that this is a blog section
- **[P2] 5 image(s) missing alt text** 
- **[P3] Missing OpenGraph metadata** 🟡 MEDIUM
  When your blog category page is shared on social media (Facebook, Instagram, LinkedIn), there's no image or title preview shown — just a blank or generic link. This happens because the page is missing
- **[P3] Missing Twitter card** ⚪ LOW
  Your blog category page is missing a Twitter Card meta tag — a small code snippet that controls how your content appears when shared on Twitter/X. Without it, Twitter will auto-generate a preview usin

### https://bettercannabis.com/author/admin-better/
_6 findings on this page_

- **[P2] Missing meta description** 🟡 MEDIUM
  This author archive page is missing a meta description — a 155-character summary that appears below your page title in Google search results. Without it, Google may auto-generate a snippet from your p
- **[P2] Missing canonical** 🟡 MEDIUM
  This page doesn't tell search engines which version is the 'official' one. When multiple URLs show the same or similar content, search engines can get confused about which to rank and may split your v
- **[P2] No JSON-LD schema** 🟡 MEDIUM
  Your site is missing JSON-LD structured data—a machine-readable format that tells Google what your pages are about (e.g., product info, business details, reviews). Without it, search engines have to g
- **[P2] 5 image(s) missing alt text** 🟠 HIGH
  Five images on your author page have no alternative text descriptions. Alt text is read aloud by screen readers for visitors with vision impairments, and it also helps search engines understand what y
- **[P3] Missing OpenGraph metadata** 🟡 MEDIUM
  When people share your pages on social media (Facebook, LinkedIn, etc.), those platforms look for special code tags called OpenGraph metadata to decide what title, image, and description to display. Y
- **[P3] Missing Twitter card** ⚪ LOW
  Your author page is missing a Twitter card meta tag, which is a small HTML instruction that tells Twitter how to display your page when someone shares it. Without this tag, Twitter will guess how to f

### https://bettercannabis.com/hello-world/
_5 findings on this page_

- **[P2] Missing meta description** 🟡 MEDIUM
  Your blog post at /hello-world/ is missing a meta description — the 150–160 character summary that appears below your page title in Google search results. Without it, Google will auto-generate a snipp
- **[P2] No JSON-LD schema** 🟠 HIGH
  Your website lacks JSON-LD structured data—a standardized format that tells search engines what your pages are about. This is like leaving your storefront unlabeled; Google has to guess. Without it, s
- **[P2] 6 image(s) missing alt text** 🟠 HIGH
  Your blog post on the homepage has 6 images, but none of them have alt text — a short description that appears if the image doesn't load and helps screen readers (software used by people with vision l
- **[P3] Missing OpenGraph metadata** 🟡 MEDIUM
  When your pages are shared on social media (Facebook, Instagram, LinkedIn), those platforms look for special HTML tags called OpenGraph metadata to decide what title and image to display in the previe
- **[P3] Missing Twitter card** ⚪ LOW
  Your pages don't include Twitter card metadata—special code that tells Twitter (now X) how to display your content when someone shares a link. Without it, X shows a generic preview instead of your cus

### https://bettercannabis.com/story/
_5 findings on this page_

- **[P2] Missing meta description** 🟠 HIGH
  Your /story/ page is missing a meta description — the 150-160 character summary that appears below your page title in Google search results. Without it, Google will auto-generate a snippet from your p
- **[P2] No JSON-LD schema** 🟠 HIGH
  Your website doesn't include structured data (JSON-LD)—machine-readable labels that tell search engines what content is on your pages. Without it, Google can't easily understand that you're a dispensa
- **[P2] 7 image(s) missing alt text** 🟠 HIGH
  All 7 images on your story page lack alt text — alternative descriptions that screen readers use to describe images to visually impaired visitors, and that search engines use to understand image conte
- **[P3] Missing OpenGraph metadata** 🟡 MEDIUM
  When your pages are shared on social media (Facebook, Instagram, LinkedIn), the platform looks for Open Graph tags — metadata code that tells social networks what title, image, and description to disp
- **[P3] Missing Twitter card** ⚪ LOW
  Your website doesn't have a Twitter card meta tag, which is a small snippet of code that controls how your pages look when shared on Twitter/X. Without it, social shares default to a plain, unattracti

### https://bettercannabis.com/rewards/
_5 findings on this page_

- **[P2] Missing meta description** 🟠 HIGH
  The Rewards page is missing a meta description — the 160-character summary that appears below your page title in Google search results. Without it, Google generates a random snippet from your page con
- **[P2] No JSON-LD schema** 🟡 MEDIUM
  Your rewards page doesn't include JSON-LD structured data — a machine-readable format that tells search engines what type of content they're looking at. Without it, Google can't reliably understand th
- **[P2] 5 image(s) missing alt text** 🟠 HIGH
  Five images on your Rewards page have no alt text—that is, no written description that screen readers can announce to visually impaired visitors. This breaks accessibility for a meaningful portion of 
- **[P3] Missing OpenGraph metadata** 🟡 MEDIUM
  Your Rewards page is missing OpenGraph tags — small HTML snippets that control how the page looks when shared on Facebook, Instagram, LinkedIn, and other social platforms. Without them, when customers
- **[P3] Missing Twitter card** ⚪ LOW
  Your rewards page is missing a Twitter Card meta tag, which tells Twitter (X) how to display your page when someone shares it. Without this, the social network will show a plain, less-appealing previe

### https://bettercannabis.com/curbside/
_5 findings on this page_

- **[P2] Missing meta description** 🟠 HIGH
  The curbside pickup page is missing a meta description — the short text that appears below your page title in Google search results. Without it, search engines may auto-generate a snippet from your pa
- **[P2] No JSON-LD schema** 🟡 MEDIUM
  Your curbside pickup page doesn't include structured data — a machine-readable format that tells search engines what your page is about. Without it, Google can't easily understand that you offer curbs
- **[P2] 14 image(s) missing alt text** 
- **[P3] Missing OpenGraph metadata** 🟡 MEDIUM
  OpenGraph metadata are HTML tags that tell social media platforms (Facebook, Instagram, LinkedIn) how to display your page when someone shares it. Without them, the platform shows a generic preview—of
- **[P3] Missing Twitter card** ⚪ LOW
  Your pages don't include Twitter Card meta tags, which are optional metadata that tell Twitter how to display your content when someone shares a link to your site on that platform. Without them, Twitt

### https://bettercannabis.com/connect-2/
_5 findings on this page_

- **[P2] Missing meta description** 
- **[P2] No JSON-LD schema** 🟠 HIGH
  Your website is missing JSON-LD structured data—code that tells search engines what your pages are about in a machine-readable format. Without it, Google has to guess whether a page is a product listi
- **[P2] 5 image(s) missing alt text** 🟠 HIGH
  Every image on your website should have a short text description (called 'alt text') that explains what the image shows. Right now, 5 images on your Connect page have no description. Screen readers—so
- **[P3] Missing OpenGraph metadata** 🟡 MEDIUM
  When someone shares your page on Facebook, Instagram, or other social networks, those platforms look for OpenGraph tags (special metadata) to decide what title and image to display in the preview. Wit
- **[P3] Missing Twitter card** ⚪ LOW
  Your website is missing a Twitter card meta tag, which is a snippet of code that tells Twitter how to display your page when someone shares it on that platform. Without it, Twitter won't show a nice p

### https://bettercannabis.com/connect/
_5 findings on this page_

- **[P2] Missing meta description** 🟠 HIGH
  Your /connect/ page is missing a meta description — the 150-160 character summary that appears below your page title in Google search results. Without it, Google may auto-generate a snippet from your 
- **[P2] No JSON-LD schema** 🟠 HIGH
  Your website pages don't include JSON-LD structured data — a machine-readable format that tells search engines what content is on your page. For example, search engines can't automatically recognize y
- **[P2] 5 image(s) missing alt text** 🟠 HIGH
  Five images on your Connect page have no alternative text descriptions. Alt text is read aloud by screen readers (tools used by blind and low-vision visitors) and also helps search engines understand 
- **[P3] Missing OpenGraph metadata** 🟡 MEDIUM
  OpenGraph metadata (og:title, og:image, og:description) are HTML tags that tell social media platforms like Facebook, Instagram, and LinkedIn how to display your page when someone shares a link. Witho
- **[P3] Missing Twitter card** ⚪ LOW
  Your website is missing a Twitter Card meta tag, which is a snippet of code that tells Twitter (now X) how to display your content when someone shares a link. Without it, social shares may look plain 

### https://bettercannabis.com/metform-form/blank-form/
_4 findings on this page_

- **[P2] Missing meta description** 🟠 HIGH
  Your page at /metform-form/blank-form/ is missing a meta description — the 150-160 character summary that appears below your page title in Google search results. Without it, Google will auto-generate 
- **[P2] No JSON-LD schema** 🟠 HIGH
  Your website is missing JSON-LD structured data — machine-readable code that tells search engines what your pages contain. Google uses this to understand your business type, products, reviews, and loc
- **[P3] Missing OpenGraph metadata** 🟡 MEDIUM
  When someone shares a link to your site on social media (Facebook, LinkedIn, etc.), the platform uses special metadata tags called OpenGraph to pull in a preview image and title. Without these tags, y
- **[P3] Missing Twitter card** 🟡 MEDIUM
  Your pages are missing Twitter Card meta tags, which tell social platforms how to display your content when someone shares a link. Without these tags, your posts appear plain and unformatted on Twitte

### https://bettercannabis.com/robots.txt
_1 finding on this page_

- **[P3] robots.txt does not reference sitemap** 🟡 MEDIUM
  Your robots.txt file (a set of instructions you give to search engines about which pages they can crawl) doesn't tell Google where your XML sitemap is located. A sitemap is like a map of your entire w

### https://bettercannabis.com/wp-login.php
_1 finding on this page_

- **[P0] Sensitive artifact exposed: /wp-login.php** 🔴 DO FIRST
  Your WordPress admin login page is publicly accessible at /wp-login.php. This is a common entry point for hackers trying to break into sites. While it's normal for WordPress sites to have this file, i


---

_Generated by Apex Sentinel Monthly Audit · 2026-04-19T06:56:42.126Z · Powered by Bud Authority._