Skip to content

Migrating from Formspree

Migrate from Formspree to mailiam for better performance, custom domains, reply-enabled emails, and infrastructure-as-code management.

FeatureFormspreemailiam
Custom Domain FormsPaid plans only✅ Free
Reply Support❌ No✅ Yes
Config as Code❌ No✅ Yes
CLI Tool❌ No✅ Yes
Email Forwarding❌ No✅ Yes
Sub-100ms Speed❌ No✅ Yes
Collections/Organization❌ No✅ Yes
Git Workflow❌ No✅ Yes
  • Formspree: $8-19/month for basic custom domain features
  • mailiam: Free tier includes custom domains, replies, and full CLI
  1. Set up mailiam alongside existing Formspree forms
  2. Test thoroughly with new endpoints
  3. Gradually migrate forms one by one
  4. Monitor performance and deliverability
  1. Update all form endpoints to mailiam
  2. Configure domain-based infrastructure
  3. Enable advanced features (replies, collections)
  4. Decommission Formspree account
Terminal window
npm install -g mailiam
mailiam login

Document your current Formspree forms:

Terminal window
# List your current forms
# In Formspree dashboard, note:
# - Form endpoints
# - Notification emails
# - Redirect URLs
# - Any custom configuration
Terminal window
# Initialize with your domain
mailiam init yoursite.com
cd yoursite.com

Map your Formspree forms to mailiam configuration:

mailiam.config.yaml
domains:
yoursite.com:
# Enable email forwarding
forwarding:
"*@yoursite.com": "your-email@gmail.com"
"contact@yoursite.com": "contact@gmail.com"
"support@yoursite.com": "support@gmail.com"
forms:
# Map Formspree contact form
contact:
template: "professional"
replies: true # Better than Formspree
replyTo: "contact@yoursite.com"
acknowledgment: true # Auto-reply to users
# Map Formspree newsletter form
newsletter:
template: "marketing"
replyTo: "newsletter@yoursite.com"
settings:
customMessage: "Thanks for subscribing!"
# Map Formspree support form
support:
template: "technical"
replies: true
replyTo: "support@yoursite.com"
settings:
priority: "high"
Terminal window
# Deploy your configuration
mailiam push
# Verify setup
mailiam status
mailiam domains verify yoursite.com

Step 6: Update Form HTML (Parallel Testing)

Section titled “Step 6: Update Form HTML (Parallel Testing)”

Create test versions of your forms with mailiam endpoints:

<!-- Before: Formspree endpoint -->
<form action="https://formspree.io/f/xdoylzoo" method="POST">
<input type="email" name="email" required>
<textarea name="message" required></textarea>
<button type="submit">Send</button>
</form>
<!-- After: mailiam domain-based endpoint -->
<form action="https://api.mailiam.dev/v1/yoursite.com/send?form=contact" method="POST">
<input type="email" name="email" required>
<textarea name="message" required></textarea>
<button type="submit">Send</button>
</form>
Terminal window
# Test form submissions
mailiam forms test contact --data '{"email":"test@test.com","message":"Test message"}'
# Test email forwarding
mailiam domains test yoursite.com contact@yoursite.com
# Check deliverability
mailiam domains check-auth yoursite.com

Migrate forms one at a time:

  1. Start with low-traffic forms (like newsletter signup)
  2. Monitor for 24-48 hours
  3. Migrate medium-traffic forms (support, feedback)
  4. Finally migrate high-traffic forms (main contact form)

Once basic migration is complete, enable mailiam’s advanced features:

domains:
yoursite.com:
forms:
contact:
# Enable replies (Formspree doesn't have this)
replies: true
replyTo: "contact@yoursite.com"
# Automatic acknowledgments
acknowledgment: true
acknowledgment:
template: "contact-ack"
delay: 0
# Advanced spam protection
security:
spamProtection: "strict"
honeypotField: "_mailiam_trap"
contentFiltering: true

Formspree:

<form action="https://formspree.io/f/xdoylzoo" method="POST">
<input type="hidden" name="_subject" value="New Contact">
<input type="hidden" name="_next" value="/thank-you.html">
<input type="email" name="email" required>
<textarea name="message" required></textarea>
<button type="submit">Send</button>
</form>

mailiam:

<form action="https://api.mailiam.dev/v1/yoursite.com/send?form=contact" method="POST">
<!-- mailiam handles subjects and redirects via configuration -->
<input type="email" name="email" required>
<textarea name="message" required></textarea>
<button type="submit">Send</button>
</form>
# Configuration in mailiam.config.yaml
forms:
contact:
subject: "New Contact"
redirectUrl: "/thank-you.html"
template: "professional"

Formspree:

fetch('https://formspree.io/f/xdoylzoo', {
method: 'POST',
body: formData,
headers: {
'Accept': 'application/json'
}
});

mailiam:

fetch('https://api.mailiam.dev/v1/yoursite.com/send?form=contact', {
method: 'POST',
body: formData,
headers: {
'Accept': 'application/json'
}
});

Formspree:

<form action="https://formspree.io/f/xdoylzoo" method="POST" enctype="multipart/form-data">
<input type="file" name="upload">
<button type="submit">Upload</button>
</form>

mailiam:

<form action="https://api.mailiam.dev/v1/yoursite.com/send?form=contact" method="POST" enctype="multipart/form-data">
<input type="file" name="attachment">
<button type="submit">Upload</button>
</form>
# Enable file uploads in configuration
forms:
contact:
fileUploads:
enabled: true
maxSize: "10MB"
allowedTypes: ["pdf", "doc", "jpg", "png"]

If you have multiple Formspree forms, use mailiam collections:

Terminal window
# Create a collection for better organization
mailiam collections create "website" "Website Forms"
# Add forms to collection
mailiam collections add-form "website" "contact" "Contact Form"
mailiam collections add-form "website" "newsletter" "Newsletter Signup"
mailiam collections add-form "website" "support" "Support Request"

This creates clean URLs:

  • https://api.mailiam.dev/f/website/contact
  • https://api.mailiam.dev/f/website/newsletter
  • https://api.mailiam.dev/f/website/support

Formspree Webhook:

{
"_replyto": "user@example.com",
"email": "user@example.com",
"message": "Hello world",
"_subject": "Contact form"
}

mailiam Webhook:

# Configure webhooks in mailiam
forms:
contact:
webhooks:
- url: "https://yourapp.com/webhook"
method: "POST"
headers:
Authorization: "Bearer {{ env.WEBHOOK_TOKEN }}"
events: ["submission"]

mailiam’s spam protection is more advanced than Formspree:

forms:
contact:
security:
# Much more sophisticated than Formspree
spamProtection: "strict"
honeypotField: "_mailiam_trap"
contentFiltering: true
maxLinksAllowed: 2
blockedDomains:
- "tempmail.org"
- "10minutemail.com"
customRules:
- pattern: "buy now|act fast"
action: "quarantine"
Terminal window
# Test each migrated form
mailiam forms test contact --data test-contact.json
mailiam forms test newsletter --data test-newsletter.json
# Test with realistic data
echo '{"email":"john@example.com","name":"John Doe","message":"Testing migration from Formspree"}' > test-contact.json
mailiam forms test contact --data-file test-contact.json
Terminal window
# Test email forwarding
mailiam domains test yoursite.com contact@yoursite.com
# Check spam score
mailiam domains check-deliverability yoursite.com
# Test reply functionality
mailiam forms test-reply contact test@example.com
Terminal window
# Check mailiam response times
mailiam metrics performance --last 24h
# Compare with Formspree (you'll see significant improvement)
# mailiam typically responds in 50-100ms vs Formspree's 200-500ms

One of mailiam’s best features that Formspree lacks:

domains:
yoursite.com:
forms:
contact:
replies: true
replyTo: "contact@yoursite.com"
acknowledgment: true
acknowledgment:
template: "contact-acknowledgment"
# Set up email forwarding for replies
forwarding:
"contact@yoursite.com": "your-personal-email@gmail.com"
domains:
yoursite.com:
templates:
contact-acknowledgment:
subject: "Thanks for contacting {{ company.name }}!"
html: |
<div style="font-family: Arial, sans-serif;">
<h2>Hi {{ form.name }},</h2>
<p>Thanks for reaching out! We received your message:</p>
<blockquote>{{ form.message }}</blockquote>
<p>We'll get back to you within 24 hours.</p>
<p>You can reply directly to this email if you have any questions.</p>
<p>Best regards,<br>The {{ company.name }} Team</p>
</div>
Terminal window
# Monitor form performance
mailiam analytics forms --last 30d
# Check spam detection accuracy
mailiam analytics spam --accuracy
# Review response times
mailiam metrics response-time --all-forms

If you need to rollback during migration:

  1. Keep Formspree active during parallel testing phase
  2. Document all changes made to form HTML
  3. Have backup of original code in version control
  4. Test rollback procedure in staging environment
Terminal window
# Quick rollback steps
# 1. Revert form HTML to original Formspree endpoints
# 2. Update DNS if you changed MX records
# 3. Notify team of rollback
  • Document all existing Formspree forms
  • Install and configure mailiam CLI
  • Set up domain in mailiam
  • Configure equivalent forms in mailiam.config.yaml
  • Test mailiam forms in staging environment
  • Deploy mailiam configuration
  • Update form HTML with mailiam endpoints
  • Test all forms thoroughly
  • Monitor email deliverability
  • Check spam folder rates
  • Enable advanced features (replies, collections)
  • Set up professional email templates
  • Configure monitoring and alerts
  • Update documentation for team
  • Cancel Formspree subscription
  • Celebrate improved performance! 🎉
Terminal window
# Check domain verification
mailiam domains verify yoursite.com
# Test form endpoint
mailiam forms test contact --verbose
# Check CORS configuration
mailiam domains update yoursite.com --cors-origins "https://yoursite.com"
Terminal window
# Check email forwarding setup
mailiam domains test yoursite.com contact@yoursite.com
# Verify SPF/DKIM records
mailiam domains check-auth yoursite.com
# Check spam folders and add to whitelist
Terminal window
# Check response times
mailiam metrics performance --last 1h
# Enable caching
mailiam forms update contact --caching true
# Optimize configuration
mailiam optimize analyze

Migrating from Formspree to mailiam gives you better performance, more features, and professional email infrastructure that scales with your business.