SendGrid Inbound Parse alternative

A SendGrid Inbound Parse Alternative

SendGrid's Inbound Parse posts your email as multipart form data and retries failed deliveries for 72 hours before dropping them, with no notification in the dashboard. CloudMailin delivers each message as clean JSON and records every delivery attempt in a history you can search.

Setup is an address and a webhook Run both side by side while you test Keep the raw message if you need it
cloudmailin.com/messages
from:acme.com invoice
Time Message Status
09:41 support@acme.com Re: March invoice 200 OK
09:38 alerts@statuspage.io Incident resolved 200 OK
09:31 jenny@customer.co Fwd: signed contract 504 · retrying
attempt 1 · 09:31 · 504 Gateway Timeout
attempt 2 · 09:36 · 200 OK
09:24 billing@acme.com Receipt #8841 200 OK

The difference that matters

Know when delivery fails, and search everything you receive

If your endpoint returns an error, SendGrid retries for 72 hours and then drops the message. Their documentation notes that there is no dashboard notification for failed posts. Messages received through Inbound Parse also never appear in SendGrid's Email Activity feed, so there is no record to check afterwards.

CloudMailin records every delivery attempt along with the HTTP status your server returned, and keeps every message in a searchable history. A failing endpoint shows up in your dashboard rather than as missing data, and you can answer "did we receive it?" without digging through your own logs.

Fwd: signed contract

jenny@customer.co · today 09:31

delivered

Delivery attempts

attempt 1 · 09:31:04 504 Gateway Timeout

POST https://app.example.com/incoming

retry scheduled
attempt 2 · 09:36:12 200 OK

POST https://app.example.com/incoming

2 attempts · both recorded

Why switch

Why teams move from Inbound Parse

SendGrid's Inbound Parse webhook works, and plenty of applications run on it. These are the other differences that usually prompt a move.

Choose your format

Inbound Parse posts multipart form data, with attachments as file uploads and no JSON option. CloudMailin lets you pick the format for each address: normalized JSON, multipart or the raw message. You can change it from the dashboard at any time.

Receive on your own domain

Inbound Parse requires MX records on a dedicated subdomain, and SendGrid's docs warn against pointing your root domain at it. CloudMailin can receive for a single address, a subdomain or your entire domain, including wildcard addresses.

Larger messages

Inbound Parse caps messages at 30MB and only runs its spam check on messages under 2.5MB. CloudMailin handles messages up to 50MB depending on plan, with no limit on dedicated servers. If you want spam scoring, you can turn it on for each address.

Attachments and messages in your own storage

CloudMailin can write attachments, or the full message, directly to your own S3, Azure, Google Cloud or S3-compatible bucket and hand your webhook the URLs. Your files stay in your infrastructure.

Side by side

SendGrid vs CloudMailin for inbound email

SendGrid Inbound Parse CloudMailin
Webhook format Multipart form data, or raw JSON, multipart or raw, per address
Message history Not shown in Email Activity Searchable, with per-message status
Failed delivery visibility No dashboard notification Every attempt recorded with HTTP status
Root domain receiving Dedicated subdomain only Yes, including wildcards
Maximum message size 30MB Up to 50MB, unlimited on dedicated servers
Spam scoring Only messages under 2.5MB Optional, per address
Message and attachment storage Posted to your endpoint Your own S3, Azure or GCS bucket
Outbound sending Transactional and marketing campaigns Transactional only *
Inbound email One feature of a sending platform The product

* Transactional only is deliberate. Sending newsletters and password resets through the same pipes ties your most important messages to the reputation of your bulk sends.

SendGrid details from their own documentation: Inbound Parse, retry behaviour, Email Activity. Checked July 2026. Tell us if anything is out of date.

The code

Less code on your side

Inbound Parse handler
// multipart/form-data with numbered attachment fields
app.post('/parse', upload.any(), (req, res) => {
  const envelope = JSON.parse(req.body.envelope);
  const attachmentInfo = JSON.parse(req.body['attachment-info'] || '{}');
  const files = req.files; // attachment1, attachment2, ...
  res.sendStatus(200);
});
CloudMailin handler
app.post('/incoming_mails', (req, res) => {
  const { envelope, headers, plain, html, attachments } = req.body;
  res.sendStatus(200);
});

The JSON version is usually less code than parsing multipart form fields.

Migration

Moving over

01

Create a CloudMailin address and pick the format your app prefers.

02

Update your webhook handler. The JSON version is usually less code than parsing multipart form fields.

03

Point MX records at CloudMailin. You can run both side by side while you test, Inbound Parse on the old subdomain and CloudMailin on a new one.

Support

Support from the people who run the service

With CloudMailin our engineers also run support. They have in-depth knowledge of the whole platform, so when something looks wrong you talk to someone who can see both ends of the problem. There is a phone number you can actually call, and support is part of the service rather than a paid add-on.

Answered by engineers A phone you can call Public status page

Where SendGrid is a good fit

If you want marketing campaigns and audience management from the same vendor, SendGrid covers ground that we don't. CloudMailin offers a fantastic transactional outbound but not marketing email, and inbound is still the product.

Convinced? Try CloudMailin

Create an address and watch the first message arrive as JSON.

Questions

Frequently asked questions

01 What happens when my endpoint is down? +
SendGrid retries Inbound Parse deliveries for up to 72 hours and then drops the message. Their documentation notes there is no dashboard notification when that happens. CloudMailin records every delivery attempt with the HTTP status your server returned, and the message stays visible in your history, so a failing endpoint shows up in your dashboard rather than as missing data.
02 Does CloudMailin really deliver JSON? +
Yes. Each address has a format setting: normalized JSON, multipart or the raw message. Inbound Parse posts multipart form data with attachments as file uploads and has no JSON option.
03 Can I receive email on my root domain? +
Yes. CloudMailin can receive for a single address, a subdomain or your entire domain, including wildcard addresses. Inbound Parse requires MX records on a dedicated subdomain and SendGrid's docs warn against pointing your root domain at it.
04 Can I run CloudMailin and Inbound Parse side by side? +
Yes. Keep Inbound Parse on its existing subdomain and point a new subdomain at CloudMailin while you test. Move the rest of your MX records once you are happy.
05 Where do attachments go? +
Wherever you want them. By default they arrive with the webhook. CloudMailin can also write attachments, or the full message, directly to your own S3, Azure, Google Cloud or S3-compatible bucket and hand your webhook the URLs.
06 Does CloudMailin send email too? +
Yes. CloudMailin offers outbound sending for transactional email over SMTP or our API. We deliberately keep marketing email out, because sending newsletters and password resets through the same pipes ties your most important messages to the reputation of your bulk sends. Inbound email is the product we are known for, and you can use either side on its own.

Ready to switch?

Point MX records at CloudMailin and receive your first message as JSON in minutes.