Build Your Own Newsletter Tool

Subscriber management, email sending, and basic analytics.

Time: 3-4 hours
Stack: Next.js + Resend
Vibe Score: 6/10
⚠️ Never build your own email infrastructure. Use Resend, SendGrid, or similar for actual sending. This prompt builds the management layer only.

The Prompt

Copy this prompt into Cursor, Claude, or your AI tool:

Build me a newsletter/email marketing tool with the following specifications:

## Tech Stack
- Next.js 14 with App Router
- Prisma with PostgreSQL
- Resend for email sending
- React Email for templates
- Tailwind CSS + shadcn/ui

## Core Features

### 1. Subscriber Management
- Import subscribers from CSV
- Add individual subscribers
- Subscriber fields: email, name, status, tags, subscribedAt
- Unsubscribe handling
- Search and filter subscribers

### 2. Email Campaigns
- Create new campaign (subject, content)
- Rich text editor with formatting
- Preview email before sending
- Schedule for later or send now
- Draft saving

### 3. Email Templates
- Create reusable templates
- Template variables ({{name}}, {{unsubscribe_link}})
- Preview with sample data

### 4. Sending
- Integration with Resend API
- Batch sending (respect rate limits)
- Track send status
- Handle bounces

### 5. Analytics
- Open rate tracking (via pixel)
- Click tracking (via redirect)
- Campaign performance dashboard
- Subscriber growth chart

### 6. Compliance
- Automatic unsubscribe link
- Physical address in footer
- Double opt-in option

## Database Schema
```prisma
model Subscriber {
  id           String   @id @default(cuid())
  email        String   @unique
  name         String?
  status       String   @default("active") // active, unsubscribed, bounced
  tags         String[]
  subscribedAt DateTime @default(now())
  sends        EmailSend[]
}

model Campaign {
  id          String   @id @default(cuid())
  subject     String
  content     String
  status      String   @default("draft") // draft, scheduled, sending, sent
  scheduledAt DateTime?
  sentAt      DateTime?
  sends       EmailSend[]
  createdAt   DateTime @default(now())
}

model EmailSend {
  id           String     @id @default(cuid())
  campaignId   String
  campaign     Campaign   @relation(fields: [campaignId], references: [id])
  subscriberId String
  subscriber   Subscriber @relation(fields: [subscriberId], references: [id])
  status       String     @default("pending")
  openedAt     DateTime?
  clickedAt    DateTime?
  sentAt       DateTime?
}
```

## Important: Use Resend for sending
```typescript
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);

// Send in batches to respect rate limits
```

Please generate all files for a working newsletter tool.

What You'll Get

✅ Included

  • Subscriber management
  • Campaign creation
  • Rich text editor
  • Open/click tracking
  • CSV import
  • Templates

❌ Not Included

  • Deliverability optimization
  • Advanced automation
  • A/B testing
  • Advanced segmentation
  • Drag-drop builder
  • SMS

← Back to all prompts