Our Sales and Support Teams have been seeing an increase in the number of people interested in switching from Mailgun to SendGrid. This how-to will help you migrate from Mailgun to SendGrid by highlighting the differences between the two services. If you’d like to take a look around before getting going, check out the SendGrid documentation. The Classroom is a great place to start learning about email before diving into the API reference and details. Terminology If you’re looking for the SendGrid equivalent of certain Mailgun functionality, the following table will help: SendGrid Term Mailgun Term substitutions/sections substitution data categories tags unique_args X-Mailgun-Variables Multiple Credentials Multi User Access subuser Mailgun does not provide discrete subusers. suppressions suppressions X-SMTPAPI Mailgun uses a discrete X-Header for each configuration option, such as X-Mailgun-Recipient-Variables Inbound Parse Webhook Routes Event Webhook Webhooks Marketing Campaigns No Equivalent Getting an API Key First, you’ll need a SendGrid account. Next, you should create an API key that you’ll use for sending. Go to Settings -> API keys, or use this link. A SendGrid and security best practice is to use a different API key for each of your different apps. API keys have granular permissions, so you can enable or disable read or write access for individual endpoints. Make sure the API key you create has full access to Mail Send. (Note: Your account must pass provisioning before you can create an API key.) API Libraries We have a number of officially supported API Libraries to make integration easier for our customers. If you’re rewriting any code, or refactoring how you communicate with your ESP as part of your migration, now is a good time to evaluate these libraries: sendgrid-csharp – Official C# library sendgrid-go – Official Go library sendgrid-java – Official Java library sendgrid-nodejs – Official NodeJS library sendgrid-php – Official PHP library sendgrid-python – Official Python library sendgrid-ruby – Official Ruby library SMTP If you’re sending via SMTP, there are a few differences you should be aware of. To authenticate, provide the string ‘apikey’ as the SMTP username, and use your API key as the password. Then point your hostname to smtp.sendgrid.net. You can connect using SMTP via unencrypted or TLS on ports 25, 2525, and 587. You can also connect via SSL on port 465. In general, we recommend port 587 as it tends to result in the fewest issues with hosting providers. The mechanism for customizing email sent via SMTP is our X-SMTPAPI header. This header will allow you to define substitutions, send batched mail-merge style requests, and control filters (like click tracking) that are active for your send. HTTP The main endpoint for sending email is the Mail endpoint. Requests to this endpoint are authenticated via an authorization header with your API key presented as a bearer token. You can find a more detailed example in our docs. Personalizations allow you to define recipients and metadata for each message, such as substitution values for customizing content or custom_args for associating messages with user IDs or order numbers. There are a number of examples of personalizations for common use cases. You can also find cURL example calls. Features like click tracking are configured via the tracking_settings and mail_settings parameters. You can also schedule sends up to 72 hours in advance by using the “send_at” parameter. Attachments sent via HTTP are handled differently than Mailgun. Mailgun requires a multipart/form-data POST containing the files to be attached. With SendGrid, content is encoded as Base64 and embedded directly in the JSON payload alongside MIME information, keeping your entire message in the same payload and simplifying your HTTP request. You can read more about including attachments in the following section of our Documentation Classroom. Webhooks SendGrid provides two webhooks: the Event Webhook for posting real-time events, and the Inbound Parse Webhook for receiving emails and programmatically responding to them. The data shapes and payloads are a bit different from what Mailgun provides. We also do not currently support routing inbound messages to different callback URLs; you’ll need to handle that sort of logic in code rather than at the API level. Non-email API Endpoints For API endpoints that don’t send email, check out the API v3 overview. We use intuitive HTTP methods and response codes in most cases, and enforce rate limits for calls. API v2 is deprecated, though there is no timeline to stop supporting it. All new integrations should prefer v3. API v3 authentication is accomplished by an authentication header with a Bearer token. Marketing Campaigns We have a full-featured platform for managing contact lists, creating and designing templates, A/B testing different templates, and scheduling campaigns. This is all wrapped in a UI that is easy to use for non-developers. And of course you can also access all of these features via our Marketing Campaigns API. A Few FAQs Q: Do you support templates for transactional emails? A: Yes, although our transactional templates do not support enumerations or conditionals at this time. (Stay tuned!) Q: Is there a sandbox or a way to test my emails without sending them? A: You can enable sandbox mode when sending via HTTP. There is also a “sink” address that you can use for testing. Q: Is it possible to transfer my IP address/sender reputation to SendGrid? A: We can’t migrate an IP or reputation but we can help warm up a new IP for you automatically. Q: Does SendGrid support enforced TLS? A: Absolutely. You can require that receiving servers support TLS and drop messages going to servers that don’t comply. Q: Can I allow my recipients to define the types of emails they want to receive? A: Yes. Giving your recipients more control of their email lets you send email people want, which is better for everyone. Check out unsubscribe groups for more information. If you’re interested in migrating to SendGrid, you can find more information at sendgrid.com/pricing.