• Use Cases
  • Pricing
  • Security
  • Docs
Sign InStart free

The outbound integration layer for SaaS products: emit once, then let Meshes handle routing, retries, fan-out, and delivery history.

© Copyright 2026 Meshes, Inc. All Rights Reserved.

About
  • About
  • Security
  • Blog
  • Contact
  • FAQ
Product
  • Pricing
  • Demo
  • Integrations
  • Guides
  • Changelog
  • Status
Compare
  • All comparisons
  • Build vs buy
  • vs Paragon
  • vs Merge
  • vs n8n
  • vs Zapier
  • vs Make
Use Cases
  • All use cases
  • Embedded CRM sync
  • Per-tenant Slack
  • HMAC webhooks
  • Multi-env workspaces
  • Payment failed
  • User signup fan-out
  • Churn prevention
  • Trial expired events
Developers
  • Documentation
  • Agents
  • Tools
  • API Reference
  • MCP Server
  • llms.txt
Legal
  • Terms of Service
  • Privacy Policy
  • Acceptable Use Policy
  • Cookie Policy

Use CasePer-tenant Slack delivery

Per-Tenant Slack Alerts - Route Product Events to Every Customer's Slack

Every customer wants your important product events in their own Slack, not yours. Meshes lets each tenant connect their Slack workspace from inside your product UI, pick a channel, and receive your alerts with per-workspace credentials, retries, and delivery history — so "Slack integration" stops being a feature request and starts being a dashboard toggle.

Start freeView documentation

Event:alert.triggered· Destinations:SlackWebhookResend

The problem

Why this workflow breaks down without a delivery layer

A customer asks for Slack. You add OAuth, build a channel picker, store the token, and ship it. Then the next customer asks to send different event types to different channels, and suddenly you're building per-tenant routing in your own code. By the time you have a dozen customers, Slack has stopped being an integration and started being a subsystem.

The embedded iPaaS pattern keeps this scoped. Each customer connects their own Slack workspace from the Meshes embed, picks their channels, and configures rules — which event types fire to which channel, and whether to alert only above a threshold. Your app emits the product event once; Meshes fans it out to every workspace's Slack connection.

The same model works for your own SaaS. Run separate workspaces for dev, staging, and production so noisy test alerts never wake up on-call in #prod-alerts, and every environment has its own Slack connection it can safely drown.

The event flow

One event in. Every downstream system stays in sync.

Meshes receives the source event once, maps it to the right destinations per workspace, and keeps delivery visible when downstream APIs fail.

Event payload

alert.triggered
{
  "alert_id": "alrt_tyrion_42",
  "account_id": "acc_casterly",
  "severity": "high",
  "resource": "api_latency_p95",
  "value": 1840,
  "threshold": 1000,
  "triggered_at": "2026-04-17T16:02:00Z"
}
Slack

Meshes posts a formatted alert to the channel each customer picked when they connected Slack from your embedded workspace UI.

Every tenant sees product alerts arrive in their own Slack workspace — no per-customer OAuth code, channel lookup, or token refresh in your app.

Webhook

Customers not on Slack can point the same event at a webhook endpoint they register inside the embed.

Long-tail alerting paths (Teams bridges, internal dashboards, on-call systems) fall out of the same product event.

Resend

For customers who prefer email, Meshes can route alert-triggered events to a transactional email template with the alert context pre-filled.

Customer admins get a mailbox trail of triggered alerts without your app owning another delivery path.

How Meshes handles it

What Meshes takes off your team's plate

Instead of maintaining separate workers, retry logic, and visibility per destination, Meshes gives you one event path, destination-aware routing, and built-in delivery guarantees.

From your product

alert.triggeredenters Meshes once

import MeshesEventsClient from '@mesheshq/events';

const meshes = new MeshesEventsClient(
  tenant.meshesPublishableKey,
);

await meshes.emit({
  event: 'alert.triggered',
  resource: 'alert',
  resource_id: 'alrt_tyrion_42',
  payload: {
    alert_id: 'alrt_tyrion_42',
    account_id: 'acc_casterly',
    severity: 'high',
    resource: 'api_latency_p95',
    value: 1840,
    threshold: 1000,
    triggered_at: '2026-04-17T16:02:00Z',
  },
});

Across destinations

Each downstream tool gets the context it needs

  • • Each workspace owns the rules that decide which event severities and types route to Slack vs webhook vs email.
  • • Threshold filters (severity, value, resource) run at the rule layer so only alerts that meet the tenant-defined criteria fan out.
  • • Your app does not need to know which channel, URL, or address each customer configured — it only knows the product event.

On every delivery

Retries, replay, and delivery history stay built in

  • • Slack OAuth tokens stay inside the workspace; a customer reinstalling Slack rotates their own token without touching your code.
  • • Retries and backoff run per workspace, so Slack rate-limiting on one tenant never delays another tenant.
  • • Failed deliveries sit in the workspace dead-letter view the customer already has access to — replay stays in their hands.

Why this matters

Business impact, not just API plumbing

Slack integration as a feature, not a codebase concern

Customers connect their own Slack from inside your product. Your app emits one event per alert; per-tenant channel routing lives in the workspace.

Per-customer noise controls, owned by the customer

The customer picks the severity, the channel, and the filter. Your support team stops fielding "can you quiet the alert for our staging?" requests.

Environment workspaces protect your own Slack too

Run dev, staging, and production workspaces internally so load tests never page #alerts and every environment has its own noisy channel.

Related

Docs, integrations, and deeper architecture reading

Docs

Embedded Workspaces

See how customers connect Slack from inside your product via an embedded Meshes workspace.

Open link

Docs

OAuth Connections in the Embed

Understand the OAuth flow customers use to connect Slack without secrets ever touching your backend.

Open link

Integration

Slack Integration

Per-workspace Slack connections with each tenant's own OAuth token and channel selection.

Open link

Use Case

Embedded Customer CRM Sync

See the same per-workspace pattern applied to HubSpot and Salesforce connections.

Open link

Blog

Event Routing for SaaS

Why threshold-based routing belongs with the event layer, not the alerting subsystem.

Open link

Compare

Meshes vs. Paragon

Compare a focused embedded-delivery layer against an all-in-one platform for customer-facing Slack.

Open link

Next stepStart free or view the documentation

Ship per-customer Slack without per-customer code

Emit one alert event and let Meshes deliver it to every tenant's own Slack workspace — channel, threshold, and credentials configured in the embed.

Start freeView documentation