How to Install Sendy on Ubuntu VPS: Complete Guide
Before you start
Sendy is a self-hosted email application whose sending layer is closely tied to Amazon SES. A VPS installation therefore has two separate jobs: make the PHP/MySQL application work, and correctly connect that application to AWS SES. The second part matters just as much as the first because a functioning Sendy dashboard does not prove that SES identities, production access, cron jobs and DNS authentication are ready.
Important: installation instructions can change between software releases. Use the version bundled with your license and compare the vendor's current requirements before copying commands into production. Where this article uses an adapted Caddy or Docker pattern, it is clearly labeled rather than presented as vendor certification.
What you need
- A Linux VPS with root/sudo access.
- A domain/subdomain pointing to the VPS.
- A valid Sendy license and download.
- PHP/MySQL hosting meeting the current Sendy compatibility requirements.
- Apache is the safest starting point because Sendy's own documentation is written around standard PHP hosting.
- An AWS account with Amazon SES configured for your sending region.
- A cron mechanism for scheduled campaigns/autoresponders.
Architecture
Domain → Apache/Nginx → PHP → Sendy → MySQL → Amazon SES
Keeping these layers separate makes troubleshooting easier. If the web dashboard works but campaigns do not send, the problem may be in cron, the queue, the delivery server or the provider rather than in the web server. Conversely, a 502 or 500 error normally belongs to the web/PHP layer.
Step-by-step installation
1. Prepare the VPS
Update the operating system, create a sudo user, configure SSH keys and a firewall, and decide on a hostname such as sendy.example.com. Keep the Sendy web application separate from any MTA hostnames.
2. Install Apache, PHP and MySQL
Install a supported PHP runtime and the extensions required by the Sendy release, then create a MySQL database. Check Sendy's current compatibility page/package documentation before selecting PHP versions.
3. Create the database
Create a dedicated database and user with a strong password. Sendy's official guide asks you to put the MySQL credentials into includes/config.php, so keep those values private and outside source-control repositories.
4. Configure config.php
Download Sendy from the license email, unzip it and edit includes/config.php. Set APP_PATH to the exact URL where Sendy will live and enter the MySQL credentials. Do not guess the APP_PATH because redirects and assets depend on it.
5. Upload Sendy
Upload the files to the document root or a dedicated subdirectory. The official guide says you can use FTP or a hosting file manager. On a VPS, SFTP or SCP is usually faster and easier to audit.
6. Set the uploads directory
Sendy's official installation guide says the uploads directory needs write permission for images, attachments and CSV uploads. Apply the minimum permissions that work for your PHP user rather than making the whole application directory writable.
7. Run the installer
Open the Sendy URL and complete the installation using your license key and admin account. If the compatibility page reports missing PHP extensions, install the required module before continuing.
8. Connect Amazon SES
Create or use the appropriate SES credentials, select the correct AWS region and configure Sendy with the AWS credentials. Verify the sender/domain identities in SES and make sure the account is out of SES sandbox before expecting normal production sending.
9. Configure cron
Sendy's scheduled.php and autoresponders.php jobs need to run on schedule. Use the exact paths for your server. The Sendy community documents common cPanel/VPS issues where the full PHP binary path is required. Verify cron execution instead of assuming that a saved cron entry is running.
10. Enable HTTPS and test
Install a trusted certificate, force HTTPS and test login, a test campaign, an autoresponder and any subscription forms. Check the SES console for actual sends and errors.
Post-install configuration
Once the installer finishes, resist the temptation to immediately import a large list and launch a campaign. First configure the sending layer, domain authentication, bounce handling and unsubscribe behavior. Your application can be perfectly healthy while the email infrastructure is not ready for production.
1. Configure the sending service
Use a delivery service or MTA that is appropriate for your sending volume and compliance requirements. Record the exact SMTP/API endpoint, credentials, region and encryption settings. Never publish credentials in screenshots, tutorials, public repositories or support tickets.
2. Authenticate the sending domain
Publish the SPF, DKIM and DMARC records required by your chosen delivery service. If the provider gives you DKIM CNAME records, use those exact values. Avoid creating multiple conflicting SPF records. Start DMARC in a monitoring mode when you are still mapping legitimate senders, then tighten the policy once authentication is verified.
3. Configure bounces and complaints
A campaign system should not keep treating permanently failing addresses as healthy subscribers. Configure the application's bounce/complaint workflow and monitor the resulting logs. If your provider exposes feedback-loop events, connect them where the application supports it.
4. Test with a small list
Send a controlled test to addresses you own at more than one mailbox provider. Check authentication results, rendering, unsubscribe behavior, tracking, bounce handling and queue processing. Only after the end-to-end workflow passes should you increase campaign volume.
Common mistakes to avoid
- Installing a PHP version without checking the application's current compatibility requirements.
- Using the database root account inside the application.
- Making the entire application directory world-writable.
- Putting passwords or AWS credentials into a public repository.
- Assuming a successful login means scheduled jobs are working.
- Sending a large campaign before SPF/DKIM/DMARC and bounce handling are verified.
- Treating the application as the email delivery server when it actually relies on an external SMTP/API provider.
- Skipping backups before upgrades.
Troubleshooting
Sendy installer does not load
Use Sendy's compatibility endpoint and check the PHP extensions reported as missing.
Images/CSV uploads fail
Check the uploads directory permissions and confirm PHP can write there.
Campaign stays pending
Check scheduled.php cron execution, PHP path, Sendy logs and SES status.
SES rejects messages
Verify the AWS region, SES production access and sender/domain verification.
Autoresponder does not fire
Check autoresponders.php cron frequency and the full PHP path. Sendy community troubleshooting repeatedly identifies cron as a key dependency.
Security checklist
- Use SSH keys where possible and disable unnecessary remote access.
- Keep the operating system, PHP runtime and application patched.
- Use a dedicated database account.
- Keep MySQL private unless remote access is explicitly required.
- Use HTTPS for the administration interface.
- Protect application configuration and secret files.
- Back up the database and uploaded/application data.
- Test restoring a backup rather than assuming it is usable.
- Monitor disk, RAM, CPU, queue depth and application logs.
When should you choose this installation method?
A VPS is a good Sendy choice when you want predictable cron execution, filesystem access and control over the PHP/MySQL environment. It is also useful when your cPanel host imposes cron or resource limits. The main operational dependency remains Amazon SES: Sendy manages campaigns, while SES supplies the email delivery service.
Final checklist
- ☐ DNS resolves to the server
- ☐ Supported PHP/runtime is installed
- ☐ Database and dedicated user created
- ☐ Application installer completed
- ☐ Correct file permissions applied
- ☐ HTTPS works
- ☐ Cron/worker jobs execute
- ☐ Sending service connected
- ☐ SPF/DKIM/DMARC verified
- ☐ Bounce/complaint processing tested
- ☐ Unsubscribe tested
- ☐ Backup created and restore plan documented
- ☐ Small end-to-end test campaign completed
Related installation guides
- How to Install Sendy on cPanel
- How to Install Sendy on Caddy
- How to Install Sendy on Docker
- Browse all self-hosted email software installation guides
- About Abhishek Sharma
Sources & references
This guide uses the following vendor or platform documentation. Where a deployment method is an adaptation rather than vendor documentation, that distinction is stated in the article.