← back to Lawyer Directory Builder
Iter 35: Lawyer Pro pitch + dashboard FTC copy — three latent compliance fixes
7d98dc95c7b5366a7d01509885cc0d315cf696a9 · 2026-05-04 06:09:24 -0700 · SteveStudio2
Three latent §6155 / FTC issues in core code, caught while scanning for
'24 hour' / 'first call' / 'matched lead' patterns post-iter-34:
1. Lawyer Pro pitch (paid $29/mo product) used 'matched lead' / 'lead
alerts' / 'the moment a matched lead is submitted' — implies our
directory routes leads to attorneys, which IS the LRS pattern §6155
prohibits. Reframed:
- 'matched lead' → 'directory inquiry'
- 'lead alerts' → 'directory-inquiry alerts'
- 'Get notified the moment a matched lead is submitted in your
practice area + ZIP' → 'See an alert when a directory inquiry
mentions your practice area + ZIP — and you decide whether to
reach out'
- 'Direct messages with potential clients' → 'Direct messages
with visitors who initiate contact'
- 'Real-time lead alerts (practice area + ZIP)' → 'Directory-
inquiry alerts (practice area + ZIP) — for your awareness'
The product is unchanged; the copy now describes it in §6155-safe
language: directory shows inquiries → attorney decides to reach
out. No matching, no routing.
2. /dashboard EZ Upgrade pitch said 'live in 7 days' (unconditional FTC
promise). iter 24 fixed this on /upgrade but missed the dashboard
reference. Now matches: 'typical go-live: seven business days from
content intake.'
3. /directory inquiry success-flash said "We'll be in touch within 24
hours." — same unconditional SLA that violated FTC §5 advertising
rules on a service we don't actually staff 24 hours. Softened to
"We'll respond within two business days." Operationally honest.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Files touched
M src/server/directory.tsM src/server/portal.ts
Diff
commit 7d98dc95c7b5366a7d01509885cc0d315cf696a9
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date: Mon May 4 06:09:24 2026 -0700
Iter 35: Lawyer Pro pitch + dashboard FTC copy — three latent compliance fixes
Three latent §6155 / FTC issues in core code, caught while scanning for
'24 hour' / 'first call' / 'matched lead' patterns post-iter-34:
1. Lawyer Pro pitch (paid $29/mo product) used 'matched lead' / 'lead
alerts' / 'the moment a matched lead is submitted' — implies our
directory routes leads to attorneys, which IS the LRS pattern §6155
prohibits. Reframed:
- 'matched lead' → 'directory inquiry'
- 'lead alerts' → 'directory-inquiry alerts'
- 'Get notified the moment a matched lead is submitted in your
practice area + ZIP' → 'See an alert when a directory inquiry
mentions your practice area + ZIP — and you decide whether to
reach out'
- 'Direct messages with potential clients' → 'Direct messages
with visitors who initiate contact'
- 'Real-time lead alerts (practice area + ZIP)' → 'Directory-
inquiry alerts (practice area + ZIP) — for your awareness'
The product is unchanged; the copy now describes it in §6155-safe
language: directory shows inquiries → attorney decides to reach
out. No matching, no routing.
2. /dashboard EZ Upgrade pitch said 'live in 7 days' (unconditional FTC
promise). iter 24 fixed this on /upgrade but missed the dashboard
reference. Now matches: 'typical go-live: seven business days from
content intake.'
3. /directory inquiry success-flash said "We'll be in touch within 24
hours." — same unconditional SLA that violated FTC §5 advertising
rules on a service we don't actually staff 24 hours. Softened to
"We'll respond within two business days." Operationally honest.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
src/server/directory.ts | 2 +-
src/server/portal.ts | 10 +++++-----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/server/directory.ts b/src/server/directory.ts
index 49935ae..2558a87 100644
--- a/src/server/directory.ts
+++ b/src/server/directory.ts
@@ -522,7 +522,7 @@ router.post('/directory/inquire', async (req, res) => {
req.ip || null,
(req.headers['user-agent'] || '').toString().slice(0, 200),
]);
- res.redirect('/directory?msg=' + encodeURIComponent("Got it. We'll be in touch within 24 hours."));
+ res.redirect('/directory?msg=' + encodeURIComponent('Got it. We’ll respond within two business days.'));
} catch (e) {
res.redirect('/directory?err=' + encodeURIComponent((e as Error).message));
}
diff --git a/src/server/portal.ts b/src/server/portal.ts
index ea6e926..41ef9fc 100644
--- a/src/server/portal.ts
+++ b/src/server/portal.ts
@@ -662,11 +662,11 @@ router.get('/dashboard', requireUser, async (req, res) => {
${(u as any).tier === 'lawyer' || (u as any).tier === 'admin' ? `
<h3>Lawyer Pro · <em style="color:var(--good);font-style:italic">active</em></h3>
- <p class="muted">You have Lawyer Pro. Respond to reviews, DM clients, get lead alerts.</p>
+ <p class="muted">You have Lawyer Pro. Respond to reviews, send messages, see directory-inquiry alerts.</p>
<p><a href="/api/billing/portal" style="font-size:13px">Manage billing in Stripe →</a></p>
` : `
<h3>Upgrade to Lawyer <em>Pro</em></h3>
- <p class="lede" style="font-size:15px;margin:0 0 18px;max-width:54ch">Respond to client reviews. Send DMs through the platform. Get notified the moment a matched lead is submitted in your practice area + ZIP.</p>
+ <p class="lede" style="font-size:15px;margin:0 0 18px;max-width:54ch">Respond to client reviews. Message visitors who reached out to you directly. See an alert when a directory inquiry mentions your practice area + ZIP — and you decide whether to reach out.</p>
<div style="border:1px solid var(--rule);background:var(--noir-rise);padding:24px 28px;max-width:480px;margin:0 0 24px">
<div style="display:flex;align-items:baseline;gap:8px;margin-bottom:14px">
<div style="font-family:var(--serif);font-size:42px;color:var(--metal);font-weight:300;line-height:1">$29</div>
@@ -674,8 +674,8 @@ router.get('/dashboard', requireUser, async (req, res) => {
</div>
<ul style="list-style:none;padding:0;margin:0 0 20px;font-size:13px;color:var(--ink-soft)">
<li style="padding:6px 0;border-bottom:1px solid var(--rule-faint)"><span style="color:var(--metal)">✓</span> Reply publicly to client reviews on your profile</li>
- <li style="padding:6px 0;border-bottom:1px solid var(--rule-faint)"><span style="color:var(--metal)">✓</span> Direct messages with potential clients</li>
- <li style="padding:6px 0;border-bottom:1px solid var(--rule-faint)"><span style="color:var(--metal)">✓</span> Real-time lead alerts (practice area + ZIP)</li>
+ <li style="padding:6px 0;border-bottom:1px solid var(--rule-faint)"><span style="color:var(--metal)">✓</span> Direct messages with visitors who initiate contact</li>
+ <li style="padding:6px 0;border-bottom:1px solid var(--rule-faint)"><span style="color:var(--metal)">✓</span> Directory-inquiry alerts (practice area + ZIP) — for your awareness</li>
<li style="padding:6px 0;border-bottom:1px solid var(--rule-faint)"><span style="color:var(--metal)">✓</span> Edit firm profile, photos, hours</li>
<li style="padding:6px 0"><span style="color:var(--metal)">✓</span> Stripe-managed · cancel from this dashboard</li>
</ul>
@@ -702,7 +702,7 @@ router.get('/dashboard', requireUser, async (req, res) => {
`}
<h3>One-time site rebuild · <em>EZ Upgrade $499</em></h3>
- <p class="muted" style="max-width:54ch">A complete site rebuild on the Counsel & Bar template, live in 7 days. <a href="/upgrade">View details →</a></p>
+ <p class="muted" style="max-width:54ch">A complete site rebuild on the Counsel & Bar template — typical go-live: seven business days from content intake. <a href="/upgrade">View details →</a></p>
${u.role === 'admin' || (u as any).tier === 'admin' ? '<h3>Admin</h3><p>You have admin access. <a href="/admin">Open admin panel →</a></p>' : ''}
`, { user: u }));
← c18ff69 Iter 34: landing stat ledger — fix misleading §6155 stat + R
·
back to Lawyer Directory Builder
·
Iter 36: /find-a-lawyer/thanks — State Bar deep-link + Rule e6238ca →