What Sendy does and what SES does
Sendy is the shopfront: lists, templates, campaigns, reports. SES is the post office: it accepts your message and delivers it. Neither replaces the other, and most setup failures come from treating them as one system.
- Sendy runs on your hosting with PHP and MySQL. It stores subscribers, builds campaigns and calls SES to send.
- SES authenticates your domain, throttles per second, tracks bounces and complaints, and bills per thousand messages.
- Your DNS ties them together. Without the DKIM records SES issues, the mail is signed by nobody and lands in spam.
What the server needs before the install
A small shared plan is enough for the app, because the heavy work happens at AWS. What matters is the stack underneath it.
- PHP 8 with MySQL or MariaDB, and enough memory to load a list of 50,000 subscribers into a campaign.
- HTTPS on the sending domain and on the Sendy install. Links inside a campaign should open over TLS.
- Cron access, because scheduled campaigns and autoresponders run from cron, not from a page load.
- An SES region close to your readers. Mumbai is the sensible default for an Indian list.
- A domain you control, with DNS you can edit. A free mailbox address cannot be verified as a sending identity.
Get the SES account out of the sandbox
A new SES account starts in the sandbox: 200 messages a day, one per second, and only to addresses you have verified. Nothing you do in Sendy changes that. AWS has to lift it.
- In the SES console, open Verified identities and verify your domain, not a single email address. A domain covers every sender at that domain.
- Add the DKIM records SES generates, in the same region you will send from.
- Send a test message to your own address and confirm it arrives, with the headers showing your domain.
- Open the production access request and answer three things plainly: what you send (a newsletter to people who signed up), how you collect addresses (a form with a confirmation email), and how you handle bounces and complaints.
- Wait for the reply, usually within a day, and raise the sending quota in the same request if you plan to send more than a few thousand a day.
Publish DKIM, SPF and DMARC
Three record types, one DNS zone. Publish all three before the first campaign, because retrofitting them after a spam complaint is much harder.
| Record | What it proves | Where it comes from |
|---|---|---|
| Three DKIM CNAMEs | The message was signed by a key only your domain controls | Generated by SES when you verify the domain |
| SPF TXT | Amazon is allowed to send on behalf of your domain | Your own record, including include:amazonses.com |
DMARC TXT at _dmarc | What to do when SPF or DKIM fails, and where reports go | Your own record, starting at p=none with a reporting address |
Verify with a DNS lookup from outside your network, not from a cached resolver. If the SES console still shows pending after an hour, the record name usually has an extra domain appended by the DNS panel.
Install Sendy and connect the SES key
- Create a MySQL database and user for Sendy, then upload the application files to the domain or subdomain that will host it.
- Open the install screen and enter the database details, or edit the config file if your build ships one.
- In AWS IAM, create a user with a programmatic access key limited to SES sending. Do not use your root account key.
- Paste the key and secret into Sendy's SES settings, choose the same region, and set the From address on the verified domain.
- Send a test campaign to three addresses: your own, a Gmail account and an Outlook account. Check all three inboxes before you import a list.
Keep the secret out of the repository and out of screenshots. If a key leaks, deactivate it in IAM and issue a new one; Sendy only needs the pair to be replaced.
Wire bounces and complaints through SNS
SES reports bounces and complaints to an SNS topic. Until Sendy is subscribed to that topic, hard-bounced addresses stay in your list and drag down your reputation.
- Create an SNS topic in the same region as SES, for example
ses-bounces. - Add a subscription with an HTTPS endpoint on your Sendy domain, using the bounce URL from Sendy's settings page.
- Confirm the subscription from the email AWS sends.
- In SES, set the identity's bounce and complaint feedback to that topic.
- Send to a deliberately invalid address and confirm it is marked bounced in Sendy within a few minutes.
Cron jobs and the India sending window
Two cron entries do the work: one processes scheduled campaigns and one runs autoresponders. Five-minute intervals are typical. Without them, a campaign queued for 9 am sits until someone opens the panel.
Send between 9 and 11 am IST for a business list, and Tuesday to Thursday for the best open rates on a first send. Throttle to the rate SES allows for your account, or the queue fails partway and you spend a morning working out which half went out.
What 10,000 emails actually costs
The sending is the cheap part; the app and the domain are the fixed costs. AWS bills SES per thousand messages, so 10,000 comes to about one US dollar, roughly ₹85 at ₹85 to the dollar. The rate moves, so treat the rupee figure as an estimate and the dollar figure as the bill.
| Line | Cost |
|---|---|
| SES, 10,000 emails | About $1, roughly ₹85 at ₹85 to the dollar |
| Hosting for Sendy | ₹400 a month on WebJi® L-Unlimited, before 18% GST |
| Domain | ₹900–1,200 a year for .com, before 18% GST |
| Sendy licence | One-time, from the vendor; check the current price before you budget |
That is the whole argument for this stack: a 10,000-email send costs less than a coffee, and the monthly floor is the hosting plan you already pay for.
When a managed email host is simpler
Self-hosting shifts deliverability onto you. If nobody on the team wants to watch bounce rates, keep DKIM current and answer an AWS support thread, a managed sender does that work for a monthly fee.
WebJi® email marketing hosting covers the app, the domain and the DNS in one place, and the team can wire the sending domain for you. Email support@webji.services with the list size and the sending domain, and keep business email on a separate domain so a campaign never affects the mailbox your office replies from.
Frequently Asked Questions
How do I set up Sendy with Amazon SES?
Verify your domain in SES, publish the DKIM records, get the account out of the sandbox, then install Sendy on PHP and MySQL and enter an SES access key limited to sending. Send a test campaign to Gmail and Outlook before importing a list.
How much does it cost to send 10,000 emails with SES?
About one US dollar, because SES bills per thousand messages. In rupees that is roughly ₹85 at ₹85 to the dollar, and the exact figure moves with the exchange rate. Hosting and the Sendy licence are the fixed costs.
Why are my SES emails going to spam?
Usually a missing or broken DKIM record, a From address on a domain you did not verify, or a list that has never confirmed opt-in. Publish DKIM, SPF and DMARC, send from the verified domain, and remove hard bounces.
What is the SES sandbox and how do I leave it?
A new SES account can send 200 messages a day, one per second, only to verified addresses. Request production access in the console and explain what you send, how addresses are collected and how you handle bounces.
Can Sendy run on shared hosting?
Yes, if the plan has PHP 8, MySQL, cron and enough memory for your list size. The sending happens at AWS, so the hosting only runs the panel and the campaign queue. WebJi® L-Unlimited at ₹400 a month before GST is enough for most lists.

