Grow with us: Join Postmark's new referral partner program and start earning
x
Two paper planes. One white and one yellow.

SendGrid Migration Guide

Everything you need to know about moving from SendGrid to Postmark

Table of Contents

Chapter 1

Introduction#

Key differences between SendGrid and Postmark

Migrating email service providers can be a large undertaking. We want to help relieve some of that stress of moving to Postmark from SendGrid. This guide will detail some of the differences and similarities between SendGrid and Postmark, as well as give some useful tips for migrating to Postmark from SendGrid.

It includes details on differences between Postmark and SendGrid’s APIs, sending outbound emails, processing inbound emails, UI differences, and webhooks.

Key differences between SendGrid and Postmark #

These are some important differences to be aware of when moving over to Postmark from SendGrid:

  • Postmark separates email traffic through Message Streams. Transactional
    and broadcast (bulk) traffic does not mix in Postmark, including IP ranges. SendGrid has a single stream for transactional and marketing/bulk where all email traffic is sent through the same IP range.
  • You can manage suppression lists and unsubscribes through Postmark, and add unsubscribe links to your emails. Learn more in our help doc.
  • Postmark’s APIs do not have XML support, all requests and responses will be in JSON.
  • Postmark does not have a reseller program and there are no Reseller APIs available.
  • We do not recommend using dedicated IPs for most senders but do have that option available if you meet certain eligibility requirements as a sender.

If you need any support during your migration process, please let us know. Our Customer Success team is here to help.


Chapter 2

Postmark Concepts#

Important concepts to learn when moving over to Postmark

There are a few important concepts to learn when moving over to Postmark: Servers, Message Streams, Sender Signatures, and Verified Domains. A server and a confirmed sender signature/verified domain are required for sending, so it is important to understand what they are used for.

Servers #

Each Postmark account contains servers and within those servers are Message Streams. Servers can be thought of as folders you create that group together similar email activity. Each server has its own activity (inbound, transactional, and broadcasts), stats, server API token(s), a unique inbound email address, and templates. You can create as many servers as you need, there is no limit.

Some uses of servers are separating different types of emails such as transactional and broadcasts, separating your clients’ activity, emails for different environments (prod, staging, development), or separating sending for your different domains. When you begin adding more users to your Postmark account, you can also assign them access to specific servers so that they can’t view email activity or change settings across your entire Postmark account.

Message Streams #

Postmark separates email traffic through Message Streams, meaning that transactional and broadcast traffic never intersects in Postmark. Transactional message streams are for messages that are usually unique and triggered by a user action like a welcome email, password reset, or receipts. Transactional streams do not support broadcast messages. Broadcast message streams are for bulk messages that sent to multiple recipients at once like announcements, newsletters, or other application emails.

Sender Signatures and Verified Domains #

In Postmark you need to have a confirmed sender signature or verified domain for each email address you want to send from. Sender signatures are individual email addresses that are authorized for sending via a confirmation email sent to that address. Adding and verifying a domain using a DKIM record lets you send from any email address on that domain.

We use sender signatures and verified domains to ensure you own or are authorized to send from the mailboxes you add to your Postmark account. You can have as many signatures and domains as you need, there is not a limit. Sender signatures and domains are associated with your account, not a specific server. This means they can be used for sending across all of your account’s servers.


Chapter 3

APIs#

How the Postmark API works

A note on API tokens in Postmark #

Each Postmark account has an account API token. Every server in an account also has its own server API token(s). Server API tokens are used for server-level actions such as sending email, getting statistics, modifying a template, etc… account API tokens are used for account-level actions such as creating a new server or adding a new domain for sending.

Check out our help article on the different API Tokens in Postmark for more information.

APIs Map #

API TypeSendGrid API NamePostmark API Name
Sending EmailsMailEmail
Managing BouncesBounces, Blocks, Spam Reports, Invalid EmailsBounce
Managing TemplatesTransactional TemplatesTemplates
Managing Sending SettingsTracking
Server
Managing Servers
Servers
Managing Sent EmailsEmail Activity
Messages
Managing Inbound Emails
Messages
Manage email domains you can send fromDomain Authentication
Domains
Manage email addresses you can send fromSender Authentication
Sender Signatures
Sending StatisticsStatisticsStats

Settings

Mail, Partner, Teammates, Alerts, Users, Sub-users, Link Branding

Deliverability

IP Warmup/Addresses/Pools, Reverse DNS, Email Address Verification, Email CNAME Records,

SecurityAPI Keys/Permissions, TLS, IP Management

Marketing Campaigns
Contacts, Senders, Lists, Segmentation

Managing SuppressionsSuppressionsSuppressions

API Libraries #

In addition to the official libraries offered by Postmark, we also include community submitted libraries for additional language/framework options.

API Libraries Map #

Language/FrameworkSendGrid Official LibraryPostmark Official LibraryPostmark Community Library
C#C#Postmark .NET
Classic ASPSimple Classic ASP Class for Postmark
ClojureClojure Binding for Postmark API
ColdFusionA ColdFusion wrapper written to interact with the Postmark API,Coldfusion component
Craft Plugin
Postmark Craft plugin
DjangoAnymail: Django email backends for Mailgun, Mailjet, Postmark, SendGrid, SparkPost and more
DrupalDrupal Library
ElixirSwoosh
ErlangErlang Library
GoGoPostmark Golang, Postmark.go
GrailsGrails plugin
GruntPostmark Grunt
HaskellHaskell Library
JavaJavaPostmark JavaJava library, Spring's MailSender compatible implementation
LaravelLaravel Plugin
MagentoMagento Extension
NodeJSNodeJSNodeJS

Node Email Templates

Objective-CStandalone Objective-C Class
PerlPerl WWW::Postmark
Pharo SmalltalkPharo Smalltalk, Postmark
PHPPHPPostmark PHPPHP Community Libraries
Postmark CLI
Postmark CLI
PowerShellPostmark PowerShell Snap-in
PythonPythonPostmarker, pystmark, Postmark Python library
RubyRubyPostmark Ruby
RailsPostmark Rails
ScalaScala Client, Scala Library
SwiftSwift Postmark
WordPress PluginPostmark for WordPress
ZendPostmark drop-in replacement for Zend

Chapter 4

Sending Outbound Emails#

Start sending through Postmark

Similarities to SendGrid

  • Sending via a REST API and/or SMTP supported
  • Like SendGrid’s sink.sendgrid.net domain, you can also send test emails to Postmark’s black hole email address, test@blackhole.postmarkapp.com. Postmark also offers a Sandbox mode.

Differences from SendGrid

  • Postmark does not have an SMTP API to be used for special sending instructions when sending with SMTP.
  • Postmark supports both HTTP and HTTPS for API endpoints, whereas SendGrid requires HTTPS.
  • Postmark’s outbound message size limit is 10 MB including attachments, SendGrid’s limit is 30 MB.
  • Postmark messages can have up to 50 recipients in a single message, SendGrid can have up to 1,000.
  • SendGrid has a 10,000 requests/second maximum rate at which you may call the Mail endpoint, Postmark does not have a hard limit for requests/second when sending email.

Configuration for Sending via SMTP #

When using SMTP with SendGrid, You can send 100 messages per SMTP connection at a time, and open up to 10 concurrent connections from a single server at a time. Postmark does not have a limit here.

There are two ways that you can send with SMTP, depending on what your SMTP client offers. The only difference between them is the configuration. ​

You can use the unique API Token for your server (which acts as both a username and password) and a Header to specify the message stream you're sending through. If a header is not specified, Postmark will send through the default transactional stream.

If you don't have an option to add a custom header during the SMTP send, you can instead use an SMTP Token. An SMTP Token consists of an Access Key (which acts as a username) and a Secret Key (which acts as a password).

Tip: Port 465 is not supported with Postmark SMTP. If you were using that port with SendGrid, you will need to switch over to using port 25, 2525, or 587 when using Postmark SMTP.

SettingSendGridPostmark
SMTP Endpoint for Transactional
smtp.sendgrid.netsmtp.postmarkapp.com
SMTP Endpoint for Broadcasts
smtp.sendgrid.netsmtp-broadcasts.postmarkapp.com
Port465 for SSL, 25, 587, or 2525 for unencrypted/TLS25, 587, or 2525
UsernameUses the string “apikey”Server API Token or Access Key
PasswordAPI Key w/ mail permissions enabledServer API Token or Secret Key
AuthenticationUnencrypted, SSL, TLSPlain text (unencrypted), CRAM-MD5, TLS

If you need to whitelist the IPs you connect to Postmark SMTP with, you can find the full list below under SMTP Endpoints.

Message Level Options when Sending with SMTP #

All SendGrid options are specified in the JSON you set in a X-SMTPAPI header. Postmark does not have a single SMTP header that you have to add all your settings to. Instead, Postmark uses individual SMTP headers that you add to the email for setting specific options.

OptionSendGridPostmark
Bcc recipientfilters → bccAdd as a Bcc w/ SMTP client
Click Trackingfilters → clicktrackX-PM-TrackLinks header
Open Trackingfilters → opentrackX-PM-TrackOpens header
Tags
X-PM-Tag header
Metadata
X-PM-Metadata- headers
DKIMfilters → dkimAutomatically uses DKIM signature if DKIM has been verified for the sending domain
Footer to add to bottom of emailfilters → footerAdd the footer in your HTML body
Test email content for spamfilters → spamcheckPostmark Spamcheck API
Send using a templatefilters → templatesTemplates can only be used when sending with the Postmark API
SMTP Stream ID Header
X-PM-Message-Stream: (Stream ID)

Sending via API #

Authentication #

When authenticating with the Postmark API for sending emails, you will need to use your server API token in an X-Postmark-Server-Token header. As a reminder, you can get your server API token from the server’s API Tokens tab.

To send through a particular Message Stream within your server when using API, you'll need to add an additional "MessageStream" parameter at the time of sending. This is the Stream ID. If no MessageStream is specified, messages will be sent through the Default Transactional Stream.

Outbound Sending API JSON Fields Map #

FieldSendgridPostmark
From email address(es)from → emailFrom
From namefrom → nameFrom
To email addressespersonalizations → to → emailTo *
To namepersonalizations → to → nameTo *
Cc email addressespersonalizations → cc → emailCc *
Cc namepersonalizations → cc → nameCc *
Bcc email address(es)personalizations →bcc → emailBcc *
Bcc namepersonalizations → bcc → nameBcc *
Subject linepersonalizations → subjectSubject
Custom Tag
Tag
Metadata
Metadata
HMTL BodycontentHtmlBody
Text BodycontentTextBody
MessageStream
Stream ID
ReplyTo email addressreply_to → emailReplyTo
ReplyTo namereply_to → nameReplyTo
Custom HeadersheadersHeaders
Template Identifiertemplate_idTemplateId
Data to use in Template
TemplateModel
Open Trackingtracking_settings → open_trackingTrackOpens
Link Trackingtracking_settings → click_trackingTrackLinks
Subscription Trackingtracking_settings → subscription_tracking
Attachments
Attachments
Send At Timesend_at
Google Analyticsganalytics
Batch Identifierbatch_id
Specify how to handle unsubscribesasm
IP Pool to Send Fromip_pool_name
Send API Request w/o Sending Emailmail_settings → sandbox_modeUse POSTMARK_API_TEST for your X-Postmark-Server-Token Token
Footer to add to bottom of emailfooter
Test email content for spamspam_check
Bypass unsubscribed recipientsmail_settings → bypass_list_management

Tip: To set a name when adding a To, From, Cc, or Bcc field with the Postmark API, use this format: Full Name <email@domain.com>”

To start sending quickly with Postmark's API, be sure to check our official and community API libraries.


Chapter 5

Processing Inbound Email#

Migrating your inbound email handling

Similarities

  • Postmark and SendGrid both process inbound emails by converting them to well-formed JSON, which is then posted to a URL that you specify for receiving inbound webhooks.
  • Both implementations of inbound processing feature the ability to process emails sent to an entire sub-domain/domain using MX records.
  • Attachments are received as multipart/form-data in SendGrid, whereas Postmark will send attachments as base64 content in the POSTed JSON payload.
  • Manage inbound webhook settings using an API (Parse API in Sendgrid, Server API in Postmark).
  • You can use a wildcard in your MX record to have all sub-domains of your domain work for inbound processing.

Differences

  • With Postmark, you do not have to use a verified (called “whitelabled” at SendGrid) domain for inbound domain forwarding, and Postmark does not require that you set up inbound domain forwarding using an MX record in order to use inbound processing. Each server you create in Postmark will come with a unique inbound email address (ex. yourhash@inbound.postmarkapp.com) that you can use to receive emails inbound at your webhook URL. However, if you want to use inbound domain forwarding, and MX record is required.
  • Postmark does not provide the option to use XML instead of JSON when POSTing webhook payloads.
  • Postmark requires that you enable SMTP (if not enabled already) on your Postmark server to use inbound processing.
  • SendGrid retries inbound message POSTs for 3 days when a non-200 response code is received. With Postmark, a total of 10 retries will be made over a 10.5 hour period, with growing intervals from 1 minute to 6 hours. If all of the retries have failed, your inbound activity page will show the message has a processing error.
  • Postmark’s inbound message size limit including attachments is 35 MB, whereas SendGrid’s is 20 MB.
  • SendGrid sends character encoding data as reported by the email sender, and you need to manually transcode the email content, whereas Postmark normalizes email content to UTF-8.

Inbound Processing JSON Fields Map #

Email PropertySendGridPostmark
Message Identifier for UI/APIMessageID
HTML BodyhtmlHtmlBody
Plain Text BodytextTextBody
Subject LinesubjectSubject
To Email Addressto, envelopeTo, ToFull → Email
From Email Addressfrom, envelopeFrom, FromFull → Email
Cc Email AddressCc, CcFull → Email
Bcc Email AddressBcc, BccFull → Email
ReplyTo Email AddressReplyTo
Dateheaders → DateDate
Attachment Filename(s)attachment-info → filenameAttachments → Name
Attachment ContentAttachments → Content
Attachment Content-TypeAttachments → ContentType
Attachment SizeAttachments → ContentLength
Number of AttachmentsattachmentsAttachments (array size)
HeadersheadersHeaders
TagTag
Mailbox HashMailboxHash
Stripped Text ReplyStrippedTextReply
Sender’s IP Addresssender_ip
DKIMdkimHeaders → DKIM-Signature
SPFSPFHeaders → Received-SPF
SpamAssasssin Scorespam_scoreHeaders → X-Spam-Score
SpamAssassin Reportspam_reportHeaders → X-Spam-Tests
SpamAssassin VersionHeaders → X-Spam-Checker-Version
Character Setscharsets
Identified as SpamHeaders → X-Spam-Status

Inbound processing libraries and code examples #

1

Language/FrameworkLibrary/Code example
RailsGriddler Postmark
RubyPostmark mitt (gem), Sample application
PHPPostmark inbound PHP
PythonPostmark Inbound Python, postmarker
.NETC# + MVC Inbound Demo, Inbound Reply Text Parser in VB

Chapter 6

Webhooks#

Migrating your webhook handlers to Postmark

Both SendGrid and Postmark allow you to receive notifications as JSON POSTs to URLs you specify when specific events occur. While SendGrid has two webhook types (Events, and Inbound Parse), Postmark splits up event types into multiple webhooks, which allows for some additional flexibility and separation of concerns when developing and setting URLs for receiving webhooks.

Webhook Types Map #

Event TypeSendGridPostmark
Inbound ProcessingInbound Parse WebhookInbound webhook
DeliveryDelivery Event WebhookDelivery webhook
Bounces and Blocks
Delivery Event WebhookBounce webhook
Spam ComplaintsEngagement Event WebhookSpam complaint webhook
Open trackingEngagement Event WebhookOpen tracking webhook
Click trackingEngagement Event WebhookClick tracking webhook
UnsubscribeEngagement Event Webhook
Subscription Change webhook
Suppression List Changes

Subscription Change webhook
DroppedDelivery Event Webhook

ProcessedDelivery Event Webhook

Group Unsubscribe/Resubscribe
Group Unsubscribe/Resubscribe

There are some values provided by SendGrid's Event Webhooks that do not have comparable fields in Postmark’s webhooks, such as:

  • Whether TLS was used when sending the email
  • IP address used to send the email
  • If there was a certificate error on the receiving mail server when the email was sent
  • The SMTP message identifier for the sent email. Postmark includes the Postmark MessageID for identifying the email.

Delivery webhook #

Postmark’s delivery webhook allows you to receive notifications when an email is delivered to a recipient. In Postmark, an email is considered successfully delivered when the destination email server returns a 250 OK response after delivery is attempted.

Delivery Webhook Fields Map #

ParameterSendGridPostmark
Recipient’s email addressemailRecipient
Tag/CategorycategoryTag
Delivery timetimestampDeliveredAt
Receiving mail server’s responseresponseDetails
Email Identifiersg_message_idMessageID
Webhook Type
eventRecordType
Server used to send the email
ServerID
Metadata
Metadata
Message Stream

MessageStream
Custom Message ID
smtp-idNot included. We recommend using either Metadata or Tags instead.
TLS used when sendingtls
IP address used for sendingip
Certificate error on the receiving mail servercert_err

Bounce webhook #

Postmark includes some additional information for bounce events that is not present in the SendGrid Event Webhook you should be aware of:

  • From email address
  • Subject of the email
  • Unique identifier for the bounce (used to reactivate a bounced email address using the Postmark Bounce API)
  • Information on whether the recipient’s email address is deactivated and can be reactivated
  • Whether a message dump is available. Postmark stores content for 45 days as standard (and retention can be customized from 7 to 365 days), but retains bounce information indefinitely. If the message was sent less than 45 days ago, you can get a full dump of the message content if this parameter’s value is true

Bounce Webhook Fields Map #

ParameterSendGridPostmark
Recipient’s email addressemailEmail
From email address
From
Email subject line
Subject
Bounce timestamptimestampBouncedAt
Tag/CategorycategoryTag
Unique bounce identifier
ID
Bounce code

TypeCode
Bounce TypetypeType/Name
Message Stream

MessageStream
Email Identifiersg_message_idMessageID
Webhook Type
event
RecordType
Metadata
Metadata
Server used to send the email
ServerID
Custom MessageID
smtp-idNot included. We recommend using either Metadata or Tags instead.
SMTP Status codestatusDetails
Bounce detailsreasonDetails
Description of bouncereasonDescription
Whether the recipient’s email is deactivated
Inactive
Whether the recipient’s email address can be reactivated
CanActivate
If a message dump is available
DumpAvailable

Tip: Postmark includes an additional option when setting your bounce webhook URL to include the message content in the JSON sent to your URL. This option lets you receive the full message content when receiving bounce event information.

Rebound #

The Rebound JavaScript snippet (once installed on your website) will tap into the Postmark API to check for hard bounces and prompt your customers to update their email address if they've experienced deliverability issues in the past.

Screenshot of rebound JavaScript snippet
You can even customize this notifications appearance and messaging without writing any code.

Open Tracking webhook #

You will notice some open tracking information available with the Postmark open tracking webhook that does not exist in SendGrid’s Event webhook:

  • The platform the recipient was using (mobile, desktop, webmail)
  • The geographic location the recipient was in, including the region, country, city, zip code, and coordinates
  • The email client or browser the recipient was using when they opened the email
  • Whether this open event was the first time the email was opened

Open Tracking Webhook Fields Map #

ParameterSendGridPostmark
Recipient’s email addressemailRecipient
Tag/CategorycategoryTag
Timestamp of when open occurredtimestampReceivedAt
Email Identifiersg_message_idMessageID
User AgentuseragentUserAgent
Message Stream
MessageStream
Webhook Type
eventRecordType
MetadataMetadata
Operating System
OS
IP Address of recipient when they opened the emailipGeo → IP
PlatformPlatform
Custom MessageID
smtp-idNot included. We recommend using either Metadata or Tags instead.
Email client used to open the emailClient
Geographic LocationGeo
Whether this was the first open for this emailFirstOpen

Click Tracking webhook #

You will notice some click tracking information available with the Postmark click tracking webhook that does not exist in SendGrid’s Event webhook:

  • The platform the recipient was using (mobile, desktop, webmail) when they clicked the link
  • The geographic location the recipient was in, including the region, country, city, zip code, and coordinates
  • The email client or browser and version the recipient was using when they clicked a link in the email

Click Tracking Webhook Fields Map #

ParameterSendGridPostmark
Recipient’s email addressemailRecipient
Tag/CategorycategoryTag
Email Identifiersg_message_idMessageID
User AgentuseragentUserAgent
Metadata
Metadata
Webhook Type
eventRecordType
Custom MessageID
smtp-idNot included. We recommend using either Metadata or Tags instead.
Operating System

OS
Message Stream

MessageStream
IP Address of recipient when they clicked the emailipGeo → IP
Platform
Platform
Email client used when a link was clicked
Client
Geographic Location
Geo
Click location (HTML or Plain Text email part)
ClickLocation
URL that was clickedurlOriginalLink
Timestamp of when click occurred
timestampReceivedAt


Spam Complaint webhook #

You will notice some spam complaint information available with the Postmark spam complaint webhook that does not exist in SendGrid’s Event webhook:

  • From email address
  • Subject of the email
  • Whether a message dump is available. Postmark stores content for 45 days as standard (and retention can be customized from 7 to 365 days), but retains bounce information indefinitely. If the message was sent less than 45 days ago, you can get a full dump of the message content if this parameter’s value is true

Spam Complaint Webhook Fields Map #

ParameterSendGridPostmark
Recipient’s email addressemailEmail
From email addressFrom
Email subject lineSubject
Complaint timestamptimestampBouncedAt
Tag/CategorycategoryTag
Bounce TypetypeType/Name
Unique bounce identifierID
Bounce codeTypeCode
Message Stream
MessageStream
MetadataMetadata
Email identifiersg_message_idMessageID
Webhook TypeeventRecordType
Server used to send the emailServerID
Custom MessageID
smtp-idNot included. We recommend using
either Metadata or Tags instead.
SMTP Status codestatus
Complaint detailsreasonDetails/Description
Description of complaintreasonDetails/Description
Whether the recipient’s email is deactivatedInactive
Whether the recipient’s email address can be reactivatedCanActivate
If a message dump is availableDumpAvailable


Subscription Change webhook #

  • The Subscription Change webhook is similar to Sendgrid's Suppression Management, although on Postmark's side, this webhook incorporates a few actions in one.
  • The Subscription Change webhook is triggered when an email address is added or removed from a Message Stream's Suppression list. These event notifications are specific to the following subscription changes: Hard bounces, spam complaints, and manual suppressions.

Subscription Change Webhook Fields Map #

ParameterPostmark
Webhook TypeRecordType
Server used to send the emailServer ID
Message Stream
MessageStream
MetadataMetadata
Recipient email address connected to
the subscription change
Recipient
Timestamp of the subscription change
ChangedAt
Who triggered the subscription change
(Recipient, Customer, Admin)
Origin
Whether the subscription change was a

deactivation or reactivation

SuppressSending
Reason address was added to the

Suppression list

SuppressionReason
TagTag

Chapter 7

UI Overview#

Getting familiar with the Postmark web app

When you log into Postmark you are placed in the Servers page, which shows each server you have created. Each server you create has a default transactional message stream for outbound sending and an inbound message stream for processing inbound email. Each server has tabs for Message Streams, Templates, API Tokens, and Settings. Each message stream has tabs for Statistics, Activity, Setup Instructions, and Settings, which are unique for each message stream.

Servers #

Servers let you separate your transactional, broadcasts, and inbound message streams, templates, and credentials based on domains, environments, customers, or any other criteria that helps organize the activity of a given application or website.

The main servers page will show you a list of your servers. You can create as many servers as you need, there is no limit. You can also pin your most frequently accessed servers so they appear at the top of the list. Unused servers will be greyed out, for easy identification of which servers you may want to delete or repurpose.

A screenshot of Postmark's servers.
You can use servers in Postmark to group logically related email activity by domains, environments, or other factors.

Statistics #

To view detailed statistics and metrics for a server's message streams, locate the server in the servers list or by using the search field. Click on the bar graph icon and select the server's message stream
(inbound, transactional, or broadcasts) you are interested in to be taken to its overview page.

Select message stream to view its metrics

The Statistics page is similar to SendGrid's dashboard and stats pages, though each message stream in a server has its own statistics page, rather than an overall account view like SendGrid. Included in the statistics area for the transactional and broadcast message streams is the sending volume, link tracking metrics (if enabled), open tracking metrics (if enabled), and bounce/spam complaint metrics. The inbound message stream's statistics page includes metrics on the number of successfully processed emails and failures.

Screenshot of the detailed statistics for a transactional message stream. Emails sent, opened, and clicked filterable by date and tags.
Statistics can be filtered by date and tag to show the levels of engagement for various groups of emails or all emails.

Activity #

To see your inbound, transactional, and broadcast activity in a server, select the message stream you are interested in and click on the Activity tab. This area will show a detailed event view of the stream's events, including sent, delivered, open events, spam complaints, bounces, etc. Use the search bar to look for emails by subject or email address.

To see details for a particular event in a stream, click on the event. Some events included are sent emails (Processed), bounces, spam complaints, clicked links, and opened emails. Events in Activity are color coded to help you tell what occurred at a glance:

  • Email processed - light green
  • Email delivered - green
  • Email opened - blue
  • Link clicked - purple
  • Bounce/spam complaint - red
  • Message queued - yellow
Screenshot of an example transactional stream activity feed showing emails sent, opened, clicked, bounced, or marked as spam.
The events activity stream will show emails, opens, bounces, clicks, and spam complaints.
Screenshot of the detailed view of an email.
In addition to message events, Postmark stores the full content (both plain text and HTML) of emails for 45 days as standard.
Screenshot of an email with a bounce notification and the option to reactivate.
When an email bounces, Postmark provides a detailed explanation from the server response as well as the option to reactivate delivery. You can also reactivate delivery for bounced addresses using the API.

List management #

Postmark does not have list management features available. However, you can manage suppression lists and unsubscribes which we'll go over in this section.

Addresses in Postmark can be automatically suppressed for three reasons: due to a hard bounce, a spam complaint, or an unsubscribe. Let's go over some differences when it comes to how Postmark and SendGrid handle Suppressions and unsubscribe links.

  • Every message sent through a broadcast Message Stream in Postmark is required to have an unsubscribe link and you can do this by adding a placeholder which will then be replaced with a Postmark unsubscribe link. You can change the default text of the unsubscribe link and add your own styling. If you’re sending a broadcast message which doesn’t include an unsubscribe link, we’ll automatically add it for you at the end of the message. If you'd like to not use Postmark's unsubscribes links, please get in touch to tell us more about how you're managing unsubscribes.
  • When using Postmark's unsubscribe links, there isn't an option to use a custom page for when a recipient clicks unsubscribe. However, in your broadcast stream settings, it's possible to change the name of the stream and add a description which will be shown on the unsubscribe confirmation page. The confirmation page also includes a re-subscribe link if a recipient wishes to start getting your messages again.


Screenshot of Broadcast Stream Settings
Broadcast Stream Settings
Screenshot of unsubscrube confirmation page
Unsubscribe confirmation page
  • There are no unsubscribe groups in Postmark, so if a recipient clicks an unsubscribe link, they are suppressed from receiving further emails only from the Message Stream you sent from. Remember that in Postmark, one server can have multiple Message Streams - handy for separating different types of email such as transactional and broadcasts. If a recipient clicks the unsubscribe link in an email sent from your broadcast stream, you'll still be able to send to them through your transactional stream.

Within each Message Stream in Postmark, you'll see a Suppressions tab. This tab shows all inactive addresses for that stream, as well as the reason why they’re inactive — and if possible, a button to reactivate them. 


* Spam complaints cannot be reactivated from within the UI or via API. If a recipient reaches out to you or your sender and wants to receive emails again, just contact us and let us know to reactivate the recipient's address.

* Unlike with SendGrid, each email you attempt to send to a suppressed address does not consume any credits. 


* Similar to how with SendGrid you can manually add recipients to a particular unsubscribe group, Postmark allows you to manually add recipients to the Suppression list (up to 50 at a time). This is done per Message Stream.


With our Subscription Change Webhook, you can be notified when an address is added or removed from a Stream Suppression list. You can also manage, add, and delete suppressions via API.

Screenshot of suppressions overview in Postmark
Suppressions overview in Postmark

Templates #

Postmark gives you the ability to create and store templates including a variety of pre-built and well-test templates for common scenarios. From the Templates tab you can create, edit, and delete the server’s templates. Each server contains its own templates but you can easily copy templates from one server to another.

Alternatively, if you'd like to build your own batch of templates, we've created and open-sourced MailMason to help you automate the process of creating, testing, and managing your own templates using partials, variables, SASS, and asset management.

Screenshot of the choice of templates or the option to code your own templates.
Postmark includes a variety of pre-built and well-tested templates to make getting started easier. They include Welcome emails, Password reset, Receipts, Invoices, and more.

Settings #

The Settings tab in a server lets you modify the server’s name and color. It is also where you can delete a server that is no longer being used.

Screenshot of server settings featuring the server name, a color, and the option to delete the server.
The main server settings let you rename your server as well as change the server's representative color.

API Tokens #

The API Tokens tab shows you your server API token(s). Use this tab to generate and delete server API tokens. Server API Tokens are used for outbound sending, SMTP authentication, and making server level API calls.

Screenshot of example server credentials for the server API.
The Server credentials tabs provides a unique API token for the server.

Managing Account Settings #

The Account page is where you can:

  • Require all account users to use 2FA.
  • Add emergency contacts in case we need to reach you regarding your account and have not heard back from the owner.
  • Set up billing notifications.
  • Mange your account API tokens.
  • Manage your your bill and billing details.
Screenshot of account settings like requiring 2FA, emergency contacts, and billing notification contacts.
From the account settings, you can require 2FA, add emergency contacts as well as billing notification contacts.

Users and Permissions #

The Users page is where you add and manage users (called ‘Teammates’ in SendGrid) to your account for tasks such as viewing activity for troubleshooting and tracking purposes, managing server settings, creating templates, etc... Use our different roles to effectively manage the security of your account. See our help article on setting permissions for an overview of what options there are and how to control your users’ permissions.

Screenshot of the users and permissions list with an owner and an admin showing server-level permissions.
Users and permissions can be managed to allow full or read-only access to individual servers.
Screenshot of advanced user permissions management.
You can control whether someone has access to the full account or individual servers, and with each individual server, you can control whether they have full access or read only access.

Chapter 8

Conclusion#

It’s time to switch

Dive Deeper #

For more Postmark specific insight on how to get started and get the most out of Postmark, make sure to look through our “Getting Started Guide” or visit our support center where you can easily search all of our documentation from a single place. API docs. Guides. Blog posts. Help docs. Labs projects. You name it. We probably have something that can help you out.

Status information #

Once you've switched to Postmark, you may want to become familiar with our status page and status API. We believe deeply in transparency, and we go a step further than just system availability and share our inbox rates and delivery speeds for the five most popular inbox providers. We also offer all of the data via an API so you can monitor us and set up automation in the event something does go wrong.

Say hello! #

We love to help. Feel free to reach out through our contact form or via Twitter (@postmarkapp).

Welcome aboard #

You now have a solid understanding of how to transition over the core features you need in an ESP and how to move from SendGrid to Postmark, including how to send outbound and process inbound email, what APIs and webhooks to use for certain functions, and how to view your email activity and statistics. If you have any questions about where to find a setting or how to use a feature in Postmark, get in touch and we can help!

Still have questions?

  • Anna Ward Anna
  • Ignacio Roig Ignacio

Ask us anything! We’re eager to help you with any problem or question you have…

Contact us