Install in ~10 minutes.

Start with one snippet on your existing 404 page. Upgrade later if you want advanced routing.

MVP: snippet on your existing 404 page

  1. Add the snippet to your 404 template
  2. Verify events are received
  3. Customize links + branding
What gets tracked
  • Missing URL path
  • Referrer + UTM parameters
  • Timestamp + basic device info

Avoid storing raw IPs; prefer hashing/truncation.

Snippet (example)

The snippet below is an example. Replace the data attributes with your values.

External script (recommended)
<!-- Example: external snippet include (replace placeholders) -->
<script src="https://cdn.noresultsfound.example/snippet.js" data-site="YOUR_SITE_ID" data-brand="your-brand" data-endpoint="https://collector.example/collect"></script>
Inline fetch() alternative
<!-- Alternative: inline fetch example (fires when a 404 is rendered) -->
<script>
  (function(){
    try{
      fetch('https://collector.example/collect', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          site: 'YOUR_SITE_ID',
          path: window.location.pathname + window.location.search,
          referrer: document.referrer || null,
          utm: (new URLSearchParams(location.search)).toString(),
          ts: Date.now()
        })
      }).catch(()=>{})
    }catch(e){}
  })();
</script>

Keep the original 404 status (don’t blanket-redirect). The snippet reports the broken request and lets you show recovery links to users.

Common setups

Next.js (App Router)

Place the snippet in your not-found component or 404 page so it runs when a 404 is rendered.
app/not-found.tsx or app/404/page.tsx

React SPA

Add the snippet to your 404 component that’s shown by your router fallback (ensure it runs client-side).
src/components/NotFound.jsx

WordPress

Paste the script into your theme’s 404.php template, typically near the top of the body content.
wp-content/themes/your-theme/404.php

Shopify

Edit your 404.liquid template and insert the snippet. Use theme customization for branding if available.
templates/404.liquid

If you need help, contact me.

Verify it's working

  • Trigger a fake 404 (/this-page-should-not-exist)
    Open a browser to a non-existent path on your site.
  • Confirm it appears in the dashboard (allow a few seconds)
    Your broken path should show in the dashboard list.
  • Confirm referrer and UTM capture (optional)(optional)
  • Confirm recovery link clicks (optional)(optional)
Expected (mock): after a test 404 you should see an event in the dashboard within a few seconds.

Customize the recovery page

  • Logo + colors (data-brand or CSS variables)
  • Top links (Home / Docs / Pricing / Contact / Status)
  • Optional search box to help users find content
  • Suggested links (top pages based on analytics)
  • Optional lead capture CTA (email) for recovery offers
Tip: pass data-brand and other attributes in the snippet to set defaults without editing templates.

Advanced routing (optional)

  • Keep the recovery experience on your domain for best UX (avoid third-party redirects).
  • Optionally route specific broken paths to campaign pages or specials to save conversions.
  • Use alerts or webhooks to notify teams when high-value pages break.

FAQ

Quick answers to common questions.

Will this affect SEO?
Not if you keep real 404 status codes. Avoid blanket 301s. The goal is better UX + insights, without changing how search engines interpret missing pages.
Can I keep everything on my own domain?
Yes. The standard setup runs on your existing 404 page. Advanced setups can also keep recovery UI fully on-domain while sending events to your collector endpoint.
What exactly gets tracked on a 404?
The missing path (including query string), the referrer when available, UTM parameters when present, and a timestamp. Keep it minimal and avoid storing raw IPs.
How do I verify it’s working?
Visit a fake URL on your site (e.g., /this-page-should-not-exist), then check that it shows up in the dashboard a few seconds later.
How do I remove it?
Remove the snippet from your 404 template (and any related collector config). Reporting stops immediately.