# Notifly — full text Hosted notification infrastructure for product teams. One API for email, SMS, push, in-app and chat, with workflows, roles and audit logs. Free plan, from $19/mo. This document joins the markdown twins of the main Notifly marketing pages, the same text served at https://notifly.io/index.md, /pricing.md, /compare.md, /integrations.md, /developers.md, /changelog.md, /partners.md, /support.md, /use-cases/digest-notifications.md, /use-cases/react-notification-inbox.md, /use-cases/slack-notifications.md, /use-cases/mailgun-slack-integration.md, /use-cases/firebase-slack-integration.md and one guide per provider at /integrations/.md. The short index is at https://notifly.io/llms.txt. Product and API documentation lives at https://notifly.io/docs and is not duplicated here. --- # Notifly — hosted notification infrastructure Canonical page: https://notifly.io/ Hosted notification infrastructure for product teams. One API for email, SMS, push, in-app and chat, with workflows, roles and audit logs. Free plan, from $19/mo. ## What it is Notifly is a managed notification platform operated by Devino Solutions Inc. One REST API (`POST https://api.notifly.io/v1/events/trigger`) fans a single event out across email, SMS, push, in-app inbox, and chat. It is built on the open-source Novu engine and runs as a hosted service, so there is nothing to install. Not to be confused with: notifly.zone, the "notifly" Hypixel/Minecraft mod, the Notiflix JavaScript library, Notifuse, or Notiflow. This is notifly.io. ## What you get - One API and one workflow definition for all five channels, 70+ providers. - A visual workflow editor with digest, delay, and per-user channel preferences. - Team features on a normal plan rather than an enterprise contract: role-based access control, translations (i18n), audit logs, org switching, MFA, SSO/SCIM. - Client SDKs on npm: `@notiflyio/js`, `@notiflyio/react`, `@notiflyio/nextjs`, `@notiflyio/react-native`, `@notiflyio/api`, `@notiflyio/web-push`, `@notiflyio/capacitor-push`. - A remote MCP server at https://api.notifly.io/mcp for AI agents. ## Plans | Plan | Price | What it includes | | --- | --- | --- | | Free | $0 forever | 10,000 events per month; All 70+ providers, all 5 channels; Up to 20 workflows; Unlimited subscribers; Up to 3 team members; 24-hour activity feed retention; Community support | | Pro | $19 /month | 50,000 events per month; Remove Notifly branding; 7-day activity feed retention; Higher event volumes on request; Priority email support; Try Pro free for 14 days whenever you’re ready, no card needed | | Team | $149 /month | 500,000 events per month; Role-based access control; Translations (i18n); Custom environments & webhooks; Unlimited members & workflows; 90-day retention, 48h support target | | Enterprise | Custom | SSO (SAML / OIDC) + SCIM sync; 5,000,000 events per month; Custom activity feed retention; Priority Slack & email support, 24h target | ## Where to go next - Pricing: https://notifly.io/pricing (markdown: https://notifly.io/pricing.md) - Comparisons: https://notifly.io/compare (markdown: https://notifly.io/compare.md) - Provider integrations: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) - Developer platform: https://notifly.io/developers (markdown: https://notifly.io/developers.md) - Documentation: https://notifly.io/docs - Changelog: https://notifly.io/changelog (markdown: https://notifly.io/changelog.md) - Refer & Earn (referral program): https://notifly.io/partners (markdown: https://notifly.io/partners.md) - Digest notifications: https://notifly.io/use-cases/digest-notifications (markdown: https://notifly.io/use-cases/digest-notifications.md) - React notification inbox: https://notifly.io/use-cases/react-notification-inbox (markdown: https://notifly.io/use-cases/react-notification-inbox.md) - Slack notifications: https://notifly.io/use-cases/slack-notifications (markdown: https://notifly.io/use-cases/slack-notifications.md) - Mailgun Slack integration: https://notifly.io/use-cases/mailgun-slack-integration (markdown: https://notifly.io/use-cases/mailgun-slack-integration.md) - Firebase Slack integration: https://notifly.io/use-cases/firebase-slack-integration (markdown: https://notifly.io/use-cases/firebase-slack-integration.md) - Sign up: https://app.notifly.io/auth/sign-up --- # Notifly pricing Canonical page: https://notifly.io/pricing Flat monthly plans metered on events sent, not on how many people you have. Subscribers are unlimited on every plan, including the free one. Start free; try Pro free for 14 days whenever you're ready, no card needed. | Plan | Price | What it includes | | --- | --- | --- | | Free | $0 forever | 10,000 events per month; All 70+ providers, all 5 channels; Up to 20 workflows; Unlimited subscribers; Up to 3 team members; 24-hour activity feed retention; Community support | | Pro | $19 /month | 50,000 events per month; Remove Notifly branding; 7-day activity feed retention; Higher event volumes on request; Priority email support; Try Pro free for 14 days whenever you’re ready, no card needed | | Team | $149 /month | 500,000 events per month; Role-based access control; Translations (i18n); Custom environments & webhooks; Unlimited members & workflows; 90-day retention, 48h support target | | Enterprise | Custom | SSO (SAML / OIDC) + SCIM sync; 5,000,000 events per month; Custom activity feed retention; Priority Slack & email support, 24h target | Prices in USD. Checkout picks the currency from your location: in a country that uses CAD, EUR, GBP, AUD, BRL, MXN, JPY or PHP it charges a set price in that currency; everywhere else it charges USD. Volumes above a plan are sized on request, not billed as overage. Enterprise is a custom quote — contact sales@notifly.io. ## Frequently asked questions ### What is Notifly? Notifly is hosted notification infrastructure — one API to send email, SMS, push, in-app, and chat notifications, with a visual workflow editor, digest, and per-user channel preferences. Devino runs the platform; you call the API. ### How is Notifly related to Novu? Notifly is built on the open-source Novu notification engine and maintained by Devino as a hosted product. It keeps the core engine and adds guest mode, translations, MFA, RBAC, an audit log, and an organization switcher. The platform itself is a commercial service rather than a distribution you install; the client SDKs are open source. ### Is there anything to install or operate? No. Notifly runs as a managed service — the API, delivery workers, websockets, and datastores are ours to operate. You create an account, take an API key, and trigger workflows over HTTPS from any language. ### What is free versus paid? The free plan includes 10,000 events a month, up to 20 workflows, up to 3 team members, unlimited subscribers, and all 70+ providers across all five channels. Pro at $19/month raises that to 50,000 events, removes Notifly branding from your emails, and extends activity retention to 7 days. Team at $149/month adds 500,000 events, role-based access control, translations, custom environments and webhooks, unlimited members and workflows, and 90-day retention. ### Is there a free trial? Start free. Try Pro free for 14 days whenever you’re ready — no card needed. You start the trial yourself from the dashboard, once per organization; nothing begins automatically at signup. You can also try the product in guest mode before creating an account. ### Does Notifly support SSO and SCIM? Yes. Enterprise supports single sign-on via SAML and OIDC and SCIM directory sync for automated user provisioning and deprovisioning. Contact sales at sales@notifly.io to enable it for your organization. ### Do I pay Notifly for the messages my providers send? No. You connect your own provider credentials — SendGrid, Twilio, FCM, APNs, Slack, and 70+ others — and pay those providers directly at their rates, with no markup from us. Notifly bills one flat monthly plan for the orchestration, and if you outgrow your plan's event allowance we will size a higher volume with you. --- # How Notifly compares Canonical page: https://notifly.io/compare Every claim these pages make about another vendor links that vendor's own documentation, pricing page, or public issue tracker. No benchmarketing. ## Notifly's own position, on every comparison - Flat monthly plans, metered on events sent — never per monthly active user and never per individual send. - A free plan that is a real workspace: 10,000 events a month, all five channels, all 70+ providers, no credit card. - The team features (role-based access control, translations, audit logs, unlimited members and environments) land on the $149 Team plan, not behind an enterprise contract. - Built on the Novu engine and run as a managed service: there is nothing to install, and the platform itself is a commercial hosted product. The client SDKs are open source. ## The comparisons ### Notifly vs Novu The engine relationship, and where each product puts the team features: RBAC, translations, audit logs, org switching, unlimited members and environments. Claims last checked: 2026-10-07 Read it: https://notifly.io/compare/novu ### Notifly vs OneSignal OneSignal's free plan caps mobile push and in-app at 1,000 MAU from Sept–Oct 2026. Notifly meters events, not people — subscribers are unlimited on every plan. Claims last checked: 2026-10-15 Read it: https://notifly.io/compare/onesignal ### Notifly vs Knock Knock bills per message and reserves SAML SSO, SCIM, custom roles, and translations for its Enterprise plan. Notifly's flat plans start at $0 and put roles and translations on a $149 tier. Claims last checked: 2026-10-15 Read it: https://notifly.io/compare/knock ### Notifly vs Courier Courier bills $0.005 per send once past a 10,000 free tier and lists RBAC and the audit trail under Enterprise. At 50,000 a month: $250 against a $19 flat plan. Claims last checked: 2026-10-12 Read it: https://notifly.io/compare/courier ### Notifly vs SuprSend SuprSend counts every channel a notification reaches and keeps RBAC, audit trail and SAML SSO on Enterprise. Notifly meters the trigger event and puts roles on a $149 plan. Claims last checked: 2026-10-07 Read it: https://notifly.io/compare/suprsend ### Notifly vs MagicBell MagicBell's free Builder plan includes 1,000 deliveries a month and its next plan is $249. Notifly's free plan includes 10,000 events, with a $19 plan in between. Claims last checked: 2026-10-07 Read it: https://notifly.io/compare/magicbell ## Pricing breakdowns What one vendor charges, plan by plan, with worked monthly bills; each figure sourced and dated. ### OneSignal pricing What OneSignal costs in 2026: the free plan and its 1,000 MAU cap, Growth at $19 plus $0.012 per mobile MAU, worked bills at 1,000 to 100,000 MAU, and Notifly's flat plans beside them. Claims last checked: 2026-10-12 Read it: https://notifly.io/compare/onesignal/pricing ### Knock pricing What Knock costs in 2026: the free Developer plan, Starter at $250 with 50K messages then $0.005 each, worked bills at 10,000 to 500,000 messages, and Notifly's flat plans beside them. Claims last checked: 2026-10-12 Read it: https://notifly.io/compare/knock/pricing ### Courier pricing What Courier costs in 2026: the free Developer plan with 10,000 sends, Business at $0.005 per send, worked bills at 10,000 to 1,000,000 sends, that email and SMS provider fees bill separately on top, and Notifly's flat plans beside them. Claims last checked: 2026-10-12 Read it: https://notifly.io/compare/courier/pricing --- # Notifly integrations Canonical page: https://notifly.io/integrations Last updated: 2026-10-16 Notifly connects to 81 email, SMS, push and chat providers. You connect each one with your own account and API key, so deliveries leave from your domains and numbers, on your provider plan, and your sender reputation stays yours. On top of them, one API call runs a whole notification workflow: steps across channels, digest, delay and throttle, subscriber preferences checked before each send, an in-app Inbox, and an activity feed that shows what each provider answered. ## Provider setup guides ### SendGrid (Email) Your SendGrid API key, the Global or EU region, and an optional IP pool. Every send is tagged with its workflow as the SendGrid category. Claims last checked: 2026-10-02 Read it: https://notifly.io/integrations/sendgrid (markdown: https://notifly.io/integrations/sendgrid.md) ### Postmark (Email) A Postmark server token and your sender address. Workflows, digests and subscriber preferences run in Notifly; Postmark delivers from your account. Claims last checked: 2026-10-02 Read it: https://notifly.io/integrations/postmark (markdown: https://notifly.io/integrations/postmark.md) ### Resend (Email) A Resend API key and a verified from-address. Messages go out as “Sender name
”, and a refused send records Resend’s own error. Claims last checked: 2026-10-16 Read it: https://notifly.io/integrations/resend (markdown: https://notifly.io/integrations/resend.md) ### Mailgun (Email) A Mailgun API key and sending domain on the US or EU endpoint. Custom headers, reply-to and inline images carry through to Mailgun. Claims last checked: 2026-10-15 Read it: https://notifly.io/integrations/mailgun (markdown: https://notifly.io/integrations/mailgun.md) ### Amazon SES (Email) An IAM access key pair, your region and an optional configuration set. Sends go through the SES v2 API on your AWS account. Claims last checked: 2026-10-16 Read it: https://notifly.io/integrations/amazon-ses (markdown: https://notifly.io/integrations/amazon-ses.md) ### Twilio (SMS) Account SID, auth token and a sender, with optional EU (Ireland) data residency. SMS steps in any workflow route to your Twilio account. Claims last checked: 2026-10-16 Read it: https://notifly.io/integrations/twilio (markdown: https://notifly.io/integrations/twilio.md) ### Vonage (SMS) The API key, API secret and From sender of your Vonage account, listed as Nexmo in the store. SMS steps send through Vonage’s SMS API. Claims last checked: 2026-10-02 Read it: https://notifly.io/integrations/vonage (markdown: https://notifly.io/integrations/vonage.md) ### Firebase Cloud Messaging (Push) A Firebase service-account JSON, device tokens registered per subscriber, one trigger. Tokens FCM reports as invalid are pruned by default. Claims last checked: 2026-10-16 Read it: https://notifly.io/integrations/fcm (markdown: https://notifly.io/integrations/fcm.md) ### APNs (Push) A .p8 signing key with its Key ID, your Team ID and bundle ID, sandbox or production. Tokens APNs rejects as unregistered are pruned by default. Claims last checked: 2026-10-02 Read it: https://notifly.io/integrations/apns (markdown: https://notifly.io/integrations/apns.md) ### Expo Push (Push) An Expo access token and the Expo push tokens your app registers per subscriber. Each device gets its own send; malformed tokens are pruned. Claims last checked: 2026-10-02 Read it: https://notifly.io/integrations/expo (markdown: https://notifly.io/integrations/expo.md) ### OneSignal (Push) Keep OneSignal delivering push: its App ID and API key, player ids or External IDs per subscriber, and the workflow around each send in Notifly. Claims last checked: 2026-10-02 Read it: https://notifly.io/integrations/onesignal (markdown: https://notifly.io/integrations/onesignal.md) ### Slack (Chat) Add the Notifly Slack app, or bring your own. Reach subscribers through an incoming webhook, or a workspace install that posts as the Notifly bot or as your own app’s bot. Claims last checked: 2026-10-13 Read it: https://notifly.io/integrations/slack (markdown: https://notifly.io/integrations/slack.md) ### Microsoft Teams (Chat) Post to a Teams incoming webhook with no credentials, or connect your own Azure bot to message users and channels through the Bot Framework. Claims last checked: 2026-10-08 Read it: https://notifly.io/integrations/microsoft-teams (markdown: https://notifly.io/integrations/microsoft-teams.md) ### WhatsApp Business (Chat) A Meta access token, phone number ID, business account ID and app secret. Messages reach the subscriber’s phone through Meta’s Graph API. Claims last checked: 2026-10-02 Read it: https://notifly.io/integrations/whatsapp-business (markdown: https://notifly.io/integrations/whatsapp-business.md) ## Every provider you can connect The full list from the dashboard's Integration Store, by channel, under the names the store uses. ### Email (20) Anypost, Braze, Brevo (formerly Sendinblue), Custom SMTP, Email Webhook, Infobip, MailerSend, Mailgun, Mailjet, Mailtrap, Mandrill, Microsoft Outlook365, Netcore, Plunk, Postmark, Resend, SendGrid, Sendly, SES, SparkPost ### SMS (38) 46elks, Africa's Talking, Afro Message, Azure Sms, Bandwidth, Brevo, BulkSMS, clickatell, Clicksend, CM.com, Eazy, Firetext, Gupshup, iMedia, Infobip, iSend SMS, iSendPro, Kannel SMS, Kudosity (formerly BurstSMS), Maqsam, MessageBird, Mobishastra, Nexmo, Plivo, RingCentral, Ruach SMS, Sendchamp, SimpleTexting, Sinch, SMS Central, SMS Webhook, sms77, smsmode, SNS, Telnyx, Termii, Twilio, Unifonic ### Push (9) APNs, AppIO, Expo Push, Firebase Cloud Messaging, OneSignal, Push Webhook, Pusher Beams, Pushpad, Web Push (VAPID) ### Chat (14) Chat Webhook, Discord, GetStream, LINE, Mattermost, MSTeams, Rocket.Chat, Ryver, Sendblue, Slack, Telegram, Webex Messaging, WhatsApp Business, Zulip ## In-app needs no provider The in-app channel is Notifly's own Inbox rather than a third-party provider: a real-time feed you embed with the React component or the JavaScript SDK. Channel documentation: https://notifly.io/docs/channels ## Frequently asked questions ### Do I need my own account with each provider? Yes. Every provider listed here connects with your own account and credentials, so messages leave from your sending domains and numbers, show up in your provider's own logs, and are billed to you by the provider. Notifly runs the workflow around each send; it does not resell email, SMS or push. ### What does Notifly charge for if my provider delivers the messages? Events. A Notifly plan meters the workflow triggers you send, not individual messages, so one trigger that reaches email, in-app and push counts once. What each provider charges for its own deliveries stays between you and that provider. ### Can I connect two providers for the same channel? Yes. For email and SMS you can connect several accounts in one environment: one is the primary integration that sends by default, and another active integration takes the send when its conditions match the subscriber or the tenant in the trigger's context. Development and Production keep separate integrations. ### How are provider credentials stored? API keys, tokens, secrets and service-account files are encrypted at rest with AES-256; new and re-saved credentials use authenticated AES-256-GCM. Each provider guide lists which of that provider's fields are encrypted and which, like a sender address or a region, are stored as entered. --- # Notifly for developers Canonical page: https://notifly.io/developers The Notifly developer platform: REST API, interactive reference, OpenAPI 3.x spec, a remote MCP server for AI agents, and a free plan you can start on without a credit card. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## Surfaces - REST API — one versioned `/v1` surface for workflows, subscribers, topics and messages: https://notifly.io/docs/api - Interactive reference, one page per operation: https://notifly.io/docs/api-reference - OpenAPI document: https://api.notifly.io/openapi.json - Remote MCP server (OAuth 2.1): https://api.notifly.io/mcp - Agent setup instructions (MCP + SDK + verify, for any coding agent): https://notifly.io/agent-setup/prompt.md - Per-agent setup guides: https://notifly.io/agent-setup - Channel-agent onboarding (connect a Notifly agent to Slack, Teams and more): https://notifly.io/agents.md ## Onboard your coding agent Paste this sentence into Claude Code, Codex, Cursor, OpenCode or any other coding agent: > Fetch and execute the appropriate instructions to set me up for Notifly from https://notifly.io/agent-setup/prompt.md ## MCP operations Served through Code Mode (the `search_tools` and `execute_typescript` tools): `list_organizations`, `trigger_workflow`, `list_workflows`, `get_workflow`, `list_subscribers`, `get_subscriber`, `list_topics`, `list_notifications`. Add it to a client: ```bash claude mcp add --transport http notifly https://api.notifly.io/mcp ``` ## Server SDKs - Node.js / TypeScript: `npm install @notiflyio/api@0.1.26` - Python: `pip install notifly-sdk==0.1.0` ## Client SDKs on npm `@notiflyio/js`, `@notiflyio/react`, `@notiflyio/nextjs`, `@notiflyio/react-native`, `@notiflyio/web-push`, `@notiflyio/capacitor-push`. --- # Notifly changelog Canonical page: https://notifly.io/changelog RSS: https://notifly.io/changelog/rss.xml What shipped, newest first. ## OpenAPI document rebranded + SDK identity groundwork 2026-07-21 · API, SDK The public OpenAPI document (api.notifly.io/openapi.json) has been rebranded end to end — titles, descriptions, and server URLs reference Notifly surfaces instead of upstream branding. Groundwork for publishing the JavaScript SDKs to npm is in place: package identity and a publish pipeline are prepared. The packages are not yet on npm — until they are, the REST API is the supported integration path. ## Remote MCP server 2026-07-20 · MCP, AI Notifly now ships a remote MCP server, live on api.notifly.io. It includes an OAuth 2.1 authorization server built into the platform, so AI clients connect with a standard OAuth flow — no API-key pasting. Seven tools are exposed over the /mcp endpoint: trigger_workflow, list_workflows, get_workflow, list_subscribers, get_subscriber, list_topics, and list_notifications. ## Enterprise SSO & SCIM 2026-07-12 · Enterprise, Security SAML and OIDC single sign-on via an embedded Ory Polis engine, with SCIM 2.0 directory provisioning for automated user lifecycle management. Organizations can enforce SSO-only sign-in (with owner break-glass) and require MFA at the organization level. ## Data lifecycle & GDPR 2026-07-12 · Compliance Delivery-data retention is now TTL-based and configurable, organizations can export their data, and erasure requests perform a hard delete across the platform's data stores. ## Audit log to compliance grade 2026-07-11 · Enterprise, Security The organization-scoped audit trail now covers the sensitive mutation surface, supports CSV and NDJSON export, and applies configurable retention. ## Guest mode & free trial 2026-06-30 · Product Explore Notifly without creating an account: guest mode spins up a working workspace instantly. (Update 2026-10-07: you now start on the free plan and can try Pro free for 14 days whenever you’re ready.) ## RBAC, MFA, audit log, billing 2026-06-16 · Enterprise, Security Role-based access control, TOTP multi-factor authentication, the audit log, and subscription billing went live. Multi-factor authentication is available on every plan; roles arrive with the Team plan. --- # Notifly Refer & Earn Canonical page: https://notifly.io/partners Earn 30% for a year on everyone you refer to Notifly. Share your link. When someone you refer subscribes, you earn 30% of what they pay for their first 12 months, paid out through Stripe. - Get your link: https://app.notifly.io/refer-and-earn - Partner Terms: https://partners.devino.ca/terms ## The program in four numbers - 30% recurring commission - 12 months per referred customer - $50 minimum payout - $0 to join ## How it works 1. Share your link. Send it to a friend, another team or your audience. 2. They sign up and subscribe. Anyone new to Notifly who signs up through it counts. 3. You earn 30% for 12 months. On every payment they make in that window, renewals included. ## Why we do this We would rather pay the people who recommend Notifly than pay for ads. When someone you bring in subscribes, part of what they pay goes to you. One rate for everyone, no application, nothing beyond the Partner Terms. ## The terms ### How payouts work - Commissions are held up to 120 days to cover refunds and chargebacks; the hold gets shorter as your referrals prove out. - Payouts run through Stripe, so the first withdrawal asks you to complete a one-time Stripe setup. - Payouts start once $50 has cleared. ### What counts - Paid subscriptions and their renewals count, for the referred customer's first 12 months. - The commission is 30% of what they pay. - Your link counts for 90 days from the last click on it. - Refunds and chargebacks reverse the commission. - Your own accounts don't count. ## Questions ### How much do I earn? You earn 30% of what everyone you refer pays Notifly for their first 12 months. It applies to their renewals in that window too, not just the first payment. Every partner earns the same rate, with no cap. ### When do I get paid? Once your cleared earnings reach $50 you can withdraw from the partner portal. Payouts run through Stripe, so the first withdrawal asks you to complete a one-time Stripe setup. ### Why is my commission pending? A commission is pending while the payment it came from can still be refunded or disputed. Commissions are held up to 120 days to cover refunds and chargebacks; the hold gets shorter as your referrals prove out. When the hold ends it is cleared and counts toward your $50 minimum. It shows as paid once a payout reaches you. ### How long does my link count? 90 days from the click. If they sign up later than that, or clear their cookies first, the sign-up isn't credited. ### Who can I refer? Anyone who is new to Notifly. You cannot refer yourself, and a customer who already has an account is not attributed to your link. ### Who can join? Anyone 18 or over. Payouts go through Stripe, so Stripe must support payouts to your country; you'll see that when you first withdraw. ### What happens if someone cancels or refunds? A refunded or charged-back payment takes its commission back. If the commission was already paid out, the amount is netted against your future earnings until it is recovered. ### Do I need to set anything up? No. Your link already exists and earnings accrue without any setup. Stripe payout details are only asked for when you withdraw. ### Do the people I refer get a discount? No. Their price is the same as everyone's; you earn a commission on it. By using the referral program you agree to the Partner Terms (https://partners.devino.ca/terms). --- # Notifly support Canonical page: https://notifly.io/support Write to the address that fits your question. ## Product and account help Questions about sending notifications, workflows, providers, your account or your billing: support@notifly.io ## Sales, pricing and partnerships Plans, pricing, demos, Enterprise and partnership questions: sales@notifly.io ## Community Ask questions, get help from the team and other Notifly users, and suggest features in the Notifly Discord: https://discord.gg/k6etjr83tZ ## Documentation - Notifly docs: https://notifly.io/docs - Slack integration guide: https://notifly.io/integrations/slack (markdown: https://notifly.io/integrations/slack.md) ## The Notifly Slack app Notifly's Slack app only sends the notifications you configure, and uninstalling it from Slack removes the stored connection. Add it to your workspace with Add to Slack on the Slack integration page: https://notifly.io/integrations/slack#slack-app --- # Digest notifications: one message for a burst of events. Canonical page: https://notifly.io/use-cases/digest-notifications Last updated: 2026-10-16 Ten comments in ten minutes should not mean ten emails. A digest step in a Notifly workflow collects the events a subscriber receives over a window and sends one message about all of them. This page covers how the step decides what to hold and when to send, the three kinds of window the workflow editor offers, and a complete example: the workflow, the trigger your backend sends, and the email the subscriber gets. ## How a notification digest works A digest step sits in a workflow between the trigger and the channel steps. The first event for a subscriber opens a digest. Events that arrive for the same subscriber, in the same workflow, while it is open join it instead of running the rest of the workflow themselves. When the window ends, the steps after the digest run **once**, with every collected event available to their templates. - `steps..events`: the collected events, oldest first. Each has an `id`, a `time` and the `payload` its trigger sent. - `steps..eventCount`: how many events the digest holds. - The `toSentence` and `pluralize` Liquid filters turn those into copy. The editor's variable picker offers them as `sentenceSummary` and `countSummary`. Every step after the digest sees the same events: an email, an in-app message, an SMS, a push or a chat message can each summarise the batch in its own words. ## Regular, look-back and scheduled windows In the workflow editor, a digest step's **Digest window** has two tabs, **Regular** and **Scheduled**. A look-back digest is a Regular digest with its **Start digest** option changed. | Window | How you set it | When the digest is sent | | --- | --- | --- | | Regular | **Digest events for** an amount of seconds, minutes, hours, days, weeks or months, with **Start digest** left on **Immediately**. | When that time has passed since the event that opened the digest. | | Look-back | A Regular digest with **Start digest** set to **When events repeat within** 5 minutes, 30 minutes or a custom time. | Straight away, on its own, unless an earlier event for the same subscriber and group arrived within that time and has already gone out. Then the event opens a digest, or joins the one already open, sent when the **Digest events for** time has passed since it opened. | | Scheduled | **Every** minute, hour, day, week or month, **at** a chosen hour and minute, on chosen days for weekly and monthly schedules. | At the next scheduled time, evaluated in the subscriber's timezone: the `timezone` on their subscriber profile, which a trigger can set in `to`. | An earlier event has gone out once it was sent on its own, or once the digest it opened was sent. Events still waiting in an open digest don't count, and neither do events that joined one. Look-back suits alerts where the first one matters: a quiet user gets the first comment immediately, and only a burst is batched. Scheduled suits a daily or weekly summary that should arrive at the same local time for everyone. ## Group events by a key Events are always digested per subscriber. **Group events by** adds one payload variable to that key, stored as `{{payload.}}`, so one subscriber gets a separate digest per post, project or ticket instead of one digest for everything. The example below groups by `{{payload.postId}}`: comments on two different posts produce two emails, each about its own post. ## A worked example: comment notifications The workflow `comment-activity` has two steps: a digest step with the step id `digest-step`, a Regular window of 30 minutes grouped by `{{payload.postId}}`, then an email step. Your backend triggers the workflow once per comment: ```ts // npm install @notiflyio/api@0.1.26 import { Notifly } from "@notiflyio/api"; const notifly = new Notifly({ security: { secretKey: process.env.NOTIFLY_SECRET_KEY } }); // One trigger per comment. The digest step decides what the post's owner receives. await notifly.trigger({ workflowId: "comment-activity", to: { subscriberId: "user_123", email: "owner@example.com" }, payload: { postId: "post_42", authorName: "Ada" }, }); ``` The email step's subject and body read the digest's outputs through the two filters: ```liquid Subject: {{steps.digest-step.events | toSentence: 'payload.authorName', 2, 'other'}} commented on your post You have {{steps.digest-step.eventCount | pluralize: 'new comment', 'new comments'}}. ``` Ada, Grace and Linus comment on the same post at 09:00, 09:10 and 09:20. With the Regular 30-minute window, Ada's comment opens the digest and the other two join it. The post's owner receives one email: - **09:30**: subject "Ada, Grace, and 1 other commented on your post", body "You have 3 new comments." Switch **Start digest** to **When events repeat within** 30 minutes and the same three comments arrive differently. Ada's comment has no earlier one, so it is sent at once. Grace's arrives within 30 minutes of Ada's, which has gone out, so it opens a digest. Linus's comes 20 minutes after Ada's and joins that digest, sent 30 minutes after Grace's: - **09:00**: subject "Ada commented on your post", body "You have 1 new comment." - **09:40**: subject "Grace and Linus commented on your post", body "You have 2 new comments." Timing matters. Had Linus commented at 09:35 instead, Ada's comment would be more than 30 minutes old and Grace's still waiting in its digest, so neither would count, and Linus's comment would go out on its own: - **09:00**: subject "Ada commented on your post", body "You have 1 new comment." - **09:35**: subject "Linus commented on your post", body "You have 1 new comment." - **09:40**: subject "Grace commented on your post", body "You have 1 new comment." ## How long a digest can wait, by plan The longest window a digest step can hold events for depends on the plan. It is checked when you save the workflow, and for a scheduled digest it covers the gap between two runs. | Plan | Longest digest window | | --- | --- | | Free | 24 hours | | Pro | 7 days | | Team | 90 days | | Enterprise | Custom | Each trigger counts as one event on your plan, whether or not a digest folds it into another message: a digest reduces the messages your subscribers receive, not the events you send. The [pricing page](https://notifly.io/pricing) lists each plan's monthly events. ## Go deeper in the docs - [Workflows](https://notifly.io/docs/workflows): how workflows are built in the editor and triggered with one API call. - [In-app inbox](https://notifly.io/docs/inbox): the feed a digest can write one summary to instead of many messages. - [REST API](https://notifly.io/docs/api): triggering workflows over plain HTTP, with authentication and errors. ## Frequently asked questions ### What is a notification digest? A notification digest, also called a digest notification, is one message that summarises several events. Instead of sending a notification per event, a digest step collects the events a subscriber receives over a window and runs the rest of the workflow once, so the subscriber gets, for example, one email about three comments instead of three emails. ### What is the difference between a regular and a scheduled digest? A regular digest opens when an event arrives and is sent once its window, such as 30 minutes, has passed since that event. A scheduled digest is sent at fixed times: its first event waits for the next one, such as every day at 09:00 in the subscriber's timezone, and the events that arrive before then join it. ### What does a look-back window do? It sends an event straight away unless it repeats one that has already gone out. With Start digest set to When events repeat within 30 minutes, an event is delivered on its own unless an earlier event for the same subscriber and group arrived in the last 30 minutes and was already sent, on its own or in a digest it opened; then the new event opens a digest, or joins the one already open. Events still waiting in an open digest don't count as earlier events. ### Can one subscriber get a separate digest per post or project? Yes. Group events by adds a payload variable, such as payload.postId, to the digest key, which always includes the subscriber. Events with different values go into different digests, so each post gets its own summary. ### How long can a digest window be? It depends on the plan: up to 24 hours on Free, 7 days on Pro and 90 days on Team, with a custom limit on Enterprise. The limit is checked when the workflow is saved, and for a scheduled digest it applies to the time between two runs. ### Does a digest lower the number of events I am billed for? No. Every trigger counts as one event on your plan, including the ones a digest folds into another message. What a digest reduces is the number of messages your subscribers receive. ### Can I digest events that arrive as webhooks? Yes. A workflow starts from a trigger call to the Notifly API, so the handler that receives a webhook in your backend triggers the workflow once per incoming event, with the fields you want to group on in the payload. The digest step then batches those events per subscriber, the same as events triggered from any other code. ### Which channels can send a digest? Any step after the digest step. Email, in-app, SMS, push and chat steps all see the collected events and the event count, so each channel can summarise the batch in its own template. ## More use cases - React notification inbox: https://notifly.io/use-cases/react-notification-inbox (markdown: https://notifly.io/use-cases/react-notification-inbox.md) - Slack notifications: https://notifly.io/use-cases/slack-notifications (markdown: https://notifly.io/use-cases/slack-notifications.md) - Mailgun Slack integration: https://notifly.io/use-cases/mailgun-slack-integration (markdown: https://notifly.io/use-cases/mailgun-slack-integration.md) - Firebase Slack integration: https://notifly.io/use-cases/firebase-slack-integration (markdown: https://notifly.io/use-cases/firebase-slack-integration.md) --- # A React notification inbox, without building the backend. Canonical page: https://notifly.io/use-cases/react-notification-inbox Last updated: 2026-09-27 A notification center looks like a bell and a list. Behind it sit a feed per user, read and archived state, a live connection, preferences, and the workflows that decide what lands there. The Notifly Inbox is all of it as one React component on a hosted backend. This page covers what you get, what you can change, and when building your own is the better call. The [in-app inbox docs](https://notifly.io/docs/inbox) cover how the channel works and how to read the feed over the REST API. ## What you get - **A bell and a feed.** `Inbox` renders a bell with an unread count and a popover feed. Notifications update live over a socket connection, with no polling code in your app. - **Read and archive states.** Subscribers mark notifications read or unread, **Mark all as read**, archive and unarchive them, and filter by **Unread only** or **Archived**. - **Tabs.** Split the feed by workflow tags, such as a Comments tab for workflows tagged `comments`. - **Preferences.** A built-in **Preferences** view lets each subscriber choose which workflows and channels reach them, and workflows check those choices before they send. A workflow you mark as a **Critical workflow**, such as a password reset, can't be turned off there. - **Actions and links.** Primary and secondary action buttons per notification, with `onNotificationClick` and `routerPush` to hand navigation to your router. - **Any workflow can write to it.** An in-app step sits in the same workflow as your email, SMS, push and chat steps, and behind a [digest](https://notifly.io/use-cases/digest-notifications) when a burst should arrive as one summary. ## Add it to a React app ```bash npm install @notiflyio/react@3.17.1 ``` Render `Inbox` where the bell should appear. `applicationIdentifier` is the **Application Identifier** on the dashboard's **API Keys** page, `subscriber` is your user's id: the same subscriber id your backend triggers workflows for, and `subscriberHash` is that id signed on your server, as shown below. ```tsx import { Inbox } from "@notiflyio/react"; export function NotificationCenter({ userId, subscriberHash }: { userId: string; subscriberHash: string }) { return ( ); } ``` `backendUrl` already defaults to `https://api.notifly.io`. Set `socketUrl` to `https://ws.notifly.io`, as above, so the live connection goes to Notifly's websocket service. ## Keep each feed to its own user The Application Identifier is public, so without a check anyone could open any subscriber's feed. The check is **Security HMAC encryption** on the environment's in-app integration in the Integration Store: with it on, the Inbox only opens a session whose `subscriberHash` matches the subscriber id, signed with your secret key, and refuses one with a missing or wrong hash. New Production environments, and any you add yourself, enforce `subscriberHash` by default. Only Development starts with the switch off, so you can try the Inbox there with just a subscriber id. An environment created before HMAC became the default can still have it off, so check the switch on its in-app integration before going live. Compute the hash on your server and pass it to the component: ```ts // npm install @notiflyio/api@0.1.26 import { computeSubscriberHash } from "@notiflyio/api"; // On your server, for the signed-in user only: the secret key never reaches the browser. const secretKey = process.env.NOTIFLY_SECRET_KEY; if (!secretKey) throw new Error("NOTIFLY_SECRET_KEY is not set"); const subscriberHash = await computeSubscriberHash(secretKey, user.id); ``` ## Make it look like your product Most changes are props. `appearance` takes a base theme, design variables such as colours, font size and radius, and per-element styles. `localization` replaces any string the Inbox shows. `tabs` splits the feed by workflow tags: ```tsx import { Inbox } from "@notiflyio/react"; import { inboxDarkTheme } from "@notiflyio/react/themes"; export function NotificationCenter({ userId, subscriberHash }: { userId: string; subscriberHash: string }) { return ( ); } ``` - **Your own notification markup.** `renderNotification` replaces each item with your component, or `renderSubject` and `renderBody` replace parts of it. - **Your own layout.** `Bell`, `Notifications` and `Preferences` are separate components you can place inside `Inbox` yourself. - **A fully custom UI.** `NovuProvider` with the `useNotifications` and `useCounts` hooks gives you the data and actions without any of the default interface. ## Build it or use the Inbox? A notification center is more than its UI. This is what each part takes either way: | Part | Build it yourself | With the Notifly Inbox | | --- | --- | --- | | Storage and API | A notifications table with read, seen and archived state, per-user queries, pagination and an API in front of it. | Hosted: every in-app step writes to the subscriber's feed, served from `api.notifly.io`. | | Real-time updates | A socket service, reconnection, and a way for your workers to reach it. | The component keeps a socket connection to `ws.notifly.io`; the feed and unread count update live. | | Interface | Bell, badge, list, empty and loading states, read and archive actions, filters. | `Inbox` renders them; props and render functions change them. | | Preferences | A settings screen, and the send-time logic that honours it. | The Preferences view, checked before each step of every workflow not marked critical. | | Other channels | Separate code for email, SMS and push. | The same workflow adds email, SMS, push and chat steps, with digest and delay. | | Security | Your own authorization on the feed API. | Your server signs the subscriber id; a new environment other than Development refuses a session without the matching hash by default. | | Where the data lives | In your own database. | On the hosted Notifly platform. | Build it yourself when notifications must stay in your own database, or when your design is so far from a feed that you would replace the whole interface anyway. Otherwise the Inbox saves the backend, the socket layer and the preference logic, and leaves the look to you. ## Plans and licensing - **Every plan, Free included.** The Inbox is part of every plan. In-app notifications come from workflows, so each trigger counts as one event, as on any other channel. - **Branding.** The Inbox shows an "Inbox by Notifly" footer. On Pro and above, turn on **Remove Notifly branding** under Settings, Organization, Branding to hide it. [Compare plans](https://notifly.io/pricing). - **License.** The @notiflyio/react and @notiflyio/js packages are open source under the MIT license; the Notifly platform they connect to is closed-source and runs as a hosted service. ## Go deeper in the docs - [In-app inbox](https://notifly.io/docs/inbox): how the in-app channel stores and pushes notifications, and reading the feed over the REST API. - [Workflows](https://notifly.io/docs/workflows): how the workflows that write to the Inbox are built and triggered. - [Getting started](https://notifly.io/docs/getting-started): a workspace, an API key and a first triggered workflow. ## Frequently asked questions ### Is there a React component for an in-app notification center? Yes. The Inbox component from @notiflyio/react renders a bell with an unread count and a live notification feed, with read, archive, tabs and a preferences view built in. You pass it your application identifier, the user's subscriber id and, outside Development, the subscriber hash your server computes for that id. ### Do I need to run a backend for the inbox? No. The feed and its API are hosted at api.notifly.io and the live connection at ws.notifly.io, which the component reaches with socketUrl set to https://ws.notifly.io. Your backend only triggers workflows and signs each user's subscriber id, which new Production environments require by default. ### How do I stop one user from reading another user's notifications? Sign each subscriber id on your server. Security HMAC encryption on the environment's in-app integration is on by default in new Production environments and any you add yourself, and off only in Development. An environment created before HMAC became the default can still have it off, so check the switch before going live. With it on, your server computes an HMAC-SHA256 of the subscriber id with your secret key, for example with computeSubscriberHash from @notiflyio/api, and passes it as subscriberHash; a session with a missing or wrong hash is refused. ### Can I change how the inbox looks? Yes. The appearance prop takes a base theme such as the dark theme, design variables such as colours and radius, and per-element styles; localization replaces any string; and render functions such as renderNotification swap in your own markup. For a completely custom interface, use the hooks instead of the component. ### How do tabs decide which notifications they show? Each tab filters by the tags on the workflow that sent the notification. Tag your comment workflows comments, give a tab the filter tags comments, and that tab shows only their notifications. ### What license are the inbox packages under? The @notiflyio/react and @notiflyio/js packages are open source under the MIT license; the Notifly platform they connect to is closed-source and runs as a hosted service. ### Is the inbox included in the free plan? Yes. The Inbox is on every plan, including Free. Each trigger counts as one event on your plan whatever channels it reaches. The Inbox footer reads Inbox by Notifly, and paid plans from Pro up can remove it. ## More use cases - Digest notifications: https://notifly.io/use-cases/digest-notifications (markdown: https://notifly.io/use-cases/digest-notifications.md) - Slack notifications: https://notifly.io/use-cases/slack-notifications (markdown: https://notifly.io/use-cases/slack-notifications.md) - Mailgun Slack integration: https://notifly.io/use-cases/mailgun-slack-integration (markdown: https://notifly.io/use-cases/mailgun-slack-integration.md) - Firebase Slack integration: https://notifly.io/use-cases/firebase-slack-integration (markdown: https://notifly.io/use-cases/firebase-slack-integration.md) --- # Send Slack notifications from your app with one API call. Canonical page: https://notifly.io/use-cases/slack-notifications Last updated: 2026-10-13 A Slack notification from your product is a message to a person or a channel: a deploy finished, a payment failed, a teammate was mentioned. Notifly sends it from a workflow, so the same trigger can also reach email, SMS, push and the [in-app inbox](https://notifly.io/docs/inbox). Notifly sends as the Notifly Slack app, which you add to your workspace with Add to Slack on the [Slack integration page](https://notifly.io/integrations/slack#slack-app), or as a Slack app you own. The [Slack integration guide](https://notifly.io/integrations/slack) covers your own app's credentials, redirect URL and scopes; this page covers what comes after: choosing a delivery route, the chat step, and the code that sends. ## Two ways to reach Slack Both routes send through your Slack app and an active Slack integration in your Notifly environment. They differ in where the message goes and what you store. | Route | Where the message goes | What you store | Good for | | --- | --- | --- | --- | | Incoming webhook | The channel the webhook URL was created for | The webhook URL, saved on the subscriber | Alerts to a fixed channel, the shortest setup | | Your Slack app's bot | A Slack user or a channel the bot can post to | A workspace connection, created when a user approves your app | Direct messages to individual users | ## How a chat step reaches Slack 1. In the workflow editor, add a **Chat** step and write the message. It can use the trigger's payload, such as `{{payload.service}}`. 2. Trigger the workflow for a subscriber. Before the step runs, Notifly checks that subscriber's preferences for the chat channel, and an opted-out step is skipped with the reason recorded. 3. Notifly finds where that subscriber's Slack messages go, through the environment's active Slack integration: a Slack user or channel from a workspace connection, or the webhook URL saved on the subscriber. 4. It sends with `chat.postMessage` and the bot token, or posts to the webhook, and records Slack's answer in the activity feed. A subscriber with no Slack destination gets no message, and the activity feed says so. Put a [digest](https://notifly.io/use-cases/digest-notifications) step ahead of the chat step when a burst of events should arrive as one Slack message. ## Send to an incoming webhook 1. In your Slack app, turn on **Incoming Webhooks**, add a webhook to the channel and copy its URL. 2. In the dashboard, open **Integration Store**, choose **Connect Provider**, open the **Chat** tab and connect **Slack** with your app's credentials, as the [Slack integration guide](https://notifly.io/integrations/slack) shows. 3. Create each subscriber who should receive messages there and save the webhook URL on them. Saving credentials for a subscriber id Notifly has not seen is rejected. 4. Trigger the workflow that has the Chat step. ```ts // npm install @notiflyio/api@0.1.26 import { Notifly } from "@notiflyio/api"; const secretKey = process.env.NOTIFLY_SECRET_KEY; if (!secretKey) throw new Error("NOTIFLY_SECRET_KEY is not set"); const notifly = new Notifly({ security: { secretKey } }); // Once per subscriber: create them (saving credentials for an unknown subscriber id is rejected), // then save the incoming webhook their Slack messages go to. await notifly.subscribers.create({ subscriberId: "user_123" }); await notifly.subscribers.credentials.update( { providerId: "slack", credentials: { webhookUrl: "https://hooks.slack.com/services/T0000000/B0000000/XXXXXXXXXXXXXXXXXXXXXXXX" }, }, "user_123", ); // Any time after that: trigger the workflow that has a Chat step. await notifly.trigger({ workflowId: "deploy-finished", to: "user_123", payload: { service: "billing-api", status: "succeeded" }, }); ``` ```bash # Once per subscriber: create them, then save their incoming webhook URL. curl -X POST https://api.notifly.io/v1/subscribers \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"subscriberId":"user_123"}' curl -X PUT https://api.notifly.io/v1/subscribers/user_123/credentials \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"providerId":"slack","credentials":{"webhookUrl":"https://hooks.slack.com/services/T0000000/B0000000/XXXXXXXXXXXXXXXXXXXXXXXX"}}' # Any time after that: trigger the workflow. curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"deploy-finished","to":{"subscriberId":"user_123"},"payload":{"service":"billing-api","status":"succeeded"}}' ``` Notifly checks that the webhook URL is a safe public address before it posts, and a blocked URL fails the send. See the [REST API docs](https://notifly.io/docs/api) for authentication and environments. ## Send as your Slack app's bot For direct messages, let each user approve your Slack app once. Your backend creates a connect link, the user approves it in Slack, and Notifly stores the workspace connection. ```ts // npm install @notiflyio/api@0.1.26 import { Notifly } from "@notiflyio/api"; const secretKey = process.env.NOTIFLY_SECRET_KEY; if (!secretKey) throw new Error("NOTIFLY_SECRET_KEY is not set"); const notifly = new Notifly({ security: { secretKey } }); // Create a connect link for the signed-in user (valid for 5 minutes). const { result } = await notifly.integrations.generateConnectOAuthUrl({ integrationIdentifier: "slack-workspace", // the Identifier of your Slack integration subscriberId: "user_123", autoLinkUser: true, // also link the Slack user who approves the install }); // Redirect the user to result.url and let them approve your app in Slack. ``` With `autoLinkUser` the Slack user who approves is linked to that subscriber, so a later trigger addressed to `user_123` reaches them in Slack. The install asks for the bot scopes `chat:write`, `chat:write.public`, `channels:read`, `groups:read`, `users:read` and `users:read.email` unless you pass your own `scope` list. ## One workflow, many Slack destinations Destinations belong to subscribers, not to the workflow. Save a different webhook URL for each subscriber, or connect each user's Slack, and one workflow reaches every one of them. A trigger addressed to a list of subscribers or to a topic fans out the same way, as [Workflows](https://notifly.io/docs/workflows) describes. ## Message options and failures Anything under `overrides.providers.slack` is merged into the message Notifly sends, converted to Slack's snake_case: `unfurlLinks: false` arrives as `unfurl_links`. ```ts await notifly.trigger({ workflowId: "deploy-finished", to: "user_123", payload: { service: "billing-api", status: "succeeded" }, overrides: { providers: { slack: { unfurlLinks: false } } }, }); ``` When Slack refuses a bot message, the step fails with the error Slack returned, such as `Slack API Error: channel_not_found`. A webhook that Slack answers with an error status, such as a revoked URL, fails with `Chat webhook URL blocked: Request failed with status 404`. Either way the activity feed records it. ## Frequently asked questions ### Do I need my own Slack app to send Slack notifications? No. You can add the Notifly Slack app to your workspace with Add to Slack on the Slack integration page and connect it to a Notifly environment; the Chat step then posts as the Notifly bot, as a direct message to the person who connected it. To post in a public channel, add a Slack channel on the subscriber's Credentials tab in the dashboard (it asks for the channel's ID), or register it through the channel endpoints API; the app can post in public channels without being invited. A subscriber with both a channel and a direct-message link gets the message in both places. Messages sent through the Notifly Slack app count toward a limit of 300 per month for each Notifly environment, and after that sends through it fail until the next month; messages sent through your own Slack app do not. With a Slack app you own, the dashboard's Slack integration asks for its App ID, Client ID, Client Secret and Signing Secret, and the incoming webhook route and the bot route both run through that integration. ### Should I use an incoming webhook or the bot? Use a webhook for alerts to one fixed channel: you save a URL on the subscriber and nothing else. Use the bot route when messages should go to individual users, because each user approves your Slack app once and Notifly keeps the workspace connection. ### Can one workflow message many people or channels? Yes. Each subscriber carries their own Slack destination, either a saved webhook URL or a linked Slack user, so a trigger addressed to several subscribers or to a topic sends each of them a message at their own destination. ### How long does a connect link stay valid? Five minutes. The link's state is signed and time-stamped, so Notifly refuses an expired or altered link when Slack sends the user back. Create the link when the user clicks Connect, not ahead of time. ### What happens when Slack rejects a message? The step fails and the activity feed records why. A bot send fails with the error Slack returned, for example Slack API Error: channel_not_found. A webhook that Slack answers with an error status, such as a revoked URL, fails with Chat webhook URL blocked: Request failed with status 404, and a webhook reply that is not ok fails with Slack Webhook Error. ### Can a webhook URL point at any address? No. Notifly checks that the URL is a safe public address before posting, and a blocked URL fails the send with a Chat webhook URL blocked error instead of reaching an internal host. That prefix also starts the error for a webhook Slack answers with an error status. ### Can I change the Slack message options per trigger? Yes. Anything under overrides.providers.slack in the trigger is merged into the message and converted to Slack's snake_case, so unfurlLinks: false arrives as unfurl_links. ## More use cases - Digest notifications: https://notifly.io/use-cases/digest-notifications (markdown: https://notifly.io/use-cases/digest-notifications.md) - React notification inbox: https://notifly.io/use-cases/react-notification-inbox (markdown: https://notifly.io/use-cases/react-notification-inbox.md) - Mailgun Slack integration: https://notifly.io/use-cases/mailgun-slack-integration (markdown: https://notifly.io/use-cases/mailgun-slack-integration.md) - Firebase Slack integration: https://notifly.io/use-cases/firebase-slack-integration (markdown: https://notifly.io/use-cases/firebase-slack-integration.md) --- # Mailgun Slack integration: alerts in Slack, or email and Slack from one API call. Canonical page: https://notifly.io/use-cases/mailgun-slack-integration Last updated: 2026-10-13 Two different jobs hide behind “Mailgun Slack integration”. If you want Mailgun's own deliverability alerts in Slack (blocklist hits, reputation changes, bounce rates), use Mailgun's native Slack integration: it is free, and the four steps below are all it takes. You do not need Notifly for that. If you want your product's notifications to reach people by email through your Mailgun domain and in Slack from a single API call, with routing, per-subscriber preferences and digests, that is what Notifly does. It sends through your own Mailgun account and posts to Slack as the Notifly Slack app or as a Slack app of your own, and the same trigger can also reach the [in-app inbox](https://notifly.io/docs/inbox). ## Mailgun's alerts in Slack: use the native integration Mailgun ships its own Slack integration, “Mailgun Alerts”, for the operational side of email. According to [Mailgun's Slack integration page](https://www.mailgun.com/integrations/slack/) (checked 12 October 2026), it posts to the Slack channels you choose for blocklist monitoring (providers such as Spamhaus and SpamCop), domain and IP reputation changes, bulk email validation completion, delivery failures, and send alerts on complaint, delivery, hard bounce and temporary fail rates. Mailgun lists it as free: you need a Mailgun account and a Slack workspace. 1. Connect Mailgun to Slack from the Mailgun Control Panel, or install the Mailgun Alerts app from Slack. 2. Choose the events that should notify you, such as delivery failures, validation completions and blocklist alerts. 3. Choose the Slack channels and grant the permissions Slack asks for. 4. Save, test, and adjust the notification preferences. Different alerts can go to different channels, for example technical alerts to one and marketing alerts to another. Mailgun notes that alerts specific to its Optimize and Validate plans need those plans. ## Which route for which job | The job | Use | Where you set it up | | --- | --- | --- | | Blocklist, reputation and send-rate alerts for your Mailgun account | Mailgun's native Slack integration | Mailgun Control Panel, or the Mailgun Alerts app in Slack | | A Slack message for each bounce, failed delivery or complaint | A connector such as Zapier | Zapier lists the Mailgun triggers New Bounce Event, New Failed Delivery Event and New Complaint Event and the Slack action Send Channel Message | | Your product's notifications by email and in Slack | A Notifly workflow | The rest of this page | The Zapier row comes from [Zapier's Mailgun and Slack page](https://zapier.com/apps/mailgun/integrations/slack), which lists the New Bounce Event, New Failed Delivery Event and New Complaint Event triggers and a Send Channel Message action for Slack (checked 12 October 2026). This page does not claim that Notifly forwards Mailgun's alerts or delivery events to Slack. ## Your product's email and Slack message from one trigger The other question behind the same search: your app has an event, such as an overdue invoice, and the person involved should get an email through your Mailgun domain and a Slack message, without two integrations in your backend. In Notifly that is one workflow with an **Email** step and a **Chat** step, and one trigger. 1. Connect Mailgun: in the dashboard open **Integration Store**, choose **Connect Provider**, open the **E-Mail** tab and connect **Mailgun** with your API key and sending domain, as the [Mailgun integration guide](https://notifly.io/integrations/mailgun) shows. 2. Connect Slack: the quickest route is the Notifly Slack app. On the [Slack integration page](https://notifly.io/integrations/slack#slack-app) choose Add to Slack, approve it in your workspace, and connect the workspace to a Notifly environment; the Chat step then posts as the Notifly bot, as a direct message to the person who connected it. To post in a public channel of that workspace as well, add the channel's ID on the subscriber's **Credentials** tab. Or open the **Chat** tab in the same sheet and connect **Slack** with your own Slack app's credentials, as the [Slack integration guide](https://notifly.io/integrations/slack) shows. 3. Build the workflow: add an **Email** step and a **Chat** step, and write both messages with the trigger's payload, such as `{{payload.invoiceId}}`. 4. Give each subscriber an email address and a Slack destination, an incoming webhook or a connected Slack user, then trigger the workflow. ```ts // npm install @notiflyio/api@0.1.26 import { Notifly } from "@notiflyio/api"; const secretKey = process.env.NOTIFLY_SECRET_KEY; if (!secretKey) throw new Error("NOTIFLY_SECRET_KEY is not set"); const notifly = new Notifly({ security: { secretKey } }); // Once per subscriber: their email address (the Email step sends there) and the Slack incoming // webhook their Slack messages go to (the Chat step posts there). await notifly.subscribers.create({ subscriberId: "user_123", email: "ada@example.com" }); await notifly.subscribers.credentials.update( { providerId: "slack", credentials: { webhookUrl: "https://hooks.slack.com/services/T0000000/B0000000/XXXXXXXXXXXXXXXXXXXXXXXX" }, }, "user_123", ); // Any time after that: one trigger runs the workflow's Email step and its Chat step. await notifly.trigger({ workflowId: "invoice-overdue", to: "user_123", payload: { invoiceId: "INV-1042", amount: "$480.00", severity: "urgent" }, overrides: { // oTag reaches Mailgun as o:tag. providers: { mailgun: { oTag: ["invoice-overdue"] } }, }, }); ``` Slack delivery works as [Send Slack notifications from your app](https://notifly.io/use-cases/slack-notifications) describes: a webhook route and a bot route, where the bot is the Notifly Slack app or your own Slack app. ## What the workflow adds around the two sends - **Routing with step conditions.** Open **Step conditions** on a step to run it only when a `payload`, `subscriber.data` or `context` field matches, for example the Chat step only when `payload.severity` equals `urgent`. A step whose conditions fail is skipped and the activity feed records it. - **Preferences at send time.** Before each step runs, Notifly checks the subscriber's preferences for that workflow and channel, so someone who opted out of Slack still gets the email, and the reason a step was skipped is recorded. - **Digests.** Put a [digest](https://notifly.io/use-cases/digest-notifications) step ahead of the Email or Chat step when a burst of events should arrive as one message. - **Delivery status.** Every message gets execution details in the activity feed, including the response or error Mailgun or Slack returned. - **Your accounts.** Mail leaves from your Mailgun domain, on your Mailgun plan, and Slack messages are posted by the Notifly Slack app or by your own Slack app, whichever you connected. ## Frequently asked questions ### Does Mailgun have its own Slack integration? Yes. Mailgun Alerts posts deliverability alerts to Slack: blocklist monitoring, domain and IP reputation changes, bulk email validation completion, delivery failures and send-rate alerts. You set it up from the Mailgun Control Panel or by installing the Mailgun Alerts app from Slack, and Mailgun lists it as free. Source: Mailgun's Slack integration page, checked 12 October 2026. ### Do I need Notifly to get Mailgun alerts in Slack? No. Mailgun's native Slack integration covers its own alerts. Notifly is for the notifications your product sends to people, by email through your Mailgun account and in Slack from the same workflow. ### How do I get a Slack message when a Mailgun email bounces? Mailgun's native alerts include delivery failures and bounce-rate alerts. For one Slack post per bounce or complaint, a connector such as Zapier lists the Mailgun triggers New Bounce Event, New Failed Delivery Event and New Complaint Event with a Slack Send Channel Message action (checked 12 October 2026). This page does not claim Notifly forwards Mailgun's delivery events. ### Can one Notifly API call send an email through Mailgun and a Slack message? Yes. A workflow with an Email step and a Chat step runs from one trigger. The Email step goes through your connected Mailgun account to the subscriber's email address, and the Chat step posts to the subscriber's Slack destination through your own Slack app, or, through the Notifly Slack app, as a direct message to the person who connected it. ### Can I send the Slack message only for urgent events? Yes. Open Step conditions on the Chat step and compare a payload, subscriber data or context field, for example payload.severity equals urgent. When the conditions fail the step is skipped and the activity feed records it, while the Email step still runs. ### What if a subscriber has no Slack destination? The Chat step sends nothing for that subscriber and the activity feed says they have no active channel. Their Email step is unaffected. Save a webhook URL on the subscriber or connect their Slack user to add the destination. ### Do I need my own Slack app? No. You can add the Notifly Slack app to your workspace with Add to Slack on the Slack integration page and connect it to a Notifly environment; the Chat step then posts as the Notifly bot, as a direct message to the person who connected it. Messages sent through the Notifly Slack app count toward a limit of 300 per month for each Notifly environment, and after that sends through it fail until the next month; messages sent through your own Slack app do not. Your own Slack app remains an option, for example to post under your own app's name and icon or to send more than that limit: the dashboard's Slack integration then asks for its App ID, Client ID, Client Secret and Signing Secret, and the Slack integration guide covers the redirect URL and scopes. ## More use cases - Digest notifications: https://notifly.io/use-cases/digest-notifications (markdown: https://notifly.io/use-cases/digest-notifications.md) - React notification inbox: https://notifly.io/use-cases/react-notification-inbox (markdown: https://notifly.io/use-cases/react-notification-inbox.md) - Slack notifications: https://notifly.io/use-cases/slack-notifications (markdown: https://notifly.io/use-cases/slack-notifications.md) - Firebase Slack integration: https://notifly.io/use-cases/firebase-slack-integration (markdown: https://notifly.io/use-cases/firebase-slack-integration.md) --- # Firebase Slack integration: Crashlytics alerts in Slack, or push and Slack from one API call. Canonical page: https://notifly.io/use-cases/firebase-slack-integration Last updated: 2026-10-13 Two different jobs hide behind “Firebase Slack integration”. If you want Crashlytics alerts in Slack (new crashes, regressions, trending issues), use Firebase's native Slack integration: you set it up in the Firebase console and the three steps below are all it takes. You do not need Notifly for that. If you want your app's notifications to reach users as Firebase Cloud Messaging push and in Slack from a single API call, with routing, per-subscriber preferences and digests, that is what Notifly does. It sends through your own Firebase project and posts to Slack as the Notifly Slack app or as a Slack app of your own, and the same trigger can also reach the [in-app inbox](https://notifly.io/docs/inbox). ## Crashlytics alerts in Slack: use Firebase's own integration Firebase offers basic alerting integrations that send the default Crashlytics alerts to Slack, Jira and PagerDuty, as [Firebase's Crashlytics alerts documentation](https://firebase.google.com/docs/crashlytics/alerts-basic-integrations) describes (checked 12 October 2026). The page covers Crashlytics alerts only. 1. Create a Slack incoming webhook, following Slack's guide to sending messages with incoming webhooks. 2. In the Firebase console open **Settings > Integrations**, choose **Install** on the Slack card, enter the webhook URL, a default channel and the name messages should post under, then choose **Verify & save**. A confirmation message appears in the default channel. 3. Open **Settings > Alerts**, find the Crashlytics card, pick an app and the Slack channel for it, and choose for each alert type whether it goes to Slack. Repeat for each app. The alert types are new fatal issues, new non-fatal issues, regressed issues, trending issues and increasing-velocity issues. Firebase sends Slack alerts for regressed and increasing-velocity issues by default, and the default channel can be overridden per app or per alert. ## Which route for which job | The job | Use | Where you set it up | | --- | --- | --- | | Crashlytics crash and regression alerts for your developers | Firebase's native Slack integration | Firebase console, Settings > Integrations and Settings > Alerts | | Your app's notifications to users, as push and in Slack | A Notifly workflow | The rest of this page | This page does not claim that Notifly forwards Crashlytics alerts, or any other Firebase alert, to Slack. ## Your app's push and Slack message from one trigger The other question behind the same search: something happens in your product, such as a failed payment, and the person involved should get a push notification on their phone and a Slack message, without two integrations in your backend. In Notifly that is one workflow with a **Push** step and a **Chat** step, and one trigger. 1. Connect Firebase: in the dashboard open **Integration Store**, choose **Connect Provider**, open the **Push** tab and connect **Firebase Cloud Messaging** (FCM) with a service account key from your Firebase project, as the [FCM integration guide](https://notifly.io/integrations/fcm) shows. 2. Connect Slack: the quickest route is the Notifly Slack app. On the [Slack integration page](https://notifly.io/integrations/slack#slack-app) choose Add to Slack, approve it in your workspace, and connect the workspace to a Notifly environment; the Chat step then posts as the Notifly bot, as a direct message to the person who connected it. To post in a public channel of that workspace as well, add the channel's ID on the subscriber's **Credentials** tab. Or open the **Chat** tab in the same sheet and connect **Slack** with your own Slack app's credentials, as the [Slack integration guide](https://notifly.io/integrations/slack) shows. 3. Build the workflow: add a **Push** step and a **Chat** step, and write both messages with the trigger's payload, such as `{{payload.plan}}`. 4. Register each user's FCM token and give them a Slack destination, an incoming webhook or a connected Slack user, then trigger the workflow. ```ts // npm install @notiflyio/api@0.1.26 import { Notifly } from "@notiflyio/api"; const secretKey = process.env.NOTIFLY_SECRET_KEY; if (!secretKey) throw new Error("NOTIFLY_SECRET_KEY is not set"); const notifly = new Notifly({ security: { secretKey } }); // Once per subscriber: the FCM registration token your app sent to your backend, and the Slack // incoming webhook their Slack messages go to. await notifly.subscribers.create({ subscriberId: "user_123" }); await notifly.subscribers.credentials.registerToken({ subscriberId: "user_123", providerId: "fcm", registerSubscriberDeviceTokenRequestDto: { token: "fcm-registration-token-from-the-app" }, }); await notifly.subscribers.credentials.update( { providerId: "slack", credentials: { webhookUrl: "https://hooks.slack.com/services/T0000000/B0000000/XXXXXXXXXXXXXXXXXXXXXXXX" }, }, "user_123", ); // Any time after that: one trigger runs the workflow's Push step and its Chat step. await notifly.trigger({ workflowId: "payment-failed", to: "user_123", payload: { plan: "Pro", severity: "urgent" }, }); ``` Notifly sends one FCM message per registered device token, and a subscriber with no token is skipped and recorded in the activity feed. Slack delivery works as [Send Slack notifications from your app](https://notifly.io/use-cases/slack-notifications) describes. ## Push for the user, Slack for your team Destinations belong to subscribers. Address one trigger to a user and to a team subscriber, and each gets what they have a destination for: the user's devices receive the push, and the team's Slack channel receives the message. ```ts // "oncall" is a subscriber with a Slack webhook and no FCM token; "user_123" has the reverse. // The push goes to user_123's devices, the Slack message to oncall's channel. await notifly.trigger({ workflowId: "payment-failed", to: ["user_123", "oncall"], payload: { plan: "Pro", severity: "urgent" }, }); ``` ## What the workflow adds around the two sends - **Routing with step conditions.** Open **Step conditions** on a step to run it only when a `payload`, `subscriber.data` or `context` field matches, for example the Chat step only when `payload.severity` equals `urgent`. A step whose conditions fail is skipped and the activity feed records it. - **Preferences at send time.** Before each step runs, Notifly checks the subscriber's preferences for that workflow and channel, so someone who muted Slack still gets the push, and the reason a step was skipped is recorded. - **Digests.** Put a [digest](https://notifly.io/use-cases/digest-notifications) step ahead of the Push or Chat step when a burst of events should arrive as one message. - **Clean token lists.** Tokens FCM rejects as unregistered or invalid are removed from the subscriber by default. - **Delivery status.** Every message gets execution details in the activity feed, including the response or error FCM or Slack returned. ## Frequently asked questions ### Does Firebase have its own Slack integration? Yes, for Crashlytics. In the Firebase console, Settings > Integrations has a Slack card you install with a Slack incoming webhook, and Settings > Alerts lets you choose the Slack channel and the alert types per app: new fatal and non-fatal issues, regressed, trending and increasing-velocity issues. Source: Firebase's Crashlytics alerts documentation, checked 12 October 2026. ### Do I need Notifly to get Crashlytics alerts in Slack? No. Firebase's native Slack integration covers Crashlytics alerts. Notifly is for the notifications your app sends to users, as FCM push and in Slack from the same workflow. ### Can one Notifly API call send a Firebase push and a Slack message? Yes. A workflow with a Push step and a Chat step runs from one trigger. The Push step goes through your connected Firebase project to the subscriber's registered FCM tokens, and the Chat step posts to the subscriber's Slack destination through your own Slack app, or, through the Notifly Slack app, as a direct message to the person who connected it. ### Can the user get the push and my team get the Slack message? Yes. Address the trigger to the user and to a team subscriber. Each subscriber's steps run against their own destinations, so the user's devices get the push and the team subscriber's Slack webhook gets the message, with the skipped step recorded for each. ### Can I send the Slack message only for urgent events? Yes. Open Step conditions on the Chat step and compare a payload, subscriber data or context field, for example payload.severity equals urgent. When the conditions fail the step is skipped and the activity feed records it, while the Push step still runs. ### Do I keep my own Firebase project? Yes. You paste a service account key from your Firebase project into the FCM integration, and push is delivered by Firebase Cloud Messaging from your project. The key is stored encrypted at rest. ### Do I need my own Slack app? No. You can add the Notifly Slack app to your workspace with Add to Slack on the Slack integration page and connect it to a Notifly environment; the Chat step then posts as the Notifly bot, as a direct message to the person who connected it. Messages sent through the Notifly Slack app count toward a limit of 300 per month for each Notifly environment, and after that sends through it fail until the next month; messages sent through your own Slack app do not. Your own Slack app remains an option, for example to post under your own app's name and icon or to send more than that limit: the dashboard's Slack integration then asks for its App ID, Client ID, Client Secret and Signing Secret, and the Slack integration guide covers the redirect URL and scopes. ## More use cases - Digest notifications: https://notifly.io/use-cases/digest-notifications (markdown: https://notifly.io/use-cases/digest-notifications.md) - React notification inbox: https://notifly.io/use-cases/react-notification-inbox (markdown: https://notifly.io/use-cases/react-notification-inbox.md) - Slack notifications: https://notifly.io/use-cases/slack-notifications (markdown: https://notifly.io/use-cases/slack-notifications.md) - Mailgun Slack integration: https://notifly.io/use-cases/mailgun-slack-integration (markdown: https://notifly.io/use-cases/mailgun-slack-integration.md) --- # SendGrid with Notifly Canonical page: https://notifly.io/integrations/sendgrid Last updated: 2026-10-02 Your SendGrid API key, the Global or EU region, and an optional IP pool. Every send is tagged with its workflow as the SendGrid category. ## What you need from SendGrid The fields the dashboard asks for when you connect SendGrid, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | API Key | Required | Encrypted at rest | | | Region | Optional | As entered | Select EU if your SendGrid account is hosted in the EU data center Global (US) or EU; Global (US) is preselected. | | IP Pool Name | Optional | As entered | | | From email address | Required | As entered | Use the same email address you used to authenticate your delivery provider | | Sender name | Required | As entered | | ## Connect SendGrid in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the E-Mail tab, find SendGrid and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around SendGrid - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. - Several accounts, one primary: Connect more than one account on this channel. The primary integration is the default; another active integration takes the send when its conditions match the subscriber or the tenant in the trigger’s context. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/sendgrid All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # Postmark with Notifly Canonical page: https://notifly.io/integrations/postmark Last updated: 2026-10-02 A Postmark server token and your sender address. Workflows, digests and subscriber preferences run in Notifly; Postmark delivers from your account. ## What you need from Postmark The fields the dashboard asks for when you connect Postmark, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | API Key | Required | Encrypted at rest | | | From email address | Required | As entered | Use the same email address you used to authenticate your delivery provider | | Sender name | Required | As entered | | ## Connect Postmark in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the E-Mail tab, find Postmark and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around Postmark - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. - Several accounts, one primary: Connect more than one account on this channel. The primary integration is the default; another active integration takes the send when its conditions match the subscriber or the tenant in the trigger’s context. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/postmark All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # Resend with Notifly Canonical page: https://notifly.io/integrations/resend Last updated: 2026-10-16 A Resend API key and a verified from-address. Messages go out as “Sender name
”, and a refused send records Resend’s own error. ## What you need from Resend The fields the dashboard asks for when you connect Resend, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | API Key | Required | Encrypted at rest | | | From email address | Required | As entered | Use the same email address you used to authenticate your delivery provider | | Sender name | Required | As entered | | ## Connect Resend in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the E-Mail tab, find Resend and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around Resend - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. - Several accounts, one primary: Connect more than one account on this channel. The primary integration is the default; another active integration takes the send when its conditions match the subscriber or the tenant in the trigger’s context. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/resend All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # Mailgun with Notifly Canonical page: https://notifly.io/integrations/mailgun Last updated: 2026-10-15 A Mailgun API key and sending domain on the US or EU endpoint. Custom headers, reply-to and inline images carry through to Mailgun. ## What you need from Mailgun The fields the dashboard asks for when you connect Mailgun, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | API Key | Required | Encrypted at rest | | | Base URL | Optional | As entered | | | User name | Required | As entered | | | Domain | Required | As entered | | | From email address | Required | As entered | Use the same email address you used to authenticate your delivery provider | | Sender name | Required | As entered | | ## Connect Mailgun in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the E-Mail tab, find Mailgun and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around Mailgun - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. - Several accounts, one primary: Connect more than one account on this channel. The primary integration is the default; another active integration takes the send when its conditions match the subscriber or the tenant in the trigger’s context. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/mailgun All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # Amazon SES with Notifly Canonical page: https://notifly.io/integrations/amazon-ses Last updated: 2026-10-16 An IAM access key pair, your region and an optional configuration set. Sends go through the SES v2 API on your AWS account. ## What you need from Amazon SES The fields the dashboard asks for when you connect SES, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | Access key ID | Required | Encrypted at rest | | | Secret access key | Required | Encrypted at rest | | | Region | Required | As entered | | | Configuration Set Name | Optional | As entered | The name of the SES Configuration Set to apply to sent emails | | From email address | Required | As entered | Use the same email address you used to authenticate your delivery provider | | Sender name | Required | As entered | | ## Connect Amazon SES in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the E-Mail tab, find SES and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around Amazon SES - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. - Several accounts, one primary: Connect more than one account on this channel. The primary integration is the default; another active integration takes the send when its conditions match the subscriber or the tenant in the trigger’s context. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/amazon-ses All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # Twilio with Notifly Canonical page: https://notifly.io/integrations/twilio Last updated: 2026-10-16 Account SID, auth token and a sender, with optional EU (Ireland) data residency. SMS steps in any workflow route to your Twilio account. ## What you need from Twilio The fields the dashboard asks for when you connect Twilio, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | Account SID | Required | As entered | | | Auth token | Required | Encrypted at rest | | | Data residency region | Optional | As entered | Select EU if your Twilio account uses EU data residency (IE1). Use region-specific credentials. US (default) or EU (Ireland); US (default) is preselected. | | From | Required | As entered | | ## Connect Twilio in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the SMS tab, find Twilio and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around Twilio - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. - Several accounts, one primary: Connect more than one account on this channel. The primary integration is the default; another active integration takes the send when its conditions match the subscriber or the tenant in the trigger’s context. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/twilio All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # Vonage with Notifly Canonical page: https://notifly.io/integrations/vonage Last updated: 2026-10-02 The API key, API secret and From sender of your Vonage account, listed as Nexmo in the store. SMS steps send through Vonage’s SMS API. ## What you need from Vonage The fields the dashboard asks for when you connect Nexmo, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | API Key | Required | Encrypted at rest | | | API secret | Required | Encrypted at rest | | | From | Required | As entered | | ## Connect Vonage in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the SMS tab, find Nexmo and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around Vonage - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. - Several accounts, one primary: Connect more than one account on this channel. The primary integration is the default; another active integration takes the send when its conditions match the subscriber or the tenant in the trigger’s context. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/vonage All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # Firebase Cloud Messaging with Notifly Canonical page: https://notifly.io/integrations/fcm Last updated: 2026-10-16 A Firebase service-account JSON, device tokens registered per subscriber, one trigger. Tokens FCM reports as invalid are pruned by default. ## What you need from Firebase Cloud Messaging The fields the dashboard asks for when you connect Firebase Cloud Messaging, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | Service Account (entire JSON file) | Required | Encrypted at rest | A multi-line field: paste the whole file. | ## Connect Firebase Cloud Messaging in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the Push tab, find Firebase Cloud Messaging and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around Firebase Cloud Messaging - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/fcm All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # APNs with Notifly Canonical page: https://notifly.io/integrations/apns Last updated: 2026-10-02 A .p8 signing key with its Key ID, your Team ID and bundle ID, sandbox or production. Tokens APNs rejects as unregistered are pruned by default. ## What you need from APNs The fields the dashboard asks for when you connect APNs, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | Private Key | Required | Encrypted at rest | A multi-line field: paste the whole file. | | Key ID | Required | Encrypted at rest | | | Team ID | Required | As entered | | | Bundle ID | Required | As entered | | | Production | Optional | As entered | | ## Connect APNs in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the Push tab, find APNs and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around APNs - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/apns All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # Expo Push with Notifly Canonical page: https://notifly.io/integrations/expo Last updated: 2026-10-02 An Expo access token and the Expo push tokens your app registers per subscriber. Each device gets its own send; malformed tokens are pruned. ## What you need from Expo Push The fields the dashboard asks for when you connect Expo Push, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | Access Token | Required | Encrypted at rest | | ## Connect Expo Push in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the Push tab, find Expo Push and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around Expo Push - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/expo All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # OneSignal with Notifly Canonical page: https://notifly.io/integrations/onesignal Last updated: 2026-10-02 Keep OneSignal delivering push: its App ID and API key, player ids or External IDs per subscriber, and the workflow around each send in Notifly. ## What you need from OneSignal The fields the dashboard asks for when you connect OneSignal, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | Application ID | Required | As entered | | | API Key | Required | Encrypted at rest | | | One Signal API | Optional | As entered | Select the One Signal API to use Default (Player Model) or External ID. | ## Connect OneSignal in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the Push tab, find OneSignal and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around OneSignal - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/onesignal All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # Slack with Notifly Canonical page: https://notifly.io/integrations/slack Last updated: 2026-10-13 Add the Notifly Slack app, or bring your own. Reach subscribers through an incoming webhook, or a workspace install that posts as the Notifly bot or as your own app’s bot. ## What you need from Slack The fields the dashboard asks for when you connect Slack, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | App ID | Required | As entered | | | Client ID | Required | As entered | | | Client Secret | Required | Encrypted at rest | | | Signing Secret | Required | Encrypted at rest | Slack app Signing Secret, used for verifying inbound webhook requests | | Redirect URL | Optional | As entered | Redirect after Slack OAuth flow finished (left empty, Notifly shows a confirmation page telling the user they can close the tab) | ## Connect Slack in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the Chat tab, find Slack and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around Slack - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/slack All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # Microsoft Teams with Notifly Canonical page: https://notifly.io/integrations/microsoft-teams Last updated: 2026-10-08 Post to a Teams incoming webhook with no credentials, or connect your own Azure bot to message users and channels through the Bot Framework. ## What you need from Microsoft Teams The fields the dashboard asks for when you connect MSTeams, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | Microsoft App ID | Optional | As entered | From Azure Bot resource → Configuration, or App Registration → Overview (Application client ID) | | Client Secret | Optional | Encrypted at rest | Secret value from App Registration → Certificates & secrets → New client secret | | Directory (tenant) ID | Optional | As entered | From App Registration → Overview (Directory tenant ID) | | Redirect URL | Optional | As entered | Redirect after Teams OAuth flow finished (left empty, Notifly shows a confirmation page telling the user they can close the tab) | ## Connect Microsoft Teams in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the Chat tab, find MSTeams and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around Microsoft Teams - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/microsoft-teams All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md) --- # WhatsApp Business with Notifly Canonical page: https://notifly.io/integrations/whatsapp-business Last updated: 2026-10-02 A Meta access token, phone number ID, business account ID and app secret. Messages reach the subscriber’s phone through Meta’s Graph API. ## What you need from WhatsApp Business The fields the dashboard asks for when you connect WhatsApp Business, from its Delivery Provider Credentials form: | Field | Required | Stored | Notes | | --- | --- | --- | --- | | Access API token | Required | Encrypted at rest | Your WhatsApp Business access API token | | Phone Number Identification | Required | As entered | Your WhatsApp Business phone number identification | | WhatsApp Business Account ID | Required | As entered | Shown directly above the Phone Number ID on the API Setup page in your Meta app | | App Secret | Required | Encrypted at rest | In your Meta app, open App settings > Basic from the bottom of the left sidebar — used to verify inbound webhook signatures | ## Connect WhatsApp Business in the dashboard 1. Sign in at https://app.notifly.io, open Integration Store in the sidebar and choose Connect Provider. 2. In the Connect Integration sheet, open the Chat tab, find WhatsApp Business and choose Connect. 3. Pick the environment the integration belongs to. Development and Production keep separate integrations. 4. Fill in Delivery Provider Credentials with the fields above, then choose Create Integration. ## Trigger a notification ```bash curl -X POST https://api.notifly.io/v1/events/trigger \ -H "Authorization: ApiKey $NOTIFLY_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"","to":{"subscriberId":""},"payload":{"body":"Hello from Notifly"}}' ``` ## What Notifly adds around WhatsApp Business - Workflows around the send: One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps. - Subscriber preferences, enforced at send: Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded. - An in-app Inbox next to it: The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK. - Per-trigger provider parameters: Anything the trigger passes under overrides.providers. is merged into the request Notifly sends to the provider, per workflow or per step. - Activity you can debug: Every message gets execution details in the activity feed, including the response or error the provider returned. - Secrets encrypted at rest: API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers. ## More The full guide, with provider-specific setup, code samples and answers to common questions: https://notifly.io/integrations/whatsapp-business All provider guides: https://notifly.io/integrations (markdown: https://notifly.io/integrations.md)