This comprehensive guide will walk you through every feature of SendJoy, from initial setup to sending your first email campaign.
- Getting Started
- Setting Up Your Account
- Managing Contacts
- Working with Templates
- Using the Visual Editor
- Sending Emails
- Troubleshooting
- FAQ
You can access SendJoy in two ways:
Option A: Use the Live Version (Recommended)
Simply visit: https://sendjoy.chanmeng-dev.workers.dev/
No installation or download required!
Option B: Run Locally
If you prefer to run the platform on your own computer:
git clone https://github.com/ChanMeng666/send-joy.git
cd send-joy
npm install
npm run devThen open http://localhost:3000 in your browser.
When you first visit SendJoy, you'll see a Welcome Modal that guides you through the platform:
flowchart LR
WELCOME[Welcome Modal] --> SKIP[Skip Tour]
WELCOME --> START[Start Tour]
START --> PROGRESS[Setup Progress]
PROGRESS --> SETTINGS[Configure Settings]
SETTINGS --> CONTACTS[Add Contacts]
CONTACTS --> TEMPLATES[Create Template]
TEMPLATES --> SEND[Send First Email]
style WELCOME fill:#DC2626,color:#fff
style SEND fill:#16A34A,color:#fff
The Dashboard provides quick access to all main features:
graph TD
subgraph "Dashboard Layout"
SIDEBAR[Side Navigation] --> HOME[Home]
SIDEBAR --> TEMPLATES[Templates]
SIDEBAR --> CONTACTS[Contacts]
SIDEBAR --> SEND[Send]
SIDEBAR --> SETTINGS[Settings]
end
subgraph "Dashboard Content"
QUICK[Quick Actions] --> T1[Templates]
QUICK --> T2[Contacts]
QUICK --> T3[Send Email]
QUICK --> T4[Settings]
end
subgraph "Additional Features"
PROGRESS[Setup Progress Tracker]
HELP[Help Button]
BADGE[Developer Badge]
end
style SIDEBAR fill:#1a1a2e,color:#fff
style HOME fill:#DC2626,color:#fff
style TEMPLATES fill:#16A34A,color:#fff
style CONTACTS fill:#F59E0B,color:#fff
style SEND fill:#7C3AED,color:#fff
style SETTINGS fill:#3B82F6,color:#fff
Navigation Sidebar (left side):
- Home - Dashboard overview with quick actions and setup progress
- Templates - Browse, create, and edit email templates
- Contacts - Manage your recipients
- Send - 5-step email sending wizard
- Settings - Configure API keys and sender info
Additional Features:
- Help Button - Context-aware help modal with documentation
- Setup Progress - Visual checklist tracking your configuration status
- Developer Badge - Information about the platform author
Before you can send emails, you need to configure your Resend API settings.
flowchart LR
A[Visit resend.com] --> B[Sign Up]
B --> C[Verify Email]
C --> D[Go to API Keys]
D --> E[Create New Key]
E --> F[Copy Key]
style A fill:#FEF3C7
style B fill:#DCFCE7
style C fill:#DBEAFE
style D fill:#FEE2E2
style E fill:#F3E8FF
style F fill:#D1FAE5
Step-by-step instructions:
- Visit Resend: Go to resend.com
- Create an Account: Click "Sign Up" and register with your email
- Verify Your Email: Check your inbox and click the verification link
- Navigate to API Keys: Go to resend.com/api-keys
- Create a New Key:
- Click "Create API Key"
- Give it a name (e.g., "SendJoy Platform")
- Select "Full access" for permissions
- Click "Create"
- Copy Your Key: Your API key will look like
re_xxxxxxxxxx
Important: Save your API key securely. It will only be shown once!
To send emails from your own domain (e.g., hello@yourdomain.com):
- Go to resend.com/domains
- Click "Add Domain"
- Enter your domain name
- Add the DNS records provided by Resend:
| Type | Name | Value |
|---|---|---|
| TXT | resend._domainkey |
(provided by Resend) |
| TXT | @ or _resend |
(provided by Resend) |
- Wait 5-30 minutes for DNS propagation
- Click "Verify" in Resend Dashboard
Tip: If you don't have a domain, you can use
onboarding@resend.devfor testing (only sends to your own email).
- Click Settings in the sidebar
- Fill in the following fields:
| Field | Description | Example |
|---|---|---|
| Resend API Key | Your API key from Step 2.1 | re_AbCdEf123456... |
| Sender Email | Your verified sender address | hello@yourdomain.com |
| Sender Name | Display name for recipients | John Smith |
| Audience ID (optional) | For syncing contacts from Resend Audiences | dc18b68d-cd0a-4c17-baf5-8de8edbf50fa |
How to find your Audience ID:
- Go to resend.com/audiences
- Click on the audience you want to use
- Copy the ID from the URL or the details panel
- Click Save Settings
sequenceDiagram
participant User
participant Settings Page
participant LocalStorage
User->>Settings Page: Enter API Key
User->>Settings Page: Enter Sender Info
User->>Settings Page: Click Save
Settings Page->>LocalStorage: Store Settings
Settings Page-->>User: Show Success Message
The Dashboard shows your setup progress with a visual checklist:
- Configure API Key - Add your Resend API key
- Set Sender Email - Configure your sender address
- Add Contacts - Add at least one recipient
- Create Template - Customize or create a template
- Send First Email - Successfully send your first email
Each step shows a checkmark when completed, helping you track your configuration status.
The Contacts page lets you manage all your email recipients with full CRUD capabilities.
- Go to Contacts in the sidebar
- Click the Add Contact button
- Fill in the contact information:
- Email (required)
- First Name (optional)
- Last Name (optional)
- Click Add Contact
flowchart LR
A[Open Contacts] --> B[Click Add Contact]
B --> C[Enter Email]
C --> D[Enter Name]
D --> E[Click Add]
E --> F[Contact Saved]
style A fill:#FEF3C7
style F fill:#D1FAE5
- Find the contact in the list
- Click the Edit icon (pencil) on the right
- A modal dialog will appear with the contact's current information
- Modify the email, first name, or last name
- Click Save Changes
- Find the contact in the list
- Click the Delete icon (trash) on the right
- Confirm the deletion in the dialog
- The contact will be removed
Use the search bar at the top to filter contacts by:
- Email address
- First name
- Last name
The list updates in real-time as you type.
Bulk import contacts from a spreadsheet file:
- Click the Import CSV button
- Select a CSV file from your computer
- The system will automatically detect columns:
- email - Required column
- firstName, first_name, or name - Optional
- lastName, last_name, or surname - Optional
- New contacts are added (duplicates are skipped)
- A success message shows how many were imported
Expected CSV format:
email,firstName,lastName
john@example.com,John,Doe
jane@example.com,Jane,Smith
bob@company.com,Bob,JohnsonNotes:
- The first row must be headers
- Quoted values are supported
- Invalid emails are skipped
- Existing emails are not duplicated
If you have an Audience ID configured in Settings:
- Click the Sync from Resend button
- The platform fetches contacts from your Resend Audience
- New contacts are merged with your existing list
- A success message shows how many were imported
sequenceDiagram
participant Platform
participant Resend API
Platform->>Resend API: GET /audiences/{id}/contacts
Resend API-->>Platform: Contact List
Platform->>Platform: Merge with Local Storage
Platform-->>User: Show Updated List
The Templates page displays all available email templates with filtering and management capabilities.
Templates are organized into four categories:
graph TB
subgraph "Holiday Templates"
XMAS[Classic Christmas]
NY[New Year 2025]
CNY[Chinese New Year]
BDAY[Birthday Wishes]
end
subgraph "Marketing Templates"
LAUNCH[Product Launch]
end
subgraph "Newsletter Templates"
WEEKLY[Weekly Newsletter]
end
subgraph "Custom Templates"
USER[Your Templates]
end
style XMAS fill:#DC2626,color:#fff
style NY fill:#7C3AED,color:#fff
style CNY fill:#EF4444,color:#fff
style BDAY fill:#EC4899,color:#fff
style LAUNCH fill:#F59E0B,color:#fff
style WEEKLY fill:#16A34A,color:#fff
style USER fill:#3B82F6,color:#fff
- Go to Templates in the sidebar
- Use the filter tabs to narrow down:
- All - Show all templates (preset + custom)
- Holiday - Greeting cards and celebrations
- Marketing - Promotional emails
- Newsletter - Regular updates
- Custom - Your created/copied templates
- The count badge shows how many templates match each filter
- Hover over a template card to see action buttons
- Click the Create Template button (top right)
- A new blank template is created with:
- Default header block
- Text block with placeholder
- Footer block
- You're automatically redirected to the visual editor
- Customize the template to your needs
- Click Save to keep your changes
Duplicate any template (preset or custom) to create your own version:
- Hover over the template card
- Click the Copy icon
- A new template is created with "(Copy)" suffix
- The copy appears in your template list
- Edit the copy without affecting the original
Only custom templates can be deleted (presets are permanent):
- Hover over the custom template card
- Click the Delete icon (trash)
- Confirm the deletion
- The template is permanently removed
SendJoy integrates with Resend's template system:
- Click Resend Templates tab in the Templates page
- View all templates stored in your Resend account
- Use them directly in the Send wizard
- Supports Resend's variable syntax:
{{{VARIABLE_NAME}}}
The Visual Editor is the heart of the platform, allowing you to customize email templates with drag-and-drop functionality.
graph LR
subgraph "Editor Interface"
LEFT[Block Palette<br/>Add & reorder blocks]
CENTER[Canvas<br/>Visual preview]
RIGHT[Properties Panel<br/>Edit selected item]
end
LEFT --> CENTER
CENTER --> RIGHT
style LEFT fill:#F3F4F6
style CENTER fill:#FFFFFF
style RIGHT fill:#F3F4F6
The editor has three main panels:
| Panel | Location | Purpose |
|---|---|---|
| Block Palette | Left | Add new blocks, drag to reorder |
| Canvas | Center | Visual preview of your email |
| Properties Panel | Right | Edit selected block or theme |
The toolbar at the top provides:
| Button | Function |
|---|---|
| Back Arrow | Return to Templates page |
| Template Name | Click to rename your template |
| Subject Line | Edit the email subject |
| Undo | Undo last change (up to 50 steps) |
| Redo | Redo undone change |
| Desktop | Preview at 600px width |
| Mobile | Preview at 375px width |
| Preview | Open full email preview modal |
| Save | Save template to browser storage |
| Block | Description | Properties |
|---|---|---|
| Header | Title and subtitle section | title, subtitle, showIcons, icons |
| Text | Paragraph or content | content, alignment, highlightBox |
| Image | Photo or graphic | src (URL), alt, caption, borderStyle, shadowColor |
| Button | Call-to-action link | text, url, style (primary/secondary/outline) |
| Wishes List | Bulleted list with icons | title, items (icon + text) |
| Divider | Horizontal separator | style (line/icons/spacer), height |
| Footer | Sender signature | senderName, senderLabel, showLinkedIn, linkedInUrl, closingMessage |
SendJoy uses @dnd-kit for intuitive drag-and-drop:
- In the left panel, find the block you want to move
- Click and hold the drag handle (grip icon)
- Drag the block to its new position
- Release to drop
- The canvas updates immediately
flowchart LR
A[Click Drag Handle] --> B[Drag Block]
B --> C[See Drop Indicator]
C --> D[Release to Drop]
D --> E[Canvas Updates]
style A fill:#FEF3C7
style E fill:#D1FAE5
- In the left panel, find the block type you want under "Add Blocks"
- Click the block row (or the + icon)
- The block is added to the bottom of your email
- The block is automatically selected for editing
- Click on any block in the canvas
- The block will be highlighted with a colored border
- The Properties Panel (right) shows editing options
- Make your changes - they appear immediately in the canvas
Example: Editing a Header Block
| Property | Description |
|---|---|
| Subtitle | Small text above the title |
| Title | Main heading text |
| Show Icons | Toggle decorative icons |
Example: Editing a Footer Block
| Property | Description |
|---|---|
| Closing Message | Farewell text (e.g., "Best wishes") |
| Sender Label | Role or title (e.g., "From") |
| Sender Name | Your name |
| Show LinkedIn | Toggle LinkedIn link |
| LinkedIn URL | Your LinkedIn profile URL |
Control which blocks appear in the final email:
- Click the eye icon on any block in the list
- Hidden blocks show a crossed-out eye
- Hidden blocks are not rendered in the final email
- Useful for preparing alternative content
In the left panel's "Blocks in Template" section:
- Click a block to select it
- Drag the handle to reorder
- Eye icon toggles visibility
- Trash icon removes the block
- Find the block in the left panel's block list
- Click the trash icon next to it
- The block is immediately removed
- Use Undo if you made a mistake
The editor maintains a history of up to 50 changes:
- Undo button or keyboard shortcut - Go back one step
- Redo button or keyboard shortcut - Go forward one step
- History is preserved until you leave the page
When no block is selected, the Properties Panel shows theme options:
| Property | Description |
|---|---|
| Primary Color | Headers, accents (default: red) |
| Primary Color Dark | Dark variant for borders/shadows |
| Primary Color Light | Light variant for backgrounds |
| Secondary Color | Buttons, footers (default: green) |
| Secondary Color Dark | Dark variant |
| Secondary Color Light | Light variant |
| Accent Color | Highlights (default: gold) |
| Accent Color Light | Light variant |
| Background Color | Email body background |
| Surface Color | Content area background |
| Text Color | Body text color |
| Border Color | Neobrutalism borders |
| Border Width | Border thickness (1-10px) |
| Shadow Offset | Hard shadow distance (0-20px) |
Each color has:
- A color picker (click the square)
- A hex input (type exact value)
You can personalize emails using variables that get replaced when sending:
| Variable | Description | Example Output |
|---|---|---|
{{recipientName}} |
Recipient's first name | "John" |
{{senderName}} |
Your configured name | "Jane Smith" |
{{currentYear}} |
Current year | "2025" |
{{nextYear}} |
Next year | "2026" |
Syntax Support:
- Local preview syntax:
{{variableName}}(camelCase) - Resend template syntax:
{{{VARIABLE_NAME}}}(UPPER_SNAKE_CASE)
Example usage in text:
Dear {{recipientName}},
Wishing you a wonderful {{nextYear}}!
Best regards,
{{senderName}}
Canvas Preview:
- Use the Desktop/Mobile toggle in the toolbar
- Desktop shows 600px width
- Mobile shows 375px width
Full Preview:
- Click the Preview button in the toolbar
- A modal opens with the rendered email
- Shows exactly what recipients will see
- Variables are replaced with sample values
- Click X or outside to close
- Click the Save button in the toolbar
- The button shows "Saving..." briefly
- Then shows "Saved!" with a checkmark
- Your template is saved to browser localStorage
- It will be available next time you visit
The Send page provides a 5-step wizard to guide you through sending emails.
flowchart LR
S1["1. Select<br/>Template"] --> S2["2. Choose<br/>Recipients"]
S2 --> S3["3. Customize<br/>Variables"]
S3 --> S4["4. Preview<br/>Email"]
S4 --> S5["5. Send &<br/>Track"]
style S1 fill:#DC2626,color:#fff
style S2 fill:#16A34A,color:#fff
style S3 fill:#F59E0B,color:#fff
style S4 fill:#7C3AED,color:#fff
style S5 fill:#3B82F6,color:#fff
- Go to Send in the sidebar
- Choose template source:
- Local Templates - Presets and your custom templates
- Resend Templates - Templates from your Resend account
- Click on the template you want to use
- The selected template shows a highlight
- Click Next
- View your contact list (loaded from Contacts page)
- Click on contacts to select/deselect them
- Use Select All to choose everyone
- Use Deselect All to clear selection
- The count shows "X of Y contacts selected"
- Click Next
Tip: If no contacts appear, go to the Contacts page first and add some!
- Enter the email subject line
- The subject is pre-filled from the template's default
- Modify the subject as needed
- You can use variables like
{{recipientName}} - Example: "Happy Holidays, {{recipientName}}!"
- Click Next
- See the actual rendered email
- A contact selector lets you preview for different recipients
- The subject line shows with variables replaced
- Verify everything looks correct
- Click Next to proceed to sending
Before Sending:
- Verify your settings are configured (API Key, Sender Email)
- Review the summary: From, Subject, Recipients
- A warning appears if settings are missing
Sending Process:
- Click the Send X Emails button
- A progress bar shows sending status
- Each email is sent individually with personalization
- A delay between emails prevents rate limiting
sequenceDiagram
participant User
participant Platform
participant API
participant Resend
User->>Platform: Click Send
loop For Each Recipient
Platform->>API: POST /api/preview (personalized)
API-->>Platform: HTML
Platform->>API: POST /api/send
API->>Resend: Send Email
Resend-->>API: Success/Error
API-->>Platform: Response
Platform->>Platform: Update Progress
end
Platform-->>User: Show Results
After sending completes:
Success View:
- Green checkmark icon
- "All Emails Sent!" message
- Count of successfully sent emails
Partial Success View:
- Yellow warning icon
- "Sending Complete" message
- Counts for success and failure
Results List: Each recipient shows:
- Green checkmark - Successfully sent
- Red X - Failed (with error message)
Common Errors:
- "Invalid API key" - Check your Settings
- "Domain not verified" - Verify in Resend dashboard
- "Rate limit exceeded" - Wait and try again
After Sending:
- Click Back to Dashboard to return home
- Check Resend dashboard for delivery status
Problem: You haven't configured your Resend API key.
Solution:
- Go to Settings
- Enter your Resend API key
- Click Save
Problem: Your API key is incorrect or expired.
Solution:
- Go to resend.com/api-keys
- Create a new API key
- Update it in Settings
Problem: Your sender email domain isn't verified in Resend.
Solution:
- Go to resend.com/domains
- Verify your domain with DNS records
- Or use
onboarding@resend.devfor testing
Problem: You haven't added any contacts yet.
Solution:
- Go to Contacts page
- Add contacts manually, import CSV, or sync from Resend
- Return to Send wizard
Problem: Email may be in spam or delayed.
Solutions:
- Check recipient's spam/junk folder
- Verify the email address is correct
- Wait a few minutes (emails can be delayed)
- Check Resend Dashboard for delivery status
Problem: Template has invalid data.
Solution:
- Go to the Editor and check all blocks
- Ensure image URLs are valid HTTPS links
- Save the template and try again
Problem: Your browser may be clearing localStorage.
Solutions:
- Disable "Clear data on close" in browser settings
- Don't use Incognito/Private mode
- Allow site data for this website
Solutions:
- Clear browser cache
- Try a different browser (Chrome, Firefox, Edge)
- Disable ad blockers
- Check internet connection
Solutions:
- Close other browser tabs
- Clear browser cache
- Use a modern browser version
Q: Is this platform free to use?
A: Yes, SendJoy is completely free. However, you need a Resend account for sending emails. Resend offers a free tier with 3,000 emails/month.
Q: Do I need to install anything?
A: No! Just visit the website and start using it. No downloads or installations required.
Q: Where is my data stored?
A: All your data (settings, contacts, templates) is stored in your browser's localStorage. It's never uploaded to any server except when sending emails.
Q: Is my API key secure?
A: Your API key is stored only in your browser and sent directly to Resend when needed. It's never stored on our servers.
Q: Can multiple people use the same account?
A: The platform uses browser storage, so each browser/device has its own data. For team use, each person needs their own Resend API key.
Q: Can I create my own templates from scratch?
A: Yes! Click "Create Template" on the Templates page to start with a basic template, then customize it in the editor.
Q: Can I import HTML templates?
A: Currently, the platform uses a block-based system. Direct HTML import is not supported, but you can recreate templates using blocks.
Q: Can I use Resend cloud templates?
A: Yes! SendJoy integrates with Resend's template system. Access them from the "Resend Templates" tab in the Templates page or during the Send wizard.
Q: Why do my images not show?
A: Images must be hosted on a public HTTPS URL. Use services like:
- Imgur
- Cloudinary
- AWS S3
- Your own website
Q: How do I change the template colors?
A: In the editor, click anywhere outside the blocks to deselect them. The Properties Panel will show theme settings including color pickers.
Q: How do I reorder blocks?
A: Use drag-and-drop! Click and hold the drag handle (grip icon) next to any block in the left panel, then drag it to the new position.
Q: What CSV format is supported?
A: The CSV must have a header row with an "email" column. Columns for "firstName" and "lastName" are optional. Standard CSV format with commas is supported.
Q: Can I export my contacts?
A: Currently, contacts are stored in browser localStorage. You can sync with Resend Audiences to back them up in your Resend account.
Q: How do I delete all contacts?
A: Delete contacts one by one using the trash icon. For a complete reset, clear your browser's localStorage for this site.
Q: Is there a limit on how many emails I can send?
A: The platform itself has no limit. Your limit depends on your Resend plan:
- Free: 3,000 emails/month, 100/day
- Pro: 50,000 emails/month
- Enterprise: Unlimited
Q: Can I schedule emails?
A: This feature is not available yet. Currently, emails are sent immediately.
Q: Can I track email opens and clicks?
A: Tracking is available through your Resend Dashboard at resend.com/emails.
Q: What happens if sending fails?
A: The wizard shows which emails succeeded and failed. Failed emails show the error reason. You can try sending again.
Q: What variable syntax should I use?
A: For local templates, use {{variableName}} (camelCase). For Resend cloud templates, use {{{VARIABLE_NAME}}} (UPPER_SNAKE_CASE).
Q: What browsers are supported?
A: Modern browsers including:
- Chrome 90+
- Firefox 88+
- Safari 14+
- Edge 90+
Q: Can I use this on mobile?
A: The platform is optimized for desktop and tablet. Mobile editing is limited but possible for basic operations.
Q: Can I self-host this platform?
A: Yes! Clone the GitHub repository and deploy to Vercel or any Node.js hosting platform. See the README for instructions.
- Help Button: Click the "?" button in the app for context-aware help
- GitHub Issues: Report bugs or request features
- Resend Documentation: resend.com/docs
- Author: Chan Meng
Last updated: December 2024