Skip to content

Copy polish: remove jargon, add competitor contrast, fix empty state - #492

Open
manazoid4 wants to merge 7 commits into
mainfrom
nightly/copy-polish-2026-08-21
Open

Copy polish: remove jargon, add competitor contrast, fix empty state#492
manazoid4 wants to merge 7 commits into
mainfrom
nightly/copy-polish-2026-08-21

Conversation

@manazoid4

Copy link
Copy Markdown
Owner

Summary

Nightly build agent run — 2026-08-21. Build green, TypeScript clean, no new features required (all Tier 1 already built). Focus: copy polish on 3 pages + site health fixes.

FindJobsPage

  • Empty state: Removed off-brand SVG illustration (brutalist design = no soft rounded graphics). Replaced corporate "Alert delivery is available only after the selected provider and account configuration have been verified" with direct, trust-building copy. Added Bark/Checkatrade competitor contrast: "Bark and Checkatrade sell you a lead whether it's real or not. Here, no match means there's genuinely nothing verified…"
  • Scan limit message: Replaced "Buyer and submission context locked. Scanning remains free." with "Free scans used up — upgrade to see who to call, the value, and the deadline on every lead." (plain English at the highest-intent moment)
  • Upgrade nudge: Changed micro-label from "REAL JOBS. BUYER DETAILS IN FULL ACCESS." to "NO SHARED AUCTION. NO FIVE-TRADE BLAST." Added Checkatrade/Bark contrast line. Added "No credit card required to browse" next to the £39/mo CTA.

PricingPage

  • Changed hero micro-label from "FOUNDER-ASSISTED PILOT" to "FULL ACCESS — £39/MO" (removes unfinished-product signal)
  • Updated hero body copy: "For 5–25-person contractors evaluating public works" → "For electricians, plumbers, roofers and builders who want to quote public work — without wading through procurement jargon." (matches actual user persona)
  • Added competitor FAQ answer naming Checkatrade and Bark explicitly

DashboardPage

  • "PUBLIC-WORKS DECISION TRACKER" → "YOUR JOB PIPELINE" (plain language for paying users)
  • "FIND A TENDER: FREE + PUBLIC" badge → "LIVE PUBLIC JOB FEED"
  • "CHECK CURRENT FTS OPPORTUNITIES →" → "SCAN FOR JOBS NEAR YOU →" (removes FTS acronym from primary action)

Phase 4 — Site Health

NEEDLE found: 3 issues — paywall jargon at scan limit, pricing page wrong persona, dashboard FTS acronym throughout.
BUILDER fixed: All 3 issues addressed.
CRITIC: All 3 changes read clearly in under 3 seconds. ✓
REVENUE: Yes — removing persona mismatch on pricing page and fixing the scan-limit message directly improves likelihood of paying £39/mo.


Generated by Claude Code

…st, fix empty state

- FindJobsPage: Remove off-brand SVG from empty state; replace corporate alert copy
  with direct trade language; add Bark/Checkatrade contrast to upgrade nudge;
  fix scan-limit message from 'Buyer and submission context locked' to plain English;
  add 'No credit card required' to upgrade CTA; add 'NO SHARED AUCTION' micro-label
- PricingPage: Change hero persona from '5-25-person contractors' to electricians/
  plumbers/roofers/builders; rename 'FOUNDER-ASSISTED PILOT' label to 'FULL ACCESS —
  £39/MO'; add Checkatrade/Bark vs JobFilter answer to objections FAQ
- DashboardPage: Replace 'PUBLIC-WORKS DECISION TRACKER' with 'YOUR JOB PIPELINE';
  replace 'FTS' acronym in badge and quick-action CTA with plain English

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01THrG2vfrtJzJKWZ6zUTuUu
@vercel

vercel Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
job-filter-v1 Ready Ready Preview Aug 21, 2026 7:04am

@supabase

supabase Bot commented Aug 21, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project nfjwuwsuaapufmkppoeo because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@alwaysmeticulous

alwaysmeticulous Bot commented Aug 21, 2026

Copy link
Copy Markdown

✅ Meticulous spotted 0 visual differences across 169 screens tested: view results.

Meticulous evaluated ~4 hours of user flows against your PR.

Expected differences? Click here. Last updated for commit 526b039 fix: address Codex P2 follow-up findings on a13e97c. This comment will update as new commits are pushed.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 57e144fd35

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/pages/FindJobsPage.tsx Outdated
<p className="micro-label text-[var(--orange)]">SCAN REPORT</p>
<h2 className="headline mt-2 text-3xl leading-none sm:text-4xl">NO LIVE MATCHES. NO FAKE LEADS.</h2>
<p className="mt-2 text-sm font-black text-[var(--muted)]">
Bark and Checkatrade sell you a lead whether it&apos;s real or not. Here, no match means there&apos;s genuinely nothing verified for your trade and area right now — check back tomorrow or widen the search.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Avoid certifying failed scans as genuinely empty

When any source adapter fails, the lead engine can still return ok: true, zero leads, and populate result.errors/failed source stats; complete 429 or 503 responses also reach this component with count === 0. The results renderer always shows EmptyScanReport for that count, so this new statement tells users there are genuinely no opportunities even while the page reports a failed or incomplete scan, potentially causing them to miss live work. Only make this claim after confirming all relevant sources succeeded, and use an incomplete-scan message otherwise.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in a13e97c. EmptyScanReport now checks result.errors.length > 0 before showing the competitor-contrast copy. When any source errors are present the component renders a neutral "No matches this scan — completed with errors on some sources" message instead of certifying the result as genuinely empty. The confident "NO LIVE MATCHES. NO FAKE LEADS." copy only shows when errors is empty (clean scan).


Generated by Claude Code

Comment thread src/pages/FindJobsPage.tsx Outdated
Comment on lines +1555 to +1556
<p className="font-black text-[var(--yellow)] text-sm uppercase tracking-wide">Get notified the moment new jobs come in</p>
<p className="mt-1 text-sm font-black text-white/80">New verified jobs for your trade and area — sent straight to you. No missed first-mover window. No credit card required.</p>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Do not promise immediate alerts without payment

For users following this empty-state offer, the advertised combination is unavailable: /api/alerts allows free users only the weekly frequency, while instant and daily alerts require a paid subscription. The pricing link can lead to paid immediate alerts, but then a card is required; the free no-card alert can take up to a week and cannot guarantee the stated first-mover window. Describe this as a weekly alert or remove the no-card/immediacy claims.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in a13e97c. Removed "No missed first-mover window" and "No credit card required" from the alert CTA. Copy now reads: "Get a weekly alert when new jobs come in" / "New verified jobs for your trade and area — delivered weekly. Upgrade for daily or instant alerts." This accurately reflects the free-tier frequency and surfaces the paid upgrade path without implying immediacy that requires payment.


Generated by Claude Code

Comment thread src/pages/FindJobsPage.tsx Outdated
? `3 free scans this week — no credit card required`
: `${weeklyScansRemaining} free scan${weeklyScansRemaining === 1 ? '' : 's'} left this week`
: 'Buyer and submission context locked. Scanning remains free.'}
: 'Free scans used up — upgrade to see who to call, the value, and the deadline on every lead.'}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep the exhausted-scan message consistent with enforcement

After the third successful scan, only this local banner changes: the scan form and presets remain enabled, submit() has no quota guard, and its request supplies no bearer token even though the server-side quota resolver only enforces limits for bearer-authenticated users. Consequently the same user can continue receiving successful scans while being told their free scans are used up. Either retain the previous wording that scanning remains free or enforce the quota in the actual submission path.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in a13e97c. Changed "Free scans used up" → "Buyer details locked" so the banner accurately describes what the quota gates (the locked detail fields) rather than implying scanning itself is blocked. The form and submit path are intentionally unchanged — enforcement lives server-side for authenticated users and the scan result still renders with locked fields for free users. The new wording is consistent with that behaviour.


Generated by Claude Code

claude added 2 commits August 21, 2026 06:53
… fix)

nanoid was pinned to ^3.3.16 via postcss/next; bumped to >=3.3.18 to
resolve GHSA-2v37-7h3g-55p8. Pre-existing on main — fixed here to
unblock CI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01THrG2vfrtJzJKWZ6zUTuUu
- EmptyScanReport: competitor-contrast copy now guarded by result.errors check;
  shows neutral 'scan incomplete' message instead of certifying genuinely empty
  results when source adapters returned errors
- Alert CTA: 'No missed first-mover window / No credit card required' removed;
  free tier is weekly-only, not instant; copy now says 'weekly alert' and
  surfaces paid upgrade path for daily/instant
- Quota banner: 'Free scans used up' → 'Buyer details locked' to reflect that
  scanning continues and only the detail fields are enforcement-gated

Co-Authored-By: Claude <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a13e97c8d9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/pages/FindJobsPage.tsx Outdated
Comment on lines +1568 to +1569
<Link className="jf-button mt-3 inline-block bg-[var(--yellow)] text-[var(--ink)] text-sm" href="/pricing">
SET UP YOUR TRADE ALERT →

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Send the alert CTA to an alert setup flow

Although the corrected copy now advertises a weekly alert, clicking this CTA after an empty scan still navigates to /pricing, which contains checkout controls but no alert setup action. The actual weekly-alert form lives on the dashboard, and AlertQuickSetup already posts the selected trade and postcode to /api/alerts; route or render this CTA through one of those flows so “SET UP” does not strand users on an unrelated sales page.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 526b039. Changed the button label from "SET UP YOUR TRADE ALERT →" to "UNLOCK ALERTS — £39/MO →" so it matches the /pricing destination and accurately signals a paid upgrade action rather than a free alert-setup flow. The link itself stays /pricing — a free alert setup widget in the empty state would require embedding AlertQuickSetup with auth state, which is out of scope for this PR.


Generated by Claude Code

Comment thread src/pages/FindJobsPage.tsx Outdated
Comment on lines +787 to +788
<p className="mt-2 text-sm font-black text-[var(--ink)]/70">
Unlike Checkatrade or Bark, Gold leads show one buyer — your trade, your patch, your timing. Full Access adds the buyer name, published value, deadline and official response route.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Qualify the promise of a published value

For leads whose source does not publish a value, normalise() explicitly produces POA, and paid responses do not synthesize an exact value. The previous copy correctly said “published value where available,” but this replacement promises that Full Access adds a published value; users can therefore subscribe from this banner and still receive no value for the displayed Gold lead. Restore the availability qualification.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 526b039. Restored "where available" qualifier: "Full Access adds the buyer name, published value where available, deadline and official response route." Matches the behaviour of normalise() which returns POA when no value is published.


Generated by Claude Code

- Alert CTA in EmptyScanReport: rename 'SET UP YOUR TRADE ALERT' to
  'UNLOCK ALERTS — £39/MO' so label matches the /pricing destination;
  no mismatch between setup language and a checkout page
- Upgrade nudge: restore 'where available' qualifier on published value
  to match normalise() which returns POA when no value is published;
  Full Access does not synthesize a value for POA leads

Co-Authored-By: Claude <noreply@anthropic.com>
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