Alerts Sender: Email, Slack, Discord & Teams
Pricing
from $0.80 / 1,000 message delivereds
Alerts Sender: Email, Slack, Discord & Teams
Send an alert or a digest to email (your Resend, Postmark, SendGrid or SMTP account), Slack, Discord, Microsoft Teams or any webhook, with a table of results rendered for each. Run it after another actor or on a schedule. $1 per 1,000 messages delivered.
Pricing
from $0.80 / 1,000 message delivereds
Rating
0.0
(0)
Developer
CleanPull
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 hours ago
Last modified
Categories
Share
Send an alert or a digest to email (through your own Resend, Postmark, SendGrid or SMTP account), Slack, Discord, Microsoft Teams or any webhook (Zapier, Make, n8n, your own). Write the message in light markdown and add a table of rows, from the input or straight from another run's dataset. Each channel gets its own rendering: an HTML and plain-text email, Slack blocks, a Discord message with embeds, a Teams Adaptive Card, and JSON for webhooks. $1 per 1,000 messages delivered, and nothing for a message that was not delivered.
What you can do with it
- "Email me when a competitor changes a price." Run it after a monitor (as an integration on the monitor's run, or from a task) with Items from a dataset set to that run's dataset, and Skip when there are no items on: you get an email only when something changed.
- "Post a daily digest to our Slack channel." Schedule it with your message and a table of the day's rows.
- "Send the same alert to email, Slack and Teams at once." Every channel you fill in gets it; one failing never stops the others.
- "Replace apify/send-mail in my integrations." Its input keys (
to,cc,bcc,subject,text,html,replyTo,isMock,attachments) are read here too. Add your email provider and key (send-mail sent from Apify's own address; this sends from yours). - "Preview what each channel would receive." With no channel filled in, the run returns the rendered email, Slack, Discord and Teams messages without sending anything (free).
What makes it dependable
- Your accounts, your sender. Email goes from your own domain through your own provider, so it lands like your other mail and the sending reputation is yours. Keys, SMTP passwords and webhook addresses are secret inputs: stored encrypted, never written to the results or the log (results show only the host and last 4 characters).
- Each channel within its limits. Slack sections stay under 3,000 characters and 50 blocks. Discord content stays under 2,000 characters, with at most 10 embeds and 6,000 characters across them, and mentions turned off, so a product name can never ping a channel. Long tables say how many more rows there were.
- Never the same message twice. Resend requests carry an idempotency key made from the run's ID, so a retried request cannot send again. Postmark, SendGrid and your own webhook are retried only when the request never left (or on 429), never after a server error or a dropped connection. Slack, Discord and Teams connectors are retried after a server error (which means not posted), and Teams workflows are not. If you resurrect a run within 24 hours after changing what it sends, Resend answers 409 for the keys it has already seen: start a new run instead.
- Built against spam. At most 50 recipients a run, and each "to" recipient gets their own email (nobody sees the other addresses), unless you add CCs or turn Send separately off. SMTP always uses TLS (STARTTLS on 587, TLS from the start on 465) with a login; port 25 is not used.
- Retries where they help. A 429 waits as the service asks (Retry-After), and a request that never reached the service is retried, three tries in all, with a backoff. Server errors are retried only where that cannot send twice (see above). A wrong address or key (4xx) is reported at once with the service's own message.
- Only real addresses. Chat webhooks must be on the service's own webhook host. No request follows a redirect or connects to a private network address, so a webhook cannot be used to reach inside a network.
- A clear record. One row per channel: sent (with the provider's message ID), failed (with the reason), or skipped.
RUN_SUMMARYgives the outcome:COMPLETE,PARTIAL(some channels failed),SKIPPED,PREVIEWorFAILED.
Input
| Field | What it does |
|---|---|
subject, message, html | The subject, the message in light markdown, and optional HTML of your own for the email |
items, datasetId, itemFields, maxItemsShown | Rows for the table: given directly, or from a dataset; the columns; how many rows to show |
skipIfNoItems | Send nothing when the table would be empty |
emailTo, emailCc, emailBcc, emailSeparately | Recipients (at most 50 in all); each "to" recipient gets their own email unless you add CCs or turn Send separately off |
emailFrom, emailReplyTo | A sender on your own domain, and where replies go |
attachments | Files as [{ "filename", "data" (base64), "contentType" }], at most 10 and 5 MB in all |
preview | Render for every channel and send nothing |
emailProvider, emailApiKey | Resend, Postmark (server token) or SendGrid, with your key |
smtpHost, smtpPort, smtpSecure, smtpUser, smtpPassword | Or any SMTP server with a login (Gmail and Outlook with an app password, Mailgun, your own), over TLS |
slackWebhookUrl, discordWebhookUrl, teamsWebhookUrl, webhookUrl | Chat webhooks and any other endpoint |
Example inputs
After a price monitor, email and Slack, only when it found changes:
{"subject": "Competitor price changes","message": "**Prices moved** since the last check.","datasetId": "{{resource.defaultDatasetId}}","itemFields": ["title", "price", "previous", "changes", "url"],"skipIfNoItems": true,"emailTo": ["me@yourdomain.com"],"emailFrom": "Alerts <alerts@yourdomain.com>","emailProvider": "resend","emailApiKey": "re_…","slackWebhookUrl": "https://hooks.slack.com/services/…"}
A Teams message with a table given directly:
{"subject": "Daily stock check","message": "2 products are out of stock.","items": [{ "product": "Tree Runner 10", "store": "allbirds.com", "stock": "OutOfStock" }],"teamsWebhookUrl": "https://….logic.azure.com/workflows/…"}
Output
One row per channel:
{"recordType": "delivery","channel": "slack","target": "hooks.slack.com/…XYZ1","status": "sent","messageId": null,"items": 2,"at": "2026-10-14T08:00:00.000Z"}
A failed channel has "status": "failed" and the service's answer in reason, for example Resend answered 422: domain is not verified. With no channel, one preview row holds the rendered text, html, slack, discord and teams messages.
Pricing
| Event | Price |
|---|---|
| Message delivered (per email sent, or per chat or webhook post) | $1.00 per 1,000 |
Each run also has a $0.00005 start fee. Failed, skipped and preview runs are not charged beyond the start. Your email provider bills its own sending as usual (Resend, Postmark and SendGrid all have free tiers).
Limits
- Email needs your own provider account and a sender address on a domain it lets you send from. The actor does not send email from shared addresses.
- Example content is never sent. With a channel set and nothing to send, the run stops with a clear message (or sends nothing, with Skip when there are no items on); the form's example is used only for previews.
- Teams accepts messages through a workflow webhook ("Post to a channel when a webhook request is received"). Teams' older connector webhooks are being retired by Microsoft.
- Items from a dataset: pick the dataset in the form (or pass a run's dataset in an integration), which gives this actor read access to that one dataset. The actor runs with limited permissions.
- Nothing delivered: when your settings or endpoint refuse a message (a wrong webhook, key, address or SMTP login, or a dataset that is not there), the run still succeeds, with a
deliveryrow per channel giving thereasonandstatus: "failed"; nothing is charged, and RUN_SUMMARY'soutcomeisFAILED. Only a failure of our own fails the run.
Changelog
- 0.1.x, reliability (2026-10-24): a message refused by your own settings or endpoint ends SUCCEEDED with a row saying why (RUN_SUMMARY still says FAILED), instead of a FAILED run; channels refused before sending now get their own row; input that cannot work is explained in a free row instead of failing. Prices unchanged.
- 0.1 (October 2026): email through Resend, Postmark, SendGrid or SMTP; Slack, Discord, Teams and any webhook; markdown with tables rendered per channel; items from a dataset; skip when empty; preview mode; apify/send-mail's keys accepted.