Skip to content

feat(website): result-aware signup box on the free tool pages - #249

Merged
stewartjarod merged 3 commits into
mainfrom
feat/tool-signup-box
Nov 3, 2026
Merged

stewartjarod merged 3 commits into
mainfrom
feat/tool-signup-box

Conversation

@stewartjarod

Copy link
Copy Markdown
Contributor

Why

The free tool pages already rank, but they ask for nothing at the moment of highest intent. Over 90 days Search Console shows /tools/ses-calculator alone at 36K impressions, and four more tools sit at position 6 to 19. The checker's only call to action was a generic card that linked to the docs quickstart, and the SPF and DMARC builders ended at a copy button. The Better Auth guide (45 real visitors in 30 days) had no path to signup at all.

What changed

One shared ToolSignupBox, with copy chosen by a pure function (lib/tool-cta.ts) from what the visitor found:

Page Offer
/tools and its aliases (dmarc-checker, dkim-checker, blacklist-check, mx-lookup) SES domain with issues: email connect. Other domain with issues: email init. Clean: a soft prompt. The three demo domains keep the generic offer.
spf-builder, dmarc-builder email init
bounce-rate-calculator by rate zone
email-header-analyzer by failing SPF, DKIM or DMARC, or misaligned Return-Path
/docs/guides/better-auth email connect, stacked layout for the docs column

SES detection uses the SPF record and includes, the checker's existing "AWS SES" DKIM warning, and an SES MX host. DKIM selectors cannot identify SES because it picks them at random.

The tools stay free and ungated: no email capture, and no price claims in the box.

Analytics

tool_cta_view (once per tool and state, at 50% visible) and tool_cta_click carry tool, state, page_path, cta_variant: tool_box_v1, plus control (primary, secondary or copy) on clicks. signup_click still fires on the signup link as before. With about four signups a week, read click-through (clicks / views) per state after roughly four weeks rather than signups.

Testing

  • 24 new tests for the picker, SES detection and analytics (written first); full website suite passes (1446).
  • tsc -b clean; biome warnings unchanged (43 before and after).
  • Looked at in a browser: bounce calculator (risk state), SPF builder, DMARC builder, header analyzer (failing SPF), Better Auth guide. This caught a layout overflow in the narrow docs column, fixed with a stacked layout.
  • pnpm sitemap:dates regenerated in its own commit; it also clears the /changelog staleness already on main.

Not verified, please check on the preview

The checker box has not been seen live: the checker needs the Cloudflare Turnstile secret, which is not set locally. Only the picker's unit tests and the types cover that wiring. Before merging, run the checker on the preview with one SES domain, one non-SES domain and one clean domain.

Review notes

  • The Better Auth card's copy ("Sending goes straight from your own AWS account and needs no Wraps account") is accurate for sending only; the guide's optional contact sync uses WRAPS_API_KEY. Please read the wording.
  • Phase scope: this covers the checker, both builders, the bounce calculator, the header analyzer and the Better Auth guide in one change, as agreed.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GxJAQS5X19PmvDpismbiPz

stewartjarod and others added 2 commits November 3, 2026 09:56
The tool pages rank but asked for nothing at the moment of highest intent: the
checker's only call to action was a generic card linking to the docs, and the
builders ended at a copy button.

One shared ToolSignupBox now sits next to each result, with copy picked by a pure
function (lib/tool-cta.ts) from what the visitor found:

- checker (and its four aliases): an SES domain with issues is offered
  `email connect`, a non-SES domain with issues `email init`, a clean result a soft
  prompt; the three demo domains keep the generic offer
- spf-builder, dmarc-builder: `email init`
- bounce-rate-calculator, email-header-analyzer: by rate zone and by failing checks
- Better Auth guide: `email connect`, stacked layout for the docs column

SES detection uses the SPF record and includes, the checker's own AWS SES DKIM
warning, and an SES MX host. DKIM selectors cannot identify SES.

No gating or email capture, and no price claims in the box. Views and clicks are
reported as tool_cta_view / tool_cta_click with tool, state and page_path;
signup_click still fires on the signup link.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQS5X19PmvDpismbiPz
…etter Auth guide

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQS5X19PmvDpismbiPz
@vercel
vercel Bot temporarily deployed to Preview – wraps-web November 3, 2026 16:57 Inactive
@vercel

vercel Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
wraps-website Ready Ready Preview Nov 3, 2026 5:02pm UTC
1 Skipped Deployment
Project Deployment Actions Updated
wraps-web Skipped Skipped Nov 3, 2026 5:02pm UTC

Request Review

Comment thread apps/website/src/lib/tool-cta.ts Fixed
Comment thread apps/website/src/lib/tool-cta.ts Fixed
CodeQL flagged `includes("amazonses.com")` as incomplete URL substring
sanitization. Nothing here is a security check (it only picks which offer to show),
but the match was genuinely loose: `include:amazonses.com.evil.example` or
`notamazonses.com` was taken for SES.

SPF is now read as delegated hosts (`include:` and `redirect=`, with any qualifier),
and an MX host must be `amazonses.com` or a subdomain of it, with or without a
trailing dot. Look-alike hosts and a bare mention outside an include are not SES.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQS5X19PmvDpismbiPz
@vercel
vercel Bot temporarily deployed to Preview – wraps-web November 3, 2026 17:01 Inactive
@stewartjarod
stewartjarod merged commit 6c03e07 into main Nov 3, 2026
20 checks passed
@stewartjarod
stewartjarod deleted the feat/tool-signup-box branch November 3, 2026 17:21

This branch was successfully deployed

1 active and 1 inactive deployments
Preview – wraps-website — 35ae9684 Deployed Nov 3, 2026 by vercel[bot]
Preview – wraps-web — 35ae9684 Deployed Nov 3, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants