Build Your Own Newsletter Tool
Subscriber management, email sending, and basic analytics.
⚠️ 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