---
# === IDENTITY ===
id: software/startup-dashboard/notification-automation-rules/2026
canonical_question: "How do I set up dashboard automations — alert triggers, weekly digests, status updates, investor report data pulls?"
aliases:
  - "Dashboard notification automation for startups"
  - "How to set up Slack alerts for KPI thresholds and anomalies"
  - "Weekly startup metrics digest automation"
  - "Automated investor report data pulls from dashboard"
entity_type: execution_recipe
domain: software > startup-dashboard > notification automation rules
region: global
jurisdiction: global
temporal_scope: 2025-2026

# === VERIFICATION ===
last_verified: 2026-03-12
confidence: 0.88
version: 1.0
first_published: 2026-03-12

# === TEMPORAL VALIDITY ===
temporal_validity:
  status: evolving
  last_breaking_change: "Retool Workflows launched event-based triggers in late 2025; Slack deprecated legacy webhooks in favor of Workflow Builder Webhooks; Metabase added Alert API v2 in 2025"
  next_review: 2026-09-08
  change_sensitivity: high

# === CONSTRAINTS ===
constraints:
  - "Slack free plan limits message history to 90 days — notifications older than 90 days are not searchable"
  - "Retool Workflows free tier: 500 runs/month — sufficient for daily alerts + weekly digests but not hourly monitoring"
  - "Metabase alerts require at least a Pro plan ($85/mo) for scheduled pulse delivery; open-source only supports manual sharing"
  - "Email delivery via SendGrid free tier: 100 emails/day — sufficient for investor reports but not mass notifications"
  - "Alert fatigue is the primary failure mode — more than 5 alerts/day per channel leads to alerts being ignored within 2 weeks"
  - "Webhook reliability: Slack webhooks have ~99.5% delivery rate — critical alerts should have email fallback"

# === SKIP CONDITIONS ===
skip_this_unit_if:
  - condition: "User needs to build the data pipeline first, not notifications"
    use_instead: "software/startup-dashboard/data-integration-architecture/2026"
  - condition: "User needs dashboard design patterns, not automation"
    use_instead: "business/startup-metrics/dashboard-design-for-startups/2026"
  - condition: "User needs full investor report template, not data pulls"
    use_instead: "business/startup-metrics/investor-reporting-template/2026"

# === AGENT HINTS ===
inputs_needed:
  - key: notification_channels
    question: "Which notification channels should be used?"
    type: choice
    options: ["Slack only", "Email only", "Slack + Email", "Slack + Email + SMS (for critical alerts)"]
  - key: technical_skill
    question: "What is the user's technical skill level?"
    type: choice
    options: ["non-technical (no-code only)", "semi-technical (can edit code)", "developer (can write code)"]
  - key: budget_for_tools
    question: "What's the tool/API budget?"
    type: choice
    options: ["free tier only", "up to $100/month", "up to $300/month", "no limit"]
  - key: alert_volume
    question: "How many active alerts/automations are needed?"
    type: choice
    options: ["5-10 alerts (basic)", "10-25 alerts (moderate)", "25-50 alerts (comprehensive)", "50+ alerts (enterprise)"]

# === EXECUTION METADATA ===
execution:
  required_inputs:
    - name: "Configured data warehouse with metrics views"
      source: "software/startup-dashboard/data-integration-architecture/2026"
      format: "PostgreSQL/BigQuery with analytics schema containing daily_mrr, customer_ltv, channel_cac views"
    - name: "KPI thresholds and alert conditions"
      source: "business/startup-metrics/startup-kpi-framework-by-stage/2026"
      format: "list of metrics with minimum/maximum thresholds (e.g., MRR drop > 5%, churn > 8%)"
  outputs:
    - name: "Configured alert rules"
      format: "Retool Workflows or Supabase Edge Functions"
      description: "Automated checks that fire Slack/email notifications when KPI thresholds are breached"
    - name: "Weekly metrics digest"
      format: "Scheduled Slack message or email"
      description: "Automated Monday morning summary of key metrics, trends, and anomalies"
    - name: "Investor report data automation"
      format: "Scheduled data export or API endpoint"
      description: "Monthly automated data pull that pre-populates investor report template with latest metrics"
  tools_required:
    - name: "Retool Workflows"
      purpose: "Scheduled and event-based automation with database queries"
      tier: "free"
      cost: "$0 for 500 runs/mo, $10/user/mo for Standard"
      alternatives: ["Supabase Edge Functions (free)", "n8n (self-hosted, free)", "Zapier ($20/mo)"]
    - name: "Slack Incoming Webhooks"
      purpose: "Deliver alert messages to Slack channels"
      tier: "free"
      cost: "$0"
      alternatives: ["Microsoft Teams webhooks", "Discord webhooks"]
    - name: "SendGrid"
      purpose: "Email delivery for weekly digests and investor reports"
      tier: "free"
      cost: "$0 for 100 emails/day"
      alternatives: ["Resend ($0 for 3K emails/mo)", "Postmark ($15/mo for 10K)"]
    - name: "Cron scheduler"
      purpose: "Time-based trigger for scheduled automations"
      tier: "free"
      cost: "$0 (built into Retool/Supabase/n8n)"
      alternatives: ["GitHub Actions (free for public repos)", "Railway cron ($5/mo)"]
  credentials_needed:
    - service: "Slack Webhook"
      type: "Webhook URL"
      where_to_get: "https://api.slack.com/messaging/webhooks"
      free_tier_limits: "Unlimited incoming webhooks"
    - service: "SendGrid"
      type: "API key"
      where_to_get: "https://app.sendgrid.com/settings/api_keys"
      free_tier_limits: "100 emails/day"
    - service: "Data warehouse"
      type: "Connection string"
      where_to_get: "Supabase project settings or BigQuery service account"
      free_tier_limits: "Varies by provider"
  estimated_duration: "4-8 hours for complete setup"
  estimated_cost: "$0 (free tier) to $100-200/month (managed + email delivery)"

# === DISTRIBUTION ===
canonical_source: "https://knowledgelib.io/software/startup-dashboard/notification-automation-rules/2026"
suggested_citation: "Source: knowledgelib.io — AI Knowledge Library (verified 2026-03-12)"

# === RELATED UNITS ===
related_kos:
  depends_on:
    - id: "software/startup-dashboard/data-integration-architecture/2026"
      label: "Data pipeline that feeds the metrics being monitored"
    - id: "business/startup-metrics/startup-kpi-framework-by-stage/2026"
      label: "KPI definitions and thresholds"
  feeds_into:
    - id: "business/startup-metrics/investor-reporting-template/2026"
      label: "Automated data pulls feed investor reports"
    - id: "business/startup-metrics/experiment-tracking-framework/2026"
      label: "Experiment results trigger notifications"
  related_to:
    - id: "business/startup-metrics/dashboard-design-for-startups/2026"
      label: "Dashboard design where alerts are configured"
  alternative_to:
    - id: "business/startup-metrics/okr-setting-methodology/2026"
      label: "Manual OKR review alternative to automated alerts"

# === SOURCES ===
sources:
  - id: src1
    title: "Trigger workflows with Retool Events"
    author: Retool
    url: https://docs.retool.com/workflows/guides/retool-events/notifications
    type: official_docs
    published: 2025-10-01
    reliability: authoritative
  - id: src2
    title: "How to set up alerts and notifications in Retool"
    author: Rapid Dev
    url: https://www.rapidevelopers.com/retool-tutorial/how-to-set-up-alerts-and-notifications-in-retool
    type: technical_guide
    published: 2025-08-01
    reliability: high
  - id: src3
    title: "SMB Dashboarding 2026: Trends That Will Shape Reporting"
    author: Klipfolio
    url: https://www.klipfolio.com/blog/smb-dashboard-reporting-trends-2026-klips
    type: industry_analysis
    published: 2025-12-01
    reliability: high
  - id: src4
    title: "DASH 2025 Act & Automate: Guide to Datadog's Newest Announcements"
    author: Datadog
    url: https://www.datadoghq.com/blog/dash-2025-new-feature-roundup-act/
    type: industry_analysis
    published: 2025-06-01
    reliability: high
  - id: src5
    title: "8 Trends in Dashboards and Reporting in 2026"
    author: ProcureWise
    url: https://procurewise.pl/en/trends-in-dashboards-and-reporting/
    type: industry_report
    published: 2025-11-01
    reliability: moderate
  - id: src6
    title: "Retool Slack Integration"
    author: Retool
    url: https://retool.com/integrations/slack
    type: official_docs
    published: 2025-09-01
    reliability: authoritative
  - id: src7
    title: "How AI Improves Investor Dashboard Design"
    author: Lucid
    url: https://www.lucid.now/blog/how-ai-improves-investor-dashboard-design/
    type: industry_analysis
    published: 2025-10-01
    reliability: moderate
---

# Notification Automation Rules for Startup Dashboards

## Purpose

This recipe configures a complete notification automation system for startup dashboards — threshold-based alerts that fire when KPIs breach limits, scheduled weekly digests summarizing key metrics, automated status updates on pipeline changes, and monthly investor report data pulls. The output is a set of configured automation rules that keep the founding team informed of critical changes without requiring daily dashboard visits. [src1]

## Prerequisites

- [ ] **Configured data warehouse with metrics views** from `data pipeline` — [Data Integration Architecture](/software/startup-dashboard/data-integration-architecture/2026)
- [ ] **KPI definitions with thresholds** from `metrics framework` — [Startup KPI Framework by Stage](/business/startup-metrics/startup-kpi-framework-by-stage/2026)
- [ ] **Slack workspace with dedicated channels** — create #metrics-alerts and #weekly-digest channels
- [ ] **Slack incoming webhook URL** — [Create webhook](https://api.slack.com/messaging/webhooks)
- [ ] **SendGrid API key** (for email notifications) — [SendGrid](https://app.sendgrid.com/settings/api_keys)

## Constraints

- Alert fatigue is the primary failure mode — limit to 3-5 alerts/day per channel maximum. More than 5 daily alerts leads to team ignoring all alerts within 2 weeks. [src3]
- Slack free plan limits message history to 90 days — notifications older than 90 days are not searchable. Critical alerts should also be logged to database.
- Retool Workflows free tier: 500 runs/month — supports ~16 runs/day (sufficient for daily alerts + weekly digest, not hourly checks).
- Webhook reliability is ~99.5% for Slack — critical financial alerts should have email fallback.
- Scheduled automations depend on underlying data freshness — if Stripe syncs every 6 hours, alerts cannot detect issues faster than 6 hours.
- SendGrid free tier: 100 emails/day — sufficient for investor reports and digests, not suitable for real-time email alerts to large teams.

## Tool Selection Decision

```
Which path?
├── Non-technical AND budget = free
│   └── PATH A: Zapier + Slack — basic threshold alerts with no-code rules
├── Semi-technical AND budget = free
│   └── PATH B: Supabase Edge Functions + Slack webhooks — custom SQL-based alerts
├── Developer AND budget = $0-100/mo
│   └── PATH C: Retool Workflows + Slack + SendGrid — full automation suite
└── Developer AND budget = $100+/mo
    └── PATH D: n8n (self-hosted) + Slack + SendGrid — unlimited workflows
```

| Path | Tools | Cost | Setup Time | Alert Complexity |
|------|-------|------|-----------|-----------------|
| A: No-Code | Zapier + Slack | $0-20/mo | 1-2 hours | Basic (single metric thresholds) |
| B: SQL-Based | Supabase Functions + Slack | $0 | 3-5 hours | Medium (multi-metric, SQL queries) |
| C: Full Suite | Retool Workflows + Slack + SendGrid | $0-25/mo | 4-8 hours | High (complex rules, digests, reports) |
| D: Self-Hosted | n8n + Slack + SendGrid | $5-20/mo (hosting) | 6-10 hours | Very High (unlimited complexity) |

## Execution Flow

### Step 1: Define Alert Rules and Thresholds

**Duration**: 1-2 hours
**Tool**: Spreadsheet or Notion

Map each KPI to alert conditions. Every startup dashboard should have these baseline alerts:

```
CRITICAL ALERTS (immediate Slack + email):
├── MRR drops > 10% week-over-week → immediate investigation
├── Churn rate exceeds 8% monthly → retention emergency
├── Cash runway drops below 6 months → financial alert
└── Payment processing failure rate > 2% → Stripe/billing issue

WARNING ALERTS (Slack only, batched daily):
├── MRR growth < 5% month-over-month → growth stall
├── CAC payback period > 18 months → unit economics warning
├── Trial-to-paid conversion drops below 3% → activation issue
└── NPS score drops below 30 → product quality concern

INFO ALERTS (weekly digest only):
├── New customers this week
├── Top churned accounts with reasons
├── Ad spend vs budget variance
└── Pipeline changes (new deals, closed deals)
```

**Verify**: Every metric in the KPI framework has an associated alert level and threshold.
**If failed**: Start with the 4 critical alerts only — add warnings and info alerts after the first week of operation.

### Step 2: Build Alert Query Functions

**Duration**: 2-3 hours
**Tool**: SQL + JavaScript/TypeScript

Create the SQL queries that power each alert:

```sql
-- Critical: MRR week-over-week change
WITH weekly_mrr AS (
  SELECT
    date,
    mrr_cents,
    LAG(mrr_cents, 7) OVER (ORDER BY date) AS mrr_7d_ago
  FROM analytics.daily_mrr
  WHERE date >= CURRENT_DATE - INTERVAL '14 days'
)
SELECT
  date,
  mrr_cents,
  mrr_7d_ago,
  ROUND(100.0 * (mrr_cents - mrr_7d_ago) / NULLIF(mrr_7d_ago, 0), 1) AS wow_change_pct
FROM weekly_mrr
WHERE date = CURRENT_DATE
  AND mrr_7d_ago IS NOT NULL
  AND (mrr_cents - mrr_7d_ago) < -0.10 * mrr_7d_ago;

-- Critical: Monthly churn rate
SELECT
  date_trunc('month', CURRENT_DATE) AS month,
  COUNT(*) FILTER (WHERE status = 'canceled') AS churned,
  COUNT(*) AS total_at_start,
  ROUND(100.0 * COUNT(*) FILTER (WHERE status = 'canceled') / NULLIF(COUNT(*), 0), 1) AS churn_rate_pct
FROM analytics.subscription_status
WHERE period_start >= date_trunc('month', CURRENT_DATE)
HAVING ROUND(100.0 * COUNT(*) FILTER (WHERE status = 'canceled') / NULLIF(COUNT(*), 0), 1) > 8.0;

-- Warning: CAC payback period
SELECT
  channel,
  ROUND(cac_cents / 100.0, 2) AS cac_dollars,
  ROUND(avg_monthly_revenue_cents / 100.0, 2) AS avg_monthly_rev,
  ROUND(cac_cents / NULLIF(avg_monthly_revenue_cents, 0), 1) AS payback_months
FROM analytics.v_channel_cac
WHERE ROUND(cac_cents / NULLIF(avg_monthly_revenue_cents, 0), 1) > 18;
```

**Verify**: Run each query manually — should return zero rows when metrics are healthy, rows when thresholds are breached.
**If failed**: Check that analytics views exist and have recent data. Missing data is the most common cause of false alerts.

### Step 3: Configure Slack Notification Delivery

**Duration**: 1-2 hours
**Tool**: Slack webhooks + JavaScript

Build the notification delivery layer:

```javascript
// notification-sender.js
const SLACK_WEBHOOKS = {
  critical: process.env.SLACK_WEBHOOK_CRITICAL, // #metrics-critical channel
  warnings: process.env.SLACK_WEBHOOK_ALERTS,   // #metrics-alerts channel
  digest: process.env.SLACK_WEBHOOK_DIGEST      // #weekly-digest channel
};

async function sendSlackAlert(level, title, fields, fallbackEmail) {
  const colors = { critical: '#FF0000', warning: '#FFA500', info: '#0088FF' };

  const payload = {
    attachments: [{
      color: colors[level],
      blocks: [
        { type: 'header', text: { type: 'plain_text', text: title } },
        { type: 'section', fields: fields.map(f => ({
          type: 'mrkdwn', text: `*${f.label}*\n${f.value}`
        }))},
        { type: 'context', elements: [{
          type: 'mrkdwn',
          text: `Alert fired at ${new Date().toISOString()} | <https://dashboard.example.com|View Dashboard>`
        }]}
      ]
    }]
  };

  try {
    const res = await fetch(SLACK_WEBHOOKS[level] || SLACK_WEBHOOKS.warnings, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(payload)
    });
    if (!res.ok) throw new Error(`Slack returned ${res.status}`);
  } catch (err) {
    console.error(`Slack delivery failed: ${err.message}`);
    if (fallbackEmail && level === 'critical') {
      await sendEmailFallback(fallbackEmail, title, fields);
    }
  }
}
```

**Verify**: Send a test alert to each Slack channel — confirm message renders with correct color coding and field formatting.
**If failed**: Check webhook URLs are for the correct channels. Regenerate if webhook was created more than 1 year ago.

### Step 4: Build Weekly Metrics Digest

**Duration**: 1-2 hours
**Tool**: Scheduled function (Retool Workflow or Supabase Edge Function)

Create a comprehensive weekly summary that runs every Monday at 8 AM:

```javascript
// weekly-digest.js — runs via cron: "0 8 * * 1" (Monday 8 AM)
async function generateWeeklyDigest(db) {
  const thisWeek = await db.query(`
    SELECT
      (SELECT mrr_cents FROM analytics.daily_mrr WHERE date = CURRENT_DATE - 1) AS current_mrr,
      (SELECT mrr_cents FROM analytics.daily_mrr WHERE date = CURRENT_DATE - 8) AS prev_week_mrr,
      (SELECT COUNT(*) FROM analytics.new_customers WHERE created_at >= CURRENT_DATE - 7) AS new_customers,
      (SELECT COUNT(*) FROM analytics.churned_customers WHERE churned_at >= CURRENT_DATE - 7) AS churned_customers,
      (SELECT SUM(spend_cents) FROM analytics.ad_spend WHERE date >= CURRENT_DATE - 7) AS weekly_ad_spend,
      (SELECT COUNT(*) FROM analytics.active_trials WHERE created_at >= CURRENT_DATE - 7) AS new_trials
  `);

  const d = thisWeek.rows[0];
  const mrrChange = ((d.current_mrr - d.prev_week_mrr) / d.prev_week_mrr * 100).toFixed(1);

  return {
    title: `Weekly Metrics Digest — ${new Date().toLocaleDateString()}`,
    fields: [
      { label: 'MRR', value: `$${(d.current_mrr / 100).toLocaleString()} (${mrrChange > 0 ? '+' : ''}${mrrChange}% WoW)` },
      { label: 'New Customers', value: `${d.new_customers}` },
      { label: 'Churned', value: `${d.churned_customers}` },
      { label: 'New Trials', value: `${d.new_trials}` },
      { label: 'Ad Spend', value: `$${(d.weekly_ad_spend / 100).toLocaleString()}` },
      { label: 'Net New MRR', value: `$${((d.current_mrr - d.prev_week_mrr) / 100).toLocaleString()}` }
    ]
  };
}
```

**Verify**: Trigger the digest manually and confirm all metrics are populated with accurate values matching the dashboard.
**If failed**: Check that analytics views return data for the last 7 days. Empty results usually mean sync delays.

### Step 5: Set Up Investor Report Data Automation

**Duration**: 1-2 hours
**Tool**: Scheduled function (monthly cron)

Automate the monthly data pull that pre-populates investor reports:

```javascript
// investor-data-pull.js — runs via cron: "0 9 1 * *" (1st of month, 9 AM)
async function generateInvestorData(db) {
  const month = await db.query(`
    SELECT
      date_trunc('month', CURRENT_DATE - INTERVAL '1 month') AS reporting_month,
      -- Revenue metrics
      (SELECT mrr_cents FROM analytics.daily_mrr
       WHERE date = (date_trunc('month', CURRENT_DATE) - INTERVAL '1 day')::date) AS ending_mrr,
      -- Growth metrics
      (SELECT COUNT(DISTINCT customer_id) FROM analytics.active_subscriptions
       WHERE date = (date_trunc('month', CURRENT_DATE) - INTERVAL '1 day')::date) AS total_customers,
      -- Unit economics
      (SELECT ROUND(AVG(ltv_cents)::numeric, 0) FROM analytics.v_customer_ltv) AS avg_ltv,
      (SELECT ROUND(AVG(cac_cents)::numeric, 0) FROM analytics.v_channel_cac
       WHERE month = date_trunc('month', CURRENT_DATE - INTERVAL '1 month')) AS avg_cac,
      -- Cash position
      (SELECT balance_cents FROM analytics.bank_balances
       ORDER BY date DESC LIMIT 1) AS cash_balance
  `);

  const data = month.rows[0];
  const report = {
    reporting_period: data.reporting_month,
    mrr: data.ending_mrr / 100,
    arr: (data.ending_mrr * 12) / 100,
    total_customers: data.total_customers,
    ltv_cac_ratio: (data.avg_ltv / data.avg_cac).toFixed(1),
    cash_balance: data.cash_balance / 100,
    generated_at: new Date().toISOString()
  };

  // Send via email and save to shared drive
  await sendEmailFallback(
    process.env.INVESTOR_REPORT_EMAIL,
    `Monthly Metrics — ${data.reporting_month}`,
    Object.entries(report).map(([k, v]) => ({ label: k, value: String(v) }))
  );

  return report;
}
```

**Verify**: Run for the previous month and compare output values with manually computed metrics. All values should match within 2%.
**If failed**: Check date range filters — the most common error is off-by-one month in date calculations.

### Step 6: Schedule All Automations

**Duration**: 30-60 minutes
**Tool**: Cron scheduler (Retool/Supabase/n8n)

Configure the complete automation schedule:

| Automation | Schedule | Channel | Priority |
|-----------|----------|---------|----------|
| Critical KPI checks | Every 6 hours (0 */6 * * *) | #metrics-critical + email | Critical |
| Warning KPI checks | Daily 9 AM (0 9 * * *) | #metrics-alerts | Warning |
| Weekly digest | Monday 8 AM (0 8 * * 1) | #weekly-digest | Info |
| Investor data pull | 1st of month 9 AM (0 9 1 * *) | Email to founders | Info |
| Data freshness check | Every 12 hours (0 */12 * * *) | #metrics-alerts | Warning |
| Alert system health check | Daily 6 AM (0 6 * * *) | #ops (verify alerts are running) | System |

**Verify**: Check the scheduler shows all 6 automations with next run times. Trigger each one manually to verify end-to-end.
**If failed**: Verify timezone settings in the scheduler match the team's timezone.

## Output Schema

```json
{
  "output_type": "notification_automation_system",
  "format": "configured automation rules + delivery channels",
  "components": [
    {"name": "critical_alerts", "type": "SQL queries + threshold rules", "description": "4 critical alerts firing every 6 hours", "required": true},
    {"name": "warning_alerts", "type": "SQL queries + threshold rules", "description": "4 warning alerts firing daily", "required": true},
    {"name": "weekly_digest", "type": "scheduled report", "description": "Monday morning metrics summary", "required": true},
    {"name": "investor_data_pull", "type": "scheduled export", "description": "Monthly automated metrics for investor reports", "required": true},
    {"name": "slack_delivery", "type": "webhook integrations", "description": "3 Slack channels with color-coded alerts", "required": true},
    {"name": "email_fallback", "type": "SendGrid integration", "description": "Email backup for critical alerts and investor reports", "required": true}
  ],
  "expected_alert_count": "8-12 active rules",
  "notification_frequency": "4-8 messages/week under normal conditions"
}
```

## Quality Benchmarks

| Quality Metric | Minimum Acceptable | Good | Excellent |
|---------------|-------------------|------|-----------|
| Alert delivery rate | > 95% | > 99% | 99.9% |
| False positive rate | < 20% | < 10% | < 5% |
| Alert-to-action time (critical) | < 4 hours | < 1 hour | < 15 minutes |
| Weekly digest completeness | > 80% metrics populated | > 95% | 100% |
| Investor report accuracy | Within 5% of manual calc | Within 2% | Within 0.5% |

**If below minimum**: Review alert thresholds for over-sensitivity, check data pipeline freshness, and verify webhook delivery.

## Error Handling

| Error | Likely Cause | Recovery Action |
|-------|-------------|----------------|
| Alert not firing when threshold breached | Data pipeline sync delayed | Check data freshness; add freshness alert as canary |
| False positive alerts | Threshold too sensitive or data anomaly | Widen threshold by 20%; add 2-day moving average smoothing |
| Slack webhook returns 404 | Webhook URL expired or channel deleted | Regenerate webhook in Slack API settings |
| Weekly digest missing metrics | Analytics view returned null | Add COALESCE defaults to SQL queries; log null values |
| Investor report wrong month | Date calculation off-by-one | Use date_trunc('month', CURRENT_DATE - INTERVAL '1 month') consistently |
| Too many alerts (alert fatigue) | Thresholds too tight or too many info alerts | Reduce to critical-only for 1 week, then gradually re-enable |

## Cost Breakdown

| Component | Free Tier | Growth | Scale |
|-----------|-----------|--------|-------|
| Automation engine (Retool/Supabase) | $0 (500 runs/mo) | $10-25/mo | $50-100/mo |
| Slack (webhooks) | $0 | $0 | $0 |
| Email delivery (SendGrid) | $0 (100/day) | $15/mo (50K/mo) | $50/mo |
| SMS alerts (Twilio) | N/A | $0.01/msg | $0.01/msg |
| Monitoring (uptime checks) | $0 | $0 | $10-20/mo |
| **Total** | **$0** | **$25-40/mo** | **$110-170/mo** |

## Anti-Patterns

### Wrong: Alerting on Every Metric Change
Setting up alerts for every KPI in the dashboard. A 2% MRR fluctuation on a Monday morning is normal variance, not a crisis. Teams receiving 10+ alerts/day stop reading them within 2 weeks. [src3]

### Correct: Alert Only on Actionable Thresholds
Critical alerts should trigger only when human intervention is required. Use the "would you wake someone up at 2 AM for this?" test. Anything that doesn't pass goes into the weekly digest, not real-time alerts.

### Wrong: No Email Fallback for Critical Alerts
Relying solely on Slack webhooks for critical financial alerts. Slack has ~99.5% delivery rate — over a year, expect 1-2 missed critical alerts. If MRR drops 15% and the Slack notification fails, the team loses hours of response time.

### Correct: Multi-Channel Critical Alerts
Critical alerts (MRR drop, churn spike, cash runway low) should fire to Slack AND email simultaneously. The email acts as a guaranteed delivery backup.

## When This Matters

Use when the founding team needs to stop checking dashboards multiple times daily and instead receive proactive notifications when metrics need attention. Typically needed after the data integration pipeline is set up and the team has been manually monitoring dashboards for 2-4 weeks.

## Related Units

- [Data Integration Architecture](/software/startup-dashboard/data-integration-architecture/2026)
- [Startup KPI Framework by Stage](/business/startup-metrics/startup-kpi-framework-by-stage/2026)
- [Investor Reporting Template](/business/startup-metrics/investor-reporting-template/2026)
- [Dashboard Design for Startups](/business/startup-metrics/dashboard-design-for-startups/2026)
- [Experiment Tracking Framework](/business/startup-metrics/experiment-tracking-framework/2026)