SendGrid Free Tier Is Gone — Migrate to MailAnvil and Save 60% for Your Indonesian Startup
July 24, 2026 · Ferry Setyawan · 6 min read Category: Migration Guide Target: Indonesian SaaS developers currently on SendGrid/Resend looking to cut email costs
SendGrid killed its free tier. The new entry point: $19.95/month. For an Indonesian startup sending 10,000 emails a month, that's Rp 330,000 — before the rupiah exchange rate eats another 3-5%.
Your options: pay it, switch to Resend, or move to something built for Indonesia. This guide covers option three.
The Real Cost of SendGrid for Indonesian Devs
Let's do the math. Indonesian SaaS startup with 2,000 users, sending:
| Email type | Volume/month |
|---|---|
| Welcome + verification | 2,000 |
| Password resets | 500 |
| Notification digests | 5,000 |
| Invoice receipts | 2,500 |
| Total | 10,000 |
At SendGrid's $19.95/mo Essentials plan (50K emails):
| Cost | |
|---|---|
| SendGrid Essentials | $19.95/mo |
| Credit card FX markup (~3%) | +$0.60 |
| IDR equivalent | ~Rp 340,000/mo |
Same volume on MailAnvil:
| Cost | |
|---|---|
| MailAnvil Startup plan (50K emails) | Rp 149,000/mo |
| Pay with GoPay/QRIS | No FX markup |
| Total | Rp 149,000/mo |
Savings: 56%. At 100K emails/month the gap widens — MailAnvil Rp 249,000 vs SendGrid ~Rp 600,000+ (savings: 59%).
Step 1: Sign Up (60 Seconds)
curl -X POST https://api.mailanvil.com/v1/signup \
-H "Content-Type: application/json" \
-d '{"email": "[email protected]", "password": "your-secure-password"}'
Response:
{
"api_key": "ma_live_01j...",
"plan": "free",
"daily_quota": 10
}
Free tier: 500 emails/month. Verify your domain to unlock 1,000/month. No credit card needed. Pay later with QRIS or GoPay when you upgrade.
Step 2: Verify Your Domain (3 Minutes)
curl -X POST https://api.mailanvil.com/v1/domains \
-H "Authorization: Bearer ma_live_xxx" \
-H "Content-Type: application/json" \
-d '{"domain": "yourstartup.id"}'
Returns DNS records. If you're on Cloudflare DNS, MailAnvil auto-detects and can verify in under 60 seconds. No manual TXT record hunting.
Step 3: Swap the API Call
Before (SendGrid — Node.js)
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
await sgMail.send({
to: '[email protected]',
from: '[email protected]',
subject: 'Welcome!',
html: '<h1>Welcome to YourStartup</h1>',
});
After (MailAnvil — drop-in replacement)
const MAILANVIL_KEY = process.env.MAILANVIL_API_KEY;
await fetch('https://api.mailanvil.com/v1/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${MAILANVIL_KEY}`,
},
body: JSON.stringify({
from: '[email protected]',
to: ['[email protected]'],
subject: 'Welcome!',
html: '<h1>Welcome to YourStartup</h1>',
}),
});
No SDK required. Standard REST API. The from, to, subject, html fields map 1:1. Response format is predictable JSON with an id and status field.
Python
# Before: SendGrid
import sendgrid
sg = sendgrid.SendGridAPIClient(os.environ['SENDGRID_API_KEY'])
sg.send({
"to": [{"email": "[email protected]"}],
"from": {"email": "[email protected]"},
"subject": "Welcome!",
"html_content": "<h1>Welcome</h1>",
})
# After: MailAnvil
import requests
requests.post("https://api.mailanvil.com/v1/send",
headers={"Authorization": f"Bearer {os.environ['MAILANVIL_API_KEY']}"},
json={
"from": "[email protected]",
"to": ["[email protected]"],
"subject": "Welcome!",
"html": "<h1>Welcome</h1>",
})
PHP (Laravel)
// Before: SendGrid
\Mail::to($user)->send(new WelcomeEmail($user));
// After: MailAnvil — swap MAIL_MAILER in .env
// MAIL_MAILER=mailanvil
// MAILANVIL_API_KEY=ma_live_xxx
Step 4: Migrate Your Templates
SendGrid dynamic templates use {{handlebars}}. MailAnvil uses simple {{variable}} syntax:
| SendGrid | MailAnvil |
|---|---|
{{user.name}} |
{{name}} |
{{order.total}} |
{{total}} |
{{#each items}} |
Not needed (pass pre-rendered HTML) |
For most transactional emails, you're already generating HTML server-side. No template migration needed — just pass the same HTML.
If you use SendGrid's template editor, export your templates as HTML and use them directly:
# Export template from SendGrid dashboard
# Paste HTML into your codebase
# Replace {{handlebars}} with your template engine's syntax
Step 5: Set Up Webhooks
SendGrid Event Webhook → MailAnvil Webhooks:
# Register webhook endpoint
curl -X POST https://api.mailanvil.com/v1/webhooks \
-H "Authorization: Bearer ma_live_xxx" \
-d '{
"url": "https://yourstartup.id/api/webhooks/email",
"events": ["delivered", "bounced", "complained", "opened", "clicked"]
}'
Event payloads follow the same pattern. Your existing webhook handler needs minimal changes:
// SendGrid: req.body[0].event === 'delivered'
// MailAnvil: req.body.event === 'delivered'
app.post('/api/webhooks/email', (req, res) => {
const { event, email_id, recipient, timestamp } = req.body;
switch (event) {
case 'delivered': /* update delivery status */
case 'bounced': /* flag for suppression */
case 'complained': /* handle spam report */
case 'opened': /* track engagement */
}
res.status(200).send('ok');
});
Why Indonesian Startups Are Switching
1. Pay with QRIS or GoPay
No credit card. No FX fees. Pay in rupiah from your BCA, Mandiri, BNI, or GoPay balance. This alone eliminates the #1 friction for Indonesian indie developers and small startups.
2. Jakarta Edge Latency
MailAnvil runs on Cloudflare Workers with edge nodes in Jakarta. API round trips: ~80ms vs ~400ms to us-east-1. For OTP emails and password resets where every second counts, this matters.
3. Bahasa Indonesia Everything
Documentation, error messages, and support in Bahasa Indonesia. kirim email not send email. Your team doesn't need to translate API docs.
4. MCP-Native for AI Agents
Claude, Cursor, Copilot — any AI coding agent with MCP support discovers MailAnvil's endpoints automatically. Your AI builds the email integration for you. First email API with native MCP server.
5. Built on Cloudflare Workers
Same infrastructure that powers 20% of the internet. No single-region outages. Automatic failover. Zero cold starts.
Migration Checklist
- [ ] Sign up at mailanvil.com (no credit card)
- [ ] Get API key from dashboard
- [ ] Verify your sending domain (Cloudflare DNS = automatic)
- [ ] Replace
@sendgrid/mailcalls withfetchto MailAnvil API - [ ] Migrate webhook endpoint URLs
- [ ] Update environment variables:
SENDGRID_API_KEY→MAILANVIL_API_KEY - [ ] Run a test batch (free tier: 10 emails/day before domain verification)
- [ ] Monitor delivery for 48 hours
- [ ] Cancel SendGrid subscription, save Rp 190,000/month
Switch today. First 500 emails free. Pay with GoPay.
mailanvil.com · docs.mailanvil.com · github.com/richaferry/mailanvil