Switch from SendGrid to Zoho ZeptoMail in just 5 minutes.

Modify just one line in your existing code and make a seamless transition to ZeptoMail.

What makes ZeptoMail special?

SendGrid is a cloud-based email delivery and management service that helps businesses send marketing emails and transactional emails. It offers several monthly subscription options, each with its own set of features included in the plan.

But if transactional emails are your focus, why should you pay for unused features and emails every month?

With Zoho ZeptoMail, start paying for only what you use. It’s built specifically for sending transactional emails to enhance email delivery speed and inbox placement. ZeptoMail offers a pay-as-you-go pricing model with access to all features regardless of what you pay.

Get started with Zoho ZeptoMail.

Transition smoothly from SendGrid to Zoho ZeptoMail using this four-step guide.

Step

Sign up for Zoho ZeptoMail.

  • Enter the relevant credentials and Sign up for Zoho ZeptoMail.

  • Right after you sign up, check your inbox for a verification email sent to validate your email address.

  • After verifying your account, you’ll need to enable two-factor authentication by selecting from a list of TFA options.

Step

Add and verify your domain

Step

Modify one line of your existing code.

  • Change one line of your API code to make the switch from SendGrid to ZeptoMail.

  • Send an API request to https://api.zeptomail.com/v1.1/sg/email

  • To authorize your request, add the Send mail token in the header section.

Step

Welcome aboard!

  • Welcome to ZeptoMail. Start sending your transactional emails from ZeptoMail. Happy email sending!

Sign up for Zoho ZeptoMail
Domain addition and verification
 
             
copy
                                            
curl "https://api.zeptomail.com/v1.1/sg/email" \
-X POST \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Zoho-enczapikey ***" \
-d '{ 
        "headers" : { "key" : "headers" }, 
         "from": { "email": "rebecca@example.com", "name": "Rebecca" }, 
          "personalizations" : [ { "to" : [ { "name" : "John Doe", "email" : "john@example.com" },{ "name" : "Julia Doe", "email" : "julia@example.com" } ], 
           "cc" : [ { "name" : "Jane", "email" : "jane@example.com" } ],
            "bcc" : [ { "name" : "Jim", "email" : "jim@example.com" } ] },
             {"to" : [ { "name" : "Janice", "email" : "janice@example.com" } ],
             "bcc" : [ { "name" : "Jordan", "email" : "jordan@example.com" } ] } ], 
            "subject" : "Order confirmation", 
            "content" : [ { "type" : "html/text", "value" : "Your order is confirmed!" } ], 
            "reply_to" : { "email": "customer_service@example.com", "name": "Customer Service Team" } }'
                                            
                                        
                                            
import fetch from 'node-fetch';

fetch("https://api.zeptomail.com/v1.1/sg/email", {
    body: JSON.stringify({
        "personalizations": [
          {
            "to": [
              {
                "email": "john@example.com",
                "name": "John"
              },
              {
                "email": "julia@example.com",
                "name": "Julia"
              }
            ],
            "cc": [
              {
                "email": "jane@example.com",
                "name": "Jane"
              }
            ],
            "bcc": [
              {
                "email": "jim@example.com",
                "name": "Jim"
              }
            ],
          },
          {
            "to": [
              {
                "email": "janice@example.com",
                "name": "Janice"
              }
            ],
            "bcc": [
              {
                "email": "jordan@example.com",
                "name": "Jordan"
              }
            ]
          }
        ],
        "from": {
          "email": "rebecca@example.in",
          "name": "Rebecca"
        },
        "reply_to": {
          "email": "customer_service@example.com",
          "name": "Customer Service Team"
        },
        "subject": "Order Confirmation",
        "content": [
          {
            "type": "text/html",
            "value": "Your order is confirmed!"
          }
        ],
        "attachments": [
          {
            "content": "[base64-content]",
            "filename": "index.html",
            "type": "text/html",
            "disposition": "attachment"
          }
        ],
      }),
    method: "POST",
    headers: {
        "Authorization": "Zoho-enczapikey ***",
        "Accept": "application/json",
        "Content-Type": "application/json"
    }
}).then(async (resp) => {
    let result = await resp.json()
    console.log(result)
}).catch((err) => {
    console.log(err)
})
                                            
                                        
                                            
using System;
using System.Net;
using System.Text;
using System.IO;
using System.Net.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
            var baseAddress = "https://api.zeptomail.com/v1.1/sg/email";

            var http = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
            http.Accept = "application/json";
            http.ContentType = "application/json";
            http.Method = "POST";
            http.PreAuthenticate = true;
            http.Headers.Add("Authorization", "Zoho-enczapikey ***");
            JObject parsedContent = JObject.Parse("{
                'headers' : {'key' : 'headers'},
                'from': {
                    'email': 'rebecca@example.com',
                    'name': 'Rebecca'
                },
                'personalizations': [
                    {
                        'to': [
                            {
                                'email': 'john@example.com',
                                'name': 'John'
                            },
                            {
                                'email': 'julia@example.com',
                                'name': 'Julia'
                            }
                        ],
                        'cc': [
                            {
                                'email': 'jane@example.com',
                                'name': 'Jane'
                            }
                        ],
                        'bcc': [
                            {
                                'email': 'jim@example.com',
                                'name': 'Jim'
                            }
                        ],
                    },
                    {
                        'to': [
                            {
                                'email': 'janice@example.com',
                                'name': 'Janice'
                            }
                        ],
                        'bcc': [
                            {
                                'email': 'jordan@example.com',
                                'name': 'Jordan'
                            }
                        ]
                    }
                ],
                'subject' : 'Order Confirmation',
                'content' : [
                    {
                        'type' : 'html/text',
                        'value' : 'Your order is confirmed!'
                    }
                ],
                'reply_to' : {
                    'email': 'customer_service@example.com',
                    'name': 'Customer Service Team'
                }
            }");
            Console.WriteLine (parsedContent.ToString());
            ASCIIEncoding encoding = new ASCIIEncoding();
            Byte[] bytes = encoding.GetBytes(parsedContent.ToString());

            Stream newStream = http.GetRequestStream();
            newStream.Write(bytes, 0, bytes.Length);
            newStream.Close();

            var response = http.GetResponse();

            var stream = response.GetResponseStream();
            var sr = new StreamReader(stream);
            var content = sr.ReadToEnd();
            Console.WriteLine (content);
        }
    }
}
                                            
                                        
                                            
import requests

url = "https://api.zeptomail.com/v1.1/sg/email"

payload = "{ \"headers\" : { \"key\" : \"headers\" }, \"from\": { \"email\": \"rebecca@example.in\", \"name\": \"Rebecca\" }, \"personalizations\" : [ { \"cc\" : [ { \"name\" : \"Jane\", \"email\" : \"jane@example.com\" } ], \"bcc\" : [ { \"name\" : \"Jim\", \"email\" : \"jim@example.com\" } ],  \"to\" : [ { \"name\" : \"John\", \"email\" : \"john@example.com\" },{ \"name\" : \"Julia\", \"email\" : \"julia@example.com\" } ] }, {\"to\" : [ { \"name\" : \"Janice\", \"email\" : \"janice@example.com\" }], \"bcc\" : [ { \"name\" : \"Jordan\", \"email\" : \"jordan@example.com\" } ] }], \"subject\" : \"Order confirmation\", \"content\" : [ { \"type\" : \"html/text\", \"value\" : \"Your order is confirmed!\" } ], \"reply_to\" : { \"email\": \"customer_service@example.com\", \"name\": \"Customer Service Team\" } }"
headers = {
'accept': "application/json",
'content-type': "application/json",
'authorization': "Zoho-enczapikey ***",
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
                                            
                                        
                                            
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://api.zeptomail.com/v1.1/sg/email",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => '{
        "headers": {
            "[key]": "[headers]"
        },
        "from": {
            "email": "rebecca@example.in",
            "name": "Rebecca"
        },
        "personalizations": [
          {
            "to": [
              {
                "email": "john@example.com",
                "name": "John"
              },
              {
                "email": "julia@example.com",
                "name": "Julia"
              }
            ],
            "cc": [
              {
                "email": "jane@example.com",
                "name": "Jane"
              }
            ],
            "bcc": [
              {
                "email": "jim@example.com",
                "name": "Jim"
              }
            ],
          },
          {
            "to": [
              {
                "email": "janice@example.com",
                "name": "Janice"
              }
            ],
            "bcc": [
              {
                "email": "jordan@example.com",
                "name": "Jordan"
              }
            ]
          }
        ],
        "subject": "Order Confirmation",
        "content": [
            {
            "type": "html/text",
            "value": "Your order is confirmed!"
            }
        ],
        "reply_to": {
            "email": "customer_service@example.com",
            "name": "Customer Service Team"
        }
    }'
    CURLOPT_HTTPHEADER => array(
        "accept: application/json",
        "authorization: Zoho-enczapikey ***",
        "cache-control: no-cache",
        "content-type: application/json",
    ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}
?>
                                            
                                        
                                            
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.json.JSONObject;

public class JavaSendapi {
    public static void main(String[] args) throws Exception {
        String postUrl = "https://api.zeptomail.com/v1.1/sg/email";
        BufferedReader br = null;
        HttpURLConnection conn = null;
        String output = null;
        StringBuffer sb = new StringBuffer();
        try {
            URL url = new URL(postUrl);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Accept", "application/json");
            conn.setRequestProperty("Authorization", "Zoho-enczapikey ***");
            JSONObject object = new JSONObject("{\"headers\" : { \"key\" : \"headers\" }, \"from\": { \"email\": \"rebecca@example.in\", \"name\": \"Rebecca\" }, \"personalizations\" : [ { \"cc\" : [ { \"name\" : \"Jane\", \"email\" : \"jane@example.com\" } ], \"bcc\" : [ { \"name\" : \"Jim\", \"email\" : \"jim@example.com\" } ],\"to\" : [ { \"name\" : \"John\", \"email\" : \"john@example.com\" },  { \"name\" : \"Julia Doe\", \"email\" : \"julia@example.com\"} ] },{\"to\" : [ { \"name\" : \"Janice\", \"email\" : \"janice@example.com\" }],\"bcc\" : [ { \"name\" : \"Jordan\", \"email\" : \"jordan@example.com\" } ] } ], \"subject\" : \"Order Confirmation\", \"content\" : [ { \"type\" : \"html/text\", \"value\" : \"Your order is confirmed!\" } ], \"reply_to\" : { \"email\": \"customer_service@example.com\", \"name\": \"Customer Service Team\" } }");
            OutputStream os = conn.getOutputStream();
            os.write(object.toString().getBytes());
            os.flush();
            br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
            while ((output = br.readLine()) != null) {
                sb.append(output);
            }
            System.out.println(sb.toString());
        } catch (Exception e) {
            br = new BufferedReader(new InputStreamReader((conn.getErrorStream())));
            while ((output = br.readLine()) != null) {
                sb.append(output);
            }
            System.out.println(sb.toString());
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (conn != null) {
                    conn.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();

            }
        }
    }
}
                                           
                                        
Send transactional emails from ZeptoMail

How is ZeptoMail different from SendGrid?

Here are some concepts and terminologies to help you navigate Zoho ZeptoMail.

  •  
  • Email Segments
  • DNS Requirements
  • Attachment Management
  • User Management
  • User Activity Logs
  • Measure
  • Suppress Emails
  • Email Logs
  • Email Trackers
  • Logs and Content Retention
  • Subscription
  • Support
  • IPs
  • Webhooks
  • SendGrid
  • Outbound → Subusers Subusers can be created to segment different types of emails you send. (An upgrade is required to use this feature.)
  • Settings → Sender Authentication → Domain Authentication Provide your CNAME to authenticate your domain manually under DNS records.
  •  
  • Teammates Manage ownership of multi-users and their accessibility in an account. (Only 1 teammate can be added using the Essentials Plan. An upgrade is required to add more teammates.)
  •  
  • Stats Get reports of opens, clicks, delivered, bounces, and spam reports. You can also get insightful reports to analyze overall performance.
  • Settings → Suppression Settings Bounces, spam, unsubscribes, and invalid addresses are added to suppressions manually or automatically.
  • Email Activity Feed Get a preview of recent email activity associated with your account or any subusers.
  • Settings → Tracking Settings Enable click and open tracking for sending domains.
  • Essentials Plan 3 days of email activity retention. (An upgrade is required to increase up to 30 days of email activity storage.)
  • For 50,000 emails $19.95 per month + additional charges for access to all features. (Free for 30 days.)
  • 24/7 ticket and chat support for the basic plan. (An upgrade is required for live phone support.)
  • IP Access Management Include a list of IPs that will be used to send emails from your account.
  • Settings → Webhooks Add webhooks to domains to receive notifications on events linked to the messages you send. (An upgrade is required to use Webhooks.)
  • zeptomail
  • Mail Agents Mail Agents help categorize your emails by type, purpose, application, and more. (All users can use this feature.)
  • Domains → DNS Settings Secure your domain’s authenticity by setting up DKIM and CNAME records in your DNS settings
  • File Cache Save storage by uploading files to the File Cache. Use the File Cache key when sending emails through the API. File Cache supports up to 1GB of storage per account.
  • Manage Users Multiple users and their ownership can be managed in an account. (A total of 30 users can be added to your ZeptoMail account. No upgrade is required.)
  • Activity Logs View the actions performed by various users in your ZeptoMail account. 1 year of activity log retention.
  • Reports Get back-to-back reports of sent, delivered, soft bounces, hard bounces, process failed, opens, clicks, and custom reports for all users.
  • Suppression List Certain types of hard bounces are automatically added to the suppression list. Additionally, you have the option to suppress specific email addresses and domains manually.
  • Processed Emails Within the processed emails section, you’ll find the sent emails listed in the order they were processed.
  • Email Tracking You must enable open and click tracking for each Mail Agent in ZeptoMail to track sent emails.
  • Any Number of Credits 60 days of processed email data retention and content retention.
  • For 50,000 emails $12.50 (5 credits) access all features for all users. 1 credit free (10,000 emails) for6 months.
  • 24/7 comprehensive technical assistance available via phone and chat for all users.
  • IP Restrictions IP addresses that are used to send emails can be added to this list to prevent any malicious activity.
  • Mail Agent → Webhooks Activate webhooks to receive notifications about events taking place in your emails. (Webhooks are an optional feature for all users.)

Get a detailed comparison between SendGrid and ZeptoMail.

SendGrid vs. Zeptomail  

SendGrid Transition API Code Explained

A detailed documentation into SendGrid transition API to start sending your transactional emails from ZeptoMail.

SendGrid Transition API  

ZeptoMail feature highlights

  • Mail Agents
  • File Cache
  • Processed Emails
  • Templates
  • Webhooks
  • Email Tracking
  • Domains
  • Suppression List
  • Reports
  • Subscription
  • Manage Users
  • Activity Logs
  • Content Settings
  • IP Restrictions
  • Export Logs

Mail Agents

Mail Agents

Mail Agents in ZeptoMail are designed to assist in categorizing your transactional emails based on their type, purpose, multiple applications, and other criteria. Each Mail Agent is given a unique API token and SMTP credentials. Learn more

File Cache

File Cache

File Cache in ZeptoMail streamlines attachment management. You can upload images to the File Cache section. Each image will be assigned a File Cache Key, which can be used in your email API to add attachments automatically. ZeptoMail supports up to 1GB of File Cache storage per account. Learn more

Processed Emails

Processed Emails

Processed Emails monitors the progress of the emails sent from your account. It displays emails in the order they were processed. The data is stored for up to 60 days, and you can export this list to track your transactional email performance. Learn more

Templates

Templates

ZeptoMail provides different transactional email templates that businesses frequently use to send emails like password resets and OTPs on an everyday basis. These standardized templates can be used to send messages to your users without the need to write the same email each time. Learn more

Webhooks

Webhooks

Webhooks are custom HTTP callbacks that are activated based on certain events. You can enable webhooks in ZeptoMail to get back-to-back recipient activity to your application based on the interactions with the sent emails. You can get real-time notifications of open, clicks, and bounces to your application. Learn more

Email Tracking

Email tracking

Email Tracking allows you to monitor when your recipients open and click on your emails, giving you insight into the engagement level of your transactional emails. In ZeptoMail, you must enable Email Tracking for each Mail Agent in order to track opens and clicks precisely. Learn more

Domains

Domains

The Domains page helps you manage and add up to 100 domains per ZeptoMail account. On this page, you can find the DKIM and CNAME values to add to your DNS for domain verification. You can also view the associated domains for each Mail Agent and check their verification status. Learn more

Suppression List

Suppression List

The Suppression List tracks email addresses and domains that are excluded from receiving emails due to bounces, unsubscribes, or invalid addresses. ZeptoMail’s auto-suppression feature can automatically add specific hard bounces to this list. You can also add these email addresses or domains manually. Learn more

Reports

Reports

Reports are generated by ZeptoMail to monitor the effectiveness of your transactional emails. By enabling this feature, you can easily track and compare between Mail Agents and obtain a detailed analysis of metrics such as opens, bounces, clicks, user engagement, and other relevant data. Learn more

Subscription

Subscription

The Subscription page on ZeptoMail provides details on purchased credits, purchase date, expiration date, and remaining credits and emails. You can also buy more credits, or enable the Auto top-up feature to buy credits automatically. To set up Auto top-up, you must have a verified account and have purchased credits at least once. Learn more

Manage Users

Manage Users

Manage users help with managing a a maximum of 30 users in a ZeptoMail account. You can assign each user their roles; associated Mail Agents keep things confidential and organized. You can assign any of these three roles in ZeptoMail. Postmaster: The admin of the account (has all privileges), Engineer: Multiple access, Viewer: Can only view emails Learn more

Activity Logs

Activity Logs

Activity logs help in monitoring user actions like renaming files, updating Mail Agents or creating templates. For compliance purposes, you can export these activity log records. You can export up to 5,000 records at once and download it as a .zip file, which will be available only for three days. Learn more

Content Settings

Content Settings

ZeptoMail allows you to save the content of your transactional emails in the “Content Setting” area found under the Settings menu. This stored content can be viewed in the processed emails section under each Mail Agent, with a viewing period of 60 days. To retain the content data, tick the box “Save the email content.” Learn more

IP Restrictions

IP Restrictions

ZeptoMail offers an IP restriction feature, allowing you to specify a list of IPs that are allowed to send emails from your ZeptoMail account. Adding IPs to this list offers complete security by preventing unauthorized parties from sending emails and protecting against token compromise. Learn more

Export Logs

Export Logs

ZeptoMail offers the option to export email logs, activity logs, and suppression lists. These log files can be securely exported with a password. The exported file is available for a limited period of three days to prevent data exposure and unauthorized access. Learn more

  15 1 2  

Why choose ZeptoMail?

  • Exclusively transactional

    ZeptoMail ensures exceptional inbox placement and emails are delivered in seconds.

  • User-friendly interface

    ZeptoMail’s intuitive interface makes it easy to navigate and connect with your business.

  • Email segmentation

    Organize your emails into Mail Agents, grouping them by domain, application, or purpose.

  • No gatekeeping

    Access ZeptoMail’s features without any interruptions or additional costs. No updates are required.

  • Comprehensive reports

    ZeptoMail gives you in-depth insights into every email you send like opens, clicks, bounce details, stored content, and more.

  • Flexible pricing

    With ZeptoMail’s pay-as-you-go pricing, you don’t need to worry about paying for monthly plans or unused emails.

  • Attachment storage

    ZeptoMail’s File Cache is where attachments can be stored and uploaded for quick email sending.

  • 24/7 support

    Reach out for technical assistance via ZeptoMail’s chat, phone, and email support, available 24/7.

  • Security and privacy

    In ZeptoMail, security is a top priority. We ensure the confidentiality of transactional email content.

Frequently asked questions

How long does it take to transition to ZeptoMail?

It’s quick and simple to switch to ZeptoMail. Modify just one line of your API code, and you’ll be ready to send transactional emails within five minutes.

Will your email deliverability be affected after the transition?

Absolutely not. By sending transactional emails from dedicated IPs, ZeptoMail ensures high email deliverability and safeguards your sender reputation. You can trust ZeptoMail for a worry-free email delivery after the transition.

How much does it cost for transitioning to ZeptoMail?

There are no extra charges for the transition process. Just pay for the emails you send using ZeptoMail.

Is ZeptoMail more affordable than SendGrid?

Yes, ZeptoMail is much more affordable than SendGrid. ZeptoMail is $7.45 less than SendGrid for every 50,000 emails. ZeptoMail costs around $12.50 (5 credits) for 50,000 emails, whereas SendGrid costs $19.95 every month for 50,000 emails. ZeptoMail charges only for the used emails; there are no extra charges for unused emails and features.

How many users can be added to a ZeptoMail account?

Unlike SendGrid, ZeptoMail allows you to add up to 30 users to an account.

Is it possible to start sending emails right after you create an account?

Yes. Right after you create your account and verify your domain, you’ll be able to send up to 10,000 emails, limited to 100 emails per day. Additional credits can be purchased after your account has been reviewed.

Why do you need a Mail Agent?

A Mail Agent is used to group all of your transactional emails. You’ll be sending different transactional emails like OTPs, password rests, payment confirmations, and more from ZeptoMail. So, ZeptoMail uses Mail Agents to manage them efficiently.

How can you purchase more ZeptoMail credits?

You have the option to buy credits either from the dashboard panel or the subscription panel. Each ZeptoMail credit allows you to send 10,000 emails and remains valid for 6 months.

What happens if you run out of email credits?

You will no longer be able to send emails. To avoid this, turn on the auto top-up in your account to automatically purchase email credits when you reach your predefined limit.

What happens to the unused emails?

Unused emails from each credit will be carried over to the following month and will remain valid for up to six months.

  10 1 2  

Upgrade now and enjoy secure email sending with ZeptoMail.