Shopify + MailKite
Shopify doesn't expose SMTP settings in its admin — email is handled by Shopify Email. But you can send transactional mail (order confirmations, shipping notifications) from a Shopify app or workflow using MailKite's SMTP relay or API, and route inbound email (replies, support) to your webhook.
What you need
- A verified domain with SPF + DKIM published
- Your API key (
mk_live_…) - A Shopify store (any plan) and a third-party SMTP app or custom workflow
Option A: SMTP via a Shopify app
Several Shopify apps add SMTP configuration. Install one (e.g. Order & Shipment Email or SMTP by Automate.io) and point it at MailKite:
# Shopify SMTP settings (in Shopify Email or third-party SMTP app)
SMTP Server: smtp.mailkite.dev
Port: 587
Username: mailkite
Password: mk_live_...
Encryption: STARTTLS (port 587) or TLS (port 465) The app sends order notifications, shipping updates, and other transactional emails through MailKite instead of Shopify's default email.
Option B: Webhook → MailKite API (recommended)
For full control, use Shopify's order webhook and send via the MailKite API. This gives you templates, threading, and attachments — without fighting Shopify's email limits.
In your Shopify admin, go to Settings → Notifications → Webhooks and create a webhook for Order creation. Point it at a small serverless function:
// Cloudflare Worker or any serverless function
// Receives Shopify order webhook → sends confirmation via MailKite API
export default {
async fetch(request, env) {
if (request.method !== "POST") return new Response("OK");
const order = await request.json();
const { email, first_name, order_number, total_price } = order;
const resp = await fetch("https://api.mailkite.dev/v1/send", {
method: "POST",
headers: {
"Authorization": "Bearer " + env.MAILKITE_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "orders@yourdomain.com",
to: email,
subject: "Order #" + order_number + " confirmed",
html: "<p>Hi " + first_name + ",</p>"
+ "<p>Your order #" + order_number + " for $" + total_price
+ " is confirmed. We'll notify you when it ships.</p>",
text: "Hi " + first_name + ",\n\nYour order #" + order_number
+ " for $" + total_price + " is confirmed.",
}),
});
return new Response(JSON.stringify({ sent: resp.ok }), { status: 200 });
},
};
Deploy this on Cloudflare Workers, Vercel, or any serverless platform. Set
MAILKITE_API_KEY as an environment variable.
Receive inbound email
If you want customers to reply to order emails and have those replies land in
Shopify, set your domain's webhook to POST to a
function that creates a Shopify draft order note or thread. The webhook payload
includes from, subject, text, and
attachments — enough to create a note on the relevant order.
Troubleshooting
- Shopify blocks SMTP — Shopify doesn't provide SMTP settings in the admin. Use a third-party app or the API workflow above.
- DKIM failures — ensure your
Fromdomain matches the one you verified in MailKite. Shopify's default sender usesshopify.comwhich won't pass our checks. - Order webhook not firing — check your Shopify admin → Notifications → Webhooks. The webhook must point to an HTTPS endpoint.
- Deliverability — transactional email from Shopify domains has its own reputation. By sending from your own domain via MailKite, you build your own reputation.
See the Send API for the full request reference, or all integrations for other platforms.