Automatically email stakeholders when CI/CD pipelines complete — with deploy details, changelog, and rollback instructions in every notification.
Deployment updates buried in Slack channels get lost in the noise. Team leads, product managers, and on-call engineers miss critical deploy notifications because they're scrolling past hundreds of unrelated messages. When something breaks in production, the first question is always 'who deployed what and when?' — and nobody has a clear answer.
MultiMail sends structured deployment notification emails directly to relevant stakeholders when your CI/CD pipeline completes. Each email includes the deploy status, changelog, author, environment, and rollback instructions. With autonomous oversight, notifications fire instantly — no human approval needed for operational emails.
Add a MultiMail API call to the final step of your deployment pipeline. Whether you use GitHub Actions, GitLab CI, or Jenkins, a single HTTP request sends the notification.
Your pipeline constructs the email content with deploy metadata: commit SHA, author, environment (staging/production), changelog from recent commits, and deploy duration.
MultiMail delivers the notification to your distribution list — engineering leads, product managers, on-call engineers, or anyone who needs to know. Different environments can notify different groups.
Every notification is stored in MultiMail, creating a searchable archive of deployment history. When someone asks 'what was deployed last Tuesday?' the answer is in their inbox.
"cm">// .github/actions/notify-deploy.ts
"cm">// Called from your workflow after deployment succeeds
const API = "https://api.multimail.dev/v1";
interface DeployInfo {
environment: string;
commitSha: string;
author: string;
changelog: string;
duration: string;
status: "success" | "failure" | "rollback";
}
async function sendDeployNotification(deploy: DeployInfo) {
const statusEmoji = {
success: "[SUCCESS]",
failure: "[FAILURE]",
rollback: "[ROLLBACK]"
}[deploy.status];
const response = await fetch(`${API}/send`, {
method: "POST",
headers: {
"Authorization": "Bearer " + process.env.MULTIMAIL_API_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({
from: "[email protected]",
to: deploy.environment === "production"
? "[email protected]"
: "[email protected]",
subject: `${statusEmoji} ${deploy.environment} deploy - ${deploy.commitSha.slice(0, 7)}`,
text_body: [
`Deployment ${deploy.status.toUpperCase()}`,
``,
`Environment: ${deploy.environment}`,
`Commit: ${deploy.commitSha}`,
`Author: ${deploy.author}`,
`Duration: ${deploy.duration}`,
``,
`Changelog:`,
deploy.changelog,
``,
deploy.status === "success"
? `Rollback: git revert ${deploy.commitSha} && git push`
: `Action required: Check pipeline logs for details.`
].join("\n")
})
});
console.log(`Notification sent: ${(await response.json()).id}`);
}Add a deployment notification step to your GitHub Actions workflow that fires after a successful deploy.
import requests
import subprocess
import os
API = "https://api.multimail.dev/v1"
HEADERS = {"Authorization": f"Bearer {os.environ[&"cm">#039;MULTIMAIL_API_KEY']}"}
def get_changelog(since_tag: str) -> str:
"""Get commit messages since last deploy tag."""
result = subprocess.run(
["git", "log", f"{since_tag}..HEAD", "--oneline"],
capture_output=True, text=True
)
return result.stdout.strip() or "No changes"
def notify_deploy(
environment: str,
status: str,
commit_sha: str,
author: str
):
changelog = get_changelog(f"deploy-{environment}-prev")
"cm"># Choose recipients by environment
recipients = {
"production": ["[email protected]", "[email protected]"],
"staging": ["[email protected]"],
"development": ["[email protected]"]
}
for recipient in recipients.get(environment, ["[email protected]"]):
requests.post(f"{API}/send", headers=HEADERS, json={
"from": "[email protected]",
"to": recipient,
"subject": f"[{status.upper()}] {environment} deploy {commit_sha[:7]}",
"text_body": (
f"Deploy {status} on {environment}\n\n"
f"Commit: {commit_sha}\n"
f"Author: {author}\n\n"
f"Changelog:\n{changelog}\n\n"
f"---\n"
f"Sent via MultiMail deploy notifications"
)
})
"cm"># Usage in CI pipeline
notify_deploy(
environment=os.environ.get("DEPLOY_ENV", "staging"),
status="success",
commit_sha=os.environ["GITHUB_SHA"],
author=os.environ["GITHUB_ACTOR"]
)A Python script to send deploy notifications from any CI/CD system — Jenkins, GitLab CI, CircleCI, or custom pipelines.
import requests
import os
API = "https://api.multimail.dev/v1"
HEADERS = {"Authorization": f"Bearer {os.environ[&"cm">#039;MULTIMAIL_API_KEY']}"}
def notify_deploy_failure(
environment: str,
commit_sha: str,
author: str,
error_log: str
):
"""Send urgent failure notification to on-call and author."""
# Notify the deploy author
requests.post(f"{API}/send", headers=HEADERS, json={
"from": "[email protected]",
"to": f"{author}@company.com",
"subject": f"[DEPLOY FAILED] Your {environment} deploy {commit_sha[:7]} failed",
"text_body": (
f"Your deployment to {environment} failed.\n\n"
f"Commit: {commit_sha}\n\n"
f"Error summary:\n{error_log[:500]}\n\n"
f"Next steps:\n"
f"1. Check the full pipeline logs\n"
f"2. If blocking, notify "cm">#incidents\n"
f"3. Previous stable: deploy-{environment}-prev tag"
)
})
# Escalate production failures to on-call
if environment == "production":
requests.post(f"{API}/send", headers=HEADERS, json={
"from": "[email protected]",
"to": "[email protected]",
"subject": f"[PRODUCTION DEPLOY FAILED] {commit_sha[:7]} by {author}",
"text_body": (
f"Production deploy failed. Immediate attention required.\n\n"
f"Author: {author}\n"
f"Commit: {commit_sha}\n\n"
f"Error:\n{error_log[:1000]}\n\n"
f"Rollback command:\n"
f"git revert {commit_sha} && git push origin main"
)
})Send immediate failure notifications to on-call engineers with diagnostic context when a deployment fails.
Email creates a permanent, searchable record. When someone asks 'what deployed to production last Friday?' the answer is already in their inbox — no Slack archaeology required.
Route production notifications to the full engineering org, staging updates to the dev team, and failure alerts to on-call. No more noisy all-channel Slack blasts.
Deployment notifications are operational, not customer-facing. Autonomous oversight means they fire the instant your pipeline completes — no approval queue, no delay.
Failed deploys automatically escalate to on-call engineers and the commit author with full error context and rollback instructions. No one has to manually page the team.
A single API call integrates with GitHub Actions, GitLab CI, Jenkins, CircleCI, or any system that can make HTTP requests. No plugins, no vendor lock-in.
Email infrastructure built for AI agents. Verifiable identity, graduated oversight, and a 38-tool MCP server. Formally verified in Lean 4.