Compose Email
Live Email Preview
Sent Mail Log
| Status | Recipient | Subject | Date/Time | Actions |
|---|---|---|---|---|
|
No emails have been sent yet. Head over to the Composer to send your first email. |
||||
Resend API Configuration
To send emails, you need a Resend API Key. You can configure this key locally in your environment or enter it below to save it in your browser storage.
re_ and is stored only on your machine.
Google Sheets Logging
Save and read your sent email logs automatically using a shared Google Sheet. Enter your Google Apps Script Web App URL below.
How to setup your Google Sheet (Step-by-Step)
- Create a new **Google Sheet**.
- Go to **Extensions** -> **Apps Script**.
- Delete any existing code and paste the script below.
- Click **Deploy** (top right) -> **New deployment**.
- Select type: **Web app**.
- Configure:
- Execute as: **Me**
- Who has access: **Anyone** (Required for browser reads/writes)
- Click **Deploy**, authorize permissions, and copy the **Web app URL**.
- Paste the URL into the input field above and click **Save**.
Copy this Apps Script Code:
// Handles Reading logs (GET)
function doGet(e) {
try {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var rows = sheet.getDataRange().getValues();
if (rows.length <= 1) {
return ContentService.createTextOutput(JSON.stringify([]))
.setMimeType(ContentService.MimeType.JSON);
}
var logList = [];
for (var i = 1; i < rows.length; i++) {
var row = rows[i];
logList.push({
date: row[0],
to: row[1],
subject: row[2],
status: row[3],
id: row[4],
error: row[5] || "",
body: row[6] || "" // Added 7th column read (Email Body)
});
}
logList.reverse(); // Newest first
return ContentService.createTextOutput(JSON.stringify(logList))
.setMimeType(ContentService.MimeType.JSON);
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({ success: false, error: error.message }))
.setMimeType(ContentService.MimeType.JSON);
}
}
// Handles Writing logs (POST)
function doPost(e) {
try {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data = JSON.parse(e.postData.contents);
if (sheet.getLastRow() === 0) {
sheet.appendRow(["Timestamp", "Recipient (To)", "Subject", "Status", "Resend ID", "Error Detail", "Email Body"]);
}
sheet.appendRow([
new Date().toLocaleString(),
data.to,
data.subject,
data.status,
data.id,
data.error || "",
data.body || "" // Added 7th column write (Email Body)
]);
return ContentService.createTextOutput(JSON.stringify({ success: true }))
.setMimeType(ContentService.MimeType.JSON);
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({ success: false, error: error.message }))
.setMimeType(ContentService.MimeType.JSON);
}
}
Sandbox & Delivery Optimization
Using the Free Resend Plan?
By default, Resend places new accounts in a Sandbox environment:
- Sender Address: Must be
onboarding@resend.dev(or a custom verified domain). - Recipient: Can only be the email address you registered your Resend account with.
- Custom Domains: To send to any recipient or use custom email domains (e.g.
hello@yourdomain.com), verify your domain in the Resend dashboard.
Landing in Primary Inbox
Gmail automatically sorts marketing and bulk emails into the **Promotions** tab. To optimize deliverability to the **Primary Inbox**:
- Custom Domain: Set up a custom domain. Google filters the default
onboarding@resend.devaggressively. - Gmail-style Draft: Use our **Custom Draft** editor to send plain-looking emails instead of heavy HTML newsletters with lots of banners/links.