# PRD: Post-Cold-Outreach Lead Discovery

> **Version:** v1
> **Created:** 2026-05-12 15:01
> **Score:** 30/40 | **Decision:** BUILD
> **Source:** freelance-client-visibility__scored-demand__20260508-0844.md

---

## 1. Problem & User

**Target User:** Freelancers and small agencies (1–5 people) doing outbound prospecting — B2B copywriters, brand designers, no-code developers, demand-gen consultants — who send 20–100 cold emails/week and feel like they're shouting into a void.

**Core Pain:** Generic cold outreach fails because it lacks timing context and credibility packaging. Freelancers either use expensive stacked tools (Apollo + Instantly + Clay = $80–$200/mo, built for sales teams) or spray LinkedIn DMs with no signal. What's missing: a freelancer-specific product that finds buyers at the right moment (timing signals) and gives the freelancer a trust-building entry point (proof page) instead of another generic pitch.

**User Quote:** "Everyone is trying to sell something"

---

## 2. Target Outcome & KPIs

- **Primary:** User has a prospect list with timing signals and at least 1 credibility brief ready to send within 10 minutes of first session
- **PLG conversion:** Free-to-paid ≥ 10% within 14 days
- **Retention:** 60-day retention ≥ 35% (user adds or acts on ≥ 5 prospects/week)
- **Revenue signal:** User attributes ≥ 1 reply or meeting to a brief-backed outreach

**KPIs:**
- Time-to-first-credibility-brief < 10 minutes
- Brief open/click rate (shareable URL analytics) ≥ 25%
- Churn < 10%/month

---

## 3. MVP Scope (In)

1. **Prospect workspace** — import prospects via CSV (from Apollo export, LinkedIn CSV) or add manually; stored with company, role, contact info
2. **Email verification** — verify prospect email via lightweight API (Hunter.io or similar); show valid/risky/invalid badge
3. **Timing signal tags** — manually tag each prospect with 1–2 buying signals from a predefined list: new job posting, website redesign visible, tech stack change, recent funding < $5M, visible marketing gap
4. **Credibility brief generator** — user builds a 1-page proof brief: niche headline, 2–3 portfolio pieces, 1 testimonial, prospect-specific reason for outreach; generates shareable URL
5. **Outreach list export** — export filtered prospect list (verified emails + brief URLs) as CSV for use in any email tool
6. **Credit-based usage** — free tier: 15 prospects/month; paid: 100 prospects/month

---

## 4. Out of Scope

- Built-in email sending or sequencing
- Automated signal detection (all signals manual-tag in MVP)
- Multi-user team workspace
- CRM sync (HubSpot, Salesforce)
- Phone number lookup
- LinkedIn scraping

---

## 5. User Flow (Aha Moment in ≤ 10 min)

1. User lands → headline: "Cold outreach dies when prospects feel random. Send fewer, better emails."
2. Clicks "Try Free" → email signup (no CC)
3. **Onboarding (2 steps, < 2 min):**
   - Step 1: Select service niche (SaaS copy / brand design / no-code / demand gen / other)
   - Step 2: Add 3 portfolio pieces and 1 testimonial snippet (used in brief generation)
4. User uploads a 10-row Apollo CSV export → prospects appear in workspace with company + role pre-filled
5. Clicks first prospect → tags timing signal "New job posting" → clicks "Generate Brief"
6. **[Aha Moment — 8 min after signup]** → Shareable URL appears: `app.com/brief/abc123` showing a clean 1-page proof page with the user's niche headline, portfolio, testimonial, and "Why I'm reaching out to [Company]" section pre-filled from the signal tag
7. Copies brief URL, pastes into outreach email draft — product value is immediately demonstrated
8. On 16th prospect import: paywall → "You've used your 15 free prospect credits. Upgrade for 100/month."

**Paywall trigger:** 16th prospect added (credit limit)

---

## 6. Functional Requirements (P0)

### Onboarding
- F1: Niche selection (5 options + "other") — sets brief template tone
- F2: Profile setup: headline (1 line), portfolio pieces (2–3 URLs with title), testimonial (text snippet)
- F3: First CSV import guided with field-mapping step (map "First Name", "Email", "Company" columns)

### Core Features
- F4: Prospect table — columns: name, company, role, email, verification status, signal tags, brief status, created_at
- F5: CSV import with column mapping; supports Apollo, Hunter, LinkedIn export formats
- F6: Email verification — on-demand check via Hunter.io API; display valid/risky/invalid badge
- F7: Timing signal tagger — dropdown with 6 preset signals; free-text note field
- F8: Brief generator — combines user profile + signal tag + company name into pre-formatted 1-page HTML brief; generates unique shareable URL
- F9: Brief view tracking — log when brief URL is opened (IP + timestamp); show "Viewed" badge in prospect table
- F10: Export — download filtered prospects as CSV with columns: name, email, brief_url, signal_tag

### Paywall & Conversion
- F11: Free tier: 15 prospect credits/month (resets monthly); credit consumed on prospect creation
- F12: On 16th prospect: modal "You've used 15/15 free prospects this month. Upgrade to add 100/month."
- F13: Stripe checkout — $29/mo; success → 100 credits/month unlocked
- F14: Post-signup email: day 1 (how to use signal tags), day 5 (brief performance tip), day 13 (credit refresh reminder)

---

## 7. Data Model

```
users
  id, email, niche, profile_headline, testimonial_text, tier (free|paid)
  monthly_prospect_credits_used, credits_reset_at, stripe_customer_id, created_at

portfolio_pieces
  id, user_id, title, url, description

prospects
  id, user_id, first_name, last_name, company, role, email
  email_verification_status (valid|risky|invalid|unchecked)
  signal_tags (jsonb array), signal_note, brief_id, created_at

briefs
  id, prospect_id, user_id, slug (unique), html_content, view_count, last_viewed_at, created_at

brief_views
  id, brief_id, viewed_at, ip_hash

subscriptions
  id, user_id, stripe_subscription_id, status, current_period_end
```

---

## 8. API / Integration Notes

- **Hunter.io Email Verifier API:** `GET /v2/email-verifier?email={email}&api_key={key}` — returns deliverability score; used on-demand (1 credit per verify)
- **Stripe:** Single plan ($29/mo) + webhook for subscription lifecycle
- **Resend:** 3-email onboarding sequence + monthly credit refresh notification
- **Brief URL hosting:** Server-rendered HTML page at `/brief/[slug]` — no external hosting needed

---

## 9. Acceptance Criteria

- [ ] CSV import of 10-row Apollo export correctly maps and creates 10 prospects
- [ ] Email verification returns valid/risky/invalid badge within 3 seconds
- [ ] Brief generator creates shareable URL within 5 seconds of clicking "Generate"
- [ ] Brief URL is publicly accessible without login
- [ ] Brief view registers in prospect table as "Viewed" within 60 seconds of opening link
- [ ] 16th prospect creation triggers paywall modal (not 15th or 17th)
- [ ] Stripe payment → tier updates → 100 credits/month unlocked
- [ ] Export CSV contains email + brief_url for all prospects with generated briefs

---

## 10. Delivery Plan

### Milestone 1 — Auth + Prospect Core (Hours 1–7)
**Files:**
- `schema.sql` — all tables
- `app/api/auth/route.ts` — email signup + session
- `app/onboarding/page.tsx` — niche + profile setup wizard
- `app/api/prospects/route.ts` — POST (with credit gate), GET (filtered)
- `app/api/prospects/import/route.ts` — CSV parse + column mapping
- `lib/credits.ts` — check and decrement monthly credits

**Exit Criteria:** CSV import of 10 rows creates 10 prospects; 16th POST returns 402 with credit-limit message

### Milestone 2 — Brief Generator + Email Verify (Hours 8–15)
**Files:**
- `app/api/briefs/route.ts` — POST (generates brief HTML + slug), GET
- `app/brief/[slug]/page.tsx` — public brief view page (SSR)
- `app/api/briefs/[slug]/view/route.ts` — POST (logs view)
- `lib/brief-template.ts` — renders HTML from user profile + signal + prospect
- `app/api/prospects/[id]/verify/route.ts` — calls Hunter.io API, updates status
- `components/SignalTagger.tsx` — dropdown with 6 preset signals

**Exit Criteria:** Brief URL renders correctly without login; view event logged; verification badge updates after verify call

### Milestone 3 — Stripe + Export + Email + Tests (Hours 16–20)
**Files:**
- `app/api/stripe/checkout/route.ts` + `webhook/route.ts`
- `app/api/prospects/export/route.ts` — generates CSV download
- `lib/email.ts` — 3-email onboarding sequence via Resend
- `app/dashboard/components/CreditMeter.tsx`
- `__tests__/credits.test.ts`, `__tests__/brief-generator.test.ts`

**Exit Criteria:** All acceptance criteria pass; export CSV downloads with correct fields; Stripe test payment upgrades tier

---

## 11. Risks & Mitigations

| Risk | Mitigation |
|------|-----------|
| Manual signal tagging feels tedious | Provide preset signal options (6 choices) with 1-click selection; free-text is optional |
| Brief URL viewed 0 times (no one clicks it) | Add copy-to-clipboard button + "Works best pasted as a PS line in your email" tip in onboarding |
| Hunter.io email verification costs | Rate-limit to 50 verifications/day for free tier; batch verify on export rather than on-demand if cost exceeds budget |
| Positioning unclear vs Apollo/Clay | Landing page headline must focus on "freelancer-specific, 10 prospects a week, not 10,000" — scale is the differentiator |

---

## 12. Chargeability Rationale

**Free tier:** 15 prospect credits/month with full brief generation — enough to run a real micro-outreach campaign and see a brief open tracked.

**Paid tier ($29/mo):** 100 credits/month + unlimited brief generation + export — enough for a consistent weekly outreach system at a fraction of Apollo + Instantly + Clay combined.

**Paywall timing:** After 15 prospects — the user has experienced the full workflow (import → verify → tag → brief → track) and wants to scale it.

**One-sentence rationale:** Users pay because stacking Apollo + Instantly costs $80–$200/mo for enterprise-scale tools; this product delivers the core freelancer workflow at $29/mo with no bloat.
