Migrating from Envoyer to DeployHQ
Envoyer is a polished, Laravel-flavoured deployment dashboard from the team that built Laravel itself. It is well-maintained, well-loved in the Laravel community, and genuinely good at what it does. This guide is not about fixing a problem with Envoyer.
It is about three specific situations where DeployHQ tends to be the better fit:
- You have more than one or two projects. Envoyer charges per project; once you cross three or four projects the maths starts to favour a flat per-account plan.
- Your stack is not only Laravel (or even only PHP). If your team also ships Node, Ruby, Python, or static sites, having one deploy dashboard per language is unsustainable. DeployHQ deploys any stack to any SSH-reachable host (plus FTP, S3, Heroku, Elastic Beanstalk, Custom Actions for cloud CLIs, and more).
- You want a build pipeline that runs off the target server. Envoyer's "Install Composer Dependencies" hook runs
composer installon the target. That is fine, until it is not — slow servers, deploys that need to ship to many machines, or build steps that do not belong in production. DeployHQ runscomposer install,npm ci, asset builds, and anything else once on our build infrastructure and uploads the resulting release to every target.
For a side-by-side feature comparison, see DeployHQ vs Envoyer. If you are weighing PHP-specific options, DeployHQ vs Deployer covers the script-based alternative. If you also use Laravel Forge for server provisioning, see Migrating from Laravel Forge to DeployHQ — Forge stays, only Envoyer goes away.
Coming from a script-based deploy tool instead of a managed dashboard? See Migrating from Deployer to DeployHQ.
Feature parity: Envoyer to DeployHQ
Both tools are managed dashboards with the same atomic-release model — release directories, a current symlink, zero-downtime deploys. The mechanism is nearly identical; the configuration just lives in a different UI.
| Envoyer | DeployHQ |
|---|---|
| Project | DeployHQ project |
| Server (SSH connection) | Server attached to an environment |
| Source control connection (GitHub, GitLab, Bitbucket, custom) | Repository connection (Git, SVN, or Mercurial) — same providers, plus self-hosted Git |
| Branch per project | Branch per environment |
Atomic release with current symlink |
Atomic deploy with automatic symlink swap |
| Deployment Hooks: Clone New Release, Install Composer Dependencies, Activate New Release, Purge Old Releases | Standard DeployHQ deploy flow — handled automatically |
| Pre/Post-activate custom hooks | SSH commands tied to deploy lifecycle (before upload, after upload, before symlink, after deploy) |
| Composer / npm install on target server | Moved to build pipeline — runs once on our infrastructure |
| Linked Folders, Linked Files | Shared paths and shared files per environment |
| Environment file management | Shared files (e.g. .env) per environment |
| Rollback | One-click rollback to any prior release |
| Maximum Releases setting | Configurable release retention per environment |
| Health Checks | Better Stack integration for telemetry, plus per-deploy success/failure reporting |
| Notifications (Slack, email) | Notifications across Slack, Discord, Microsoft Teams, email, and more integrations |
| Heartbeats | Send deploy events to Better Stack for uptime monitoring and alerting |
Scheduler (Laravel schedule:run monitoring) |
Not natively replicated — see FAQ below |
What DeployHQ adds that Envoyer does not
| Capability | Why it matters |
|---|---|
| Build pipeline running off the target server | composer install --no-dev, npm ci && npm run build, asset compilation all run once on our build infrastructure. Faster deploys, less load on production, and the same artefact ships to every target. |
| Multi-stack support | Ruby, Python, Node, Go, static sites, plus Custom Actions for aws, kubectl, gcloud, and terraform deploys. One dashboard for everything your team ships. |
| Flat per-account pricing | EUR 9 / month (Solo) or EUR 19 / month (Pro) covers unlimited projects. Envoyer's per-project pricing scales linearly with your project count. |
| AI deploy error explanation | When a deploy fails, the failed step is summarised in plain English with a likely fix. |
| DeployHQ CLI plus REST and GraphQL API | Deploy from a browser, your terminal, or a CI step. The CLI returns structured JSON you can pipe through jq for richer CI integration than Envoyer's webhooks. |
| Per-environment permissions | Grant deploy-to-staging without granting deploy-to-production. Useful as your team grows beyond two or three engineers. |
| Optional Managed VPS (beta) | Provision a server inside DeployHQ if you do not already have one. |
Migration in three steps
1. Set up the DeployHQ project
Create a new DeployHQ project for each Envoyer project you are migrating. Connect the same Git repository — DeployHQ generates read-only deploy keys automatically, so you do not need to reuse Envoyer's keys.
Add your existing servers to the project. Reuse the same SSH user and deploy path. Most teams keep both Envoyer and DeployHQ deploying to the same servers in parallel during the cut-over so they can compare outputs before disabling Envoyer.
2. Move composer / npm into the build pipeline
This is the biggest shape-change. In Envoyer, "Install Composer Dependencies" runs on the target server during every deploy. In DeployHQ, it runs once on our build infrastructure and the resulting release is uploaded.
A typical Laravel project's build pipeline:
composer install --no-dev --optimize-autoloader --no-interaction
npm ci
npm run build
These commands run before any file is uploaded to your servers. The compiled vendor/ directory and built assets ship as part of the release. If you have multiple servers, the build runs once and the same artefacts go to all of them — Envoyer would have run composer install separately on each.
If you have project-specific build environment requirements (PHP 8.3 vs 8.2, specific Node version), set them in the build pipeline configuration, or commit a .deploybuild.yaml to your repo.
3. Translate hooks into SSH commands
Envoyer's pre/post-activate custom hooks become DeployHQ SSH commands tied to the appropriate deploy stage:
| Envoyer hook timing | DeployHQ SSH command stage |
|---|---|
| Before "Activate New Release" | After upload, before changing symlink |
| After "Activate New Release" | After deploy |
A typical Laravel project's hooks:
php artisan migrate --force→ SSH command, after upload, before symlink changephp artisan config:cache && php artisan route:cache && php artisan view:cache→ SSH command, after upload (or moved into the build pipeline if your config does not depend on environment values resolved on the target)php artisan queue:restart→ SSH command, after deployphp artisan horizon:terminate→ SSH command, after deploy
If your Envoyer hook scripts referenced {{release}} or {{project}}, the DeployHQ equivalents are %release_path% and %project%. See text variables for the full list.
For most Envoyer projects, end-to-end migration is a half-day per project. Concierge migration is available on Pro and above — point us at your Envoyer project and we will rebuild the DeployHQ equivalent with you on a screenshare.
What teams ask before they switch
What about Envoyer's Scheduler feature? DeployHQ does not natively monitor php artisan schedule:run execution. The pragmatic replacement is a normal cron entry on the server (which is what Envoyer's Scheduler is under the hood, plus monitoring) combined with a heartbeat service like Better Stack — see sending deploy events to Better Stack, which can be extended to monitor scheduled-task heartbeats too. If centralised cron monitoring is a hard requirement for your team, this is the one Envoyer feature DeployHQ does not directly replicate.
Can I keep using my existing Envoyer servers? Yes. DeployHQ deploys to any SSH-reachable host. Bring your own VPS, dedicated server, or cloud instance — the same servers Envoyer was deploying to.
What about heartbeats and health checks? Envoyer has built-in heartbeats; DeployHQ defers to dedicated uptime tools like Better Stack via integration. For most teams the integrated approach is more flexible (one heartbeat dashboard for everything, not just deploy-related checks), but it is one extra tool to configure.
Will my deployment notifications survive? Yes. DeployHQ supports Slack, Discord, Microsoft Teams, email, and many other notification channels via integrations. You configure them per project rather than per channel.
Can I migrate just one project to test, and keep the rest on Envoyer? Yes — this is the recommended approach. Migrate one project, run both dashboards in parallel for a deploy or two, verify the output is identical, then disable Envoyer for that project. Repeat per project until you are ready to cancel Envoyer entirely.
Do I lose Envoyer's Laravel-specific niceties? Some of them, like the Scheduler. But Envoyer's Laravel "niceties" are mostly preset hooks for things like php artisan migrate — which you set up once in DeployHQ and never touch again. The trade-off is gaining a tool that also deploys your Node API and your static site without paying for three different services.
What if I want to roll back? One click. DeployHQ keeps your last N releases on the server (you configure N). Rollback flips the symlink back. No different from Envoyer.
Start your migration
Start a free DeployHQ project — connect your repo, point at one server, and deploy in under 15 minutes. No credit card. Run it side-by-side with Envoyer for a deploy or two before cutting over.
If you also need a server, the Managed VPS beta provisions one inside the same dashboard.
Envoyer is a trademark of Laravel LLC. DeployHQ is not affiliated with Laravel or Envoyer. We just understand what the migration looks like when one dashboard outgrows another.