---
title: AI Agent Alerts That Explain What Happened and What to Do Next (2026)
description: Slack says Sales down 15% with no next step. The 15% is a schema fixture. Ship metric, contributors, unknowns, and ranked actions. Baymard 70.22% is not your cause.
url: https://www.joinhorizon.co/blog/ai-business-alerts-ecommerce-2026/
datePublished: 2026-08-27T00:00:00.000Z
dateModified: 2026-10-28T00:00:00.000Z
author: palaniappan-p
category: AI Agents
tags: ai-agents, ecommerce, bedrock-agentcore, generative-ai, amazon-bedrock, operations
---

# AI Agent Alerts That Explain What Happened and What to Do Next (2026)

> Slack says Sales down 15% with no next step. The 15% is a schema fixture. Ship metric, contributors, unknowns, and ranked actions. Baymard 70.22% is not your cause.

Monday, leadership Slack pings: **Sales down 15%**, with no tool, no owner, and no next step. Merch pauses a campaign anyway.

This is series part **55**: agent alerts with a **measured delta**, **contributors with tools**, **unknowns where tools are missing**, and **ranked actions with autonomy**. If a contributor has no tool, it is an **unknown**, not a story. The hop contract for "why did revenue move?" is [root cause analysis](https://www.joinhorizon.co/blog/ai-root-cause-analysis-ecommerce-2026/). This post is the **payload** that lands on a human after those hops (or after you admit you cannot run them). After **July 30, 2026**, net-new alert agents should not start on Agents Classic.

The **15%** in the schema is a **fixture**, not a client KPI, and not a FactualMinds measurement. Map the old string to fields: the number belongs in `metric` only after `salesByPeriod` returns; the "why" belongs in `contributors` or `unknowns`; the "so what" belongs in `recommended_actions` with autonomy.

**The job.** Replace bare percentages with a schema: metric, contributors, unknowns, ranked actions.

**This week.** Ship the schema before the channel. Missing hops → `unknowns`.

**A person still signs.** Pause ads, markdowns, PO sends, and any irreversible write.

**Skip it when** you have no metric tool, no comparison window, and no owner for the recommended action.

**Our take:** ship the schema **before** the channel. Trade-off: alerts stay quiet until tools exist. You also stop paging leadership with a percentage and a vibe.

> **Copy the alert schema:** Open [`evidence-based-alert-schema.md`](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/evidence-based-alert-schema.md). Deltas in that file are **fixtures**. Fill **your** tools. Series folder: [`ecommerce-ai-agents-series/`](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/README.md).

FactualMinds is an AWS Select Tier Services Partner. We help merchants wire evidence into the page. We do not sell a 15% recovery.

Detection still lives in [monitoring](https://www.joinhorizon.co/blog/ai-ecommerce-monitoring-agent-2026/). The morning cap still lives in the [daily brief](https://www.joinhorizon.co/blog/ai-ecommerce-operations-agent-daily-priorities-2026/). The always-on rank still lives in the [control tower](https://www.joinhorizon.co/blog/ai-operations-control-tower-ecommerce-2026/).

## Bare percentage vs evidence-based alert

| Traditional | Agent payload |
| ----------- | ------------- |
| `Sales down 15%` | Headline from `salesByPeriod` with window and delta **as measured** |
| A channel story | Contributors with `evidence_tool` + `evidence_ref` |
| Silence on gaps | `unknowns[]` when a hop has no tool |
| "Fix it" | Ranked `recommended_actions` with `autonomy` |
| Implicit human | `human_required: true` unless Policy already allows a narrow auto |

Merchandising pauses the wrong campaign; finance treats a fixture percentage as a board metric; ops marks the alert "done" because the model sounded sure. [Baymard 70.22% abandonment](https://baymard.com/lists/cart-abandonment-rate) is industry context. Pasting it as **your** cause is a failed eval, the same rule as the daily brief and RCA.

The **15%** in the artifact is there so the JSON is readable. Replace it. Do not present it as last week's store.

## The schema (fixtures, not outcomes)

From [`evidence-based-alert-schema.md`](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/evidence-based-alert-schema.md):

```json
{
  "alert_id": "ALT-DEMO-001",
  "headline": "Sales declined vs prior week as measured by salesByPeriod",
  "metric": { "name": "net_revenue", "delta_pct": -15, "evidence_tool": "salesByPeriod" },
  "contributors": [
    {
      "text": "Advertised SKU DEMO-1 ATP 0 from Tue 14:00",
      "evidence_tool": "getInventory",
      "evidence_ref": "sku:DEMO-1",
      "causation": "possible_contributor"
    }
  ],
  "unknowns": ["Paid traffic mix — no sessionsByChannel tool"],
  "recommended_actions": [
    { "rank": 1, "action": "Pause ads on DEMO-1", "autonomy": "recommend" },
    { "rank": 2, "action": "Expedite receipt if PO exists", "autonomy": "draft" },
    { "rank": 3, "action": "Do not markdown without pricing owner", "autonomy": "request_approval" }
  ],
  "human_required": true
}
```

`causation` stays `possible_contributor` until a human signs a narrative. Correlation is not a board slide. That signing step is why RCA exists as its own post: [root-cause investigation playbook](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/root-cause-investigation-playbook.md).

```mermaid
flowchart LR
  Detect[SignalDetected]
  Metric[MeasuredDelta]
  Hops[RCAHopsOrUnknowns]
  Payload[AlertPayload]
  Human[HumanOwner]
  Detect --> Metric
  Metric --> Hops
  Hops --> Payload
  Payload --> Human
```

## Contributors, unknowns, actions

| Field | Allowed | Forbidden |
| ----- | ------- | --------- |
| **metric** | Delta from a named tool + window | A round percentage with no tool |
| **contributors** | Claims the tool actually returned | "Google hates us," "checkout UX," "TikTok" without a matching tool |
| **unknowns** | Named missing hops | Omitting the array so the headline looks complete |
| **recommended_actions** | Ranked, autonomy tagged | Execute by default; markdown as a fact |
| **human_required** | True unless a named Policy allow-list says otherwise | Timeout auto-approve |

Week-one autonomy on actions: **recommend** pause ads, **draft** a receipt expedite, **request_approval** on markdown. The alert does not purchase. Writes stay on domain agents with Cedar; see [HITL](https://www.joinhorizon.co/blog/human-in-the-loop-ai-agents-ecommerce-2026/).

If you have no `sessionsByChannel`, the paid-traffic hop is an unknown. The RCA table already lists allowed vs forbidden claims per hop. Reuse it. Do not invent a second causality engine inside the alert formatter.

## Where this sits (do not merge week one)

| Job | Question | Output |
| --- | -------- | ------ |
| [Monitoring](https://www.joinhorizon.co/blog/ai-ecommerce-monitoring-agent-2026/) | Did a signal fire? | Detect → investigate → recommend |
| [Daily brief](https://www.joinhorizon.co/blog/ai-ecommerce-operations-agent-daily-priorities-2026/) | What needs attention **today**? | Cap **5**, scheduled JSON |
| [RCA](https://www.joinhorizon.co/blog/ai-root-cause-analysis-ecommerce-2026/) | Why did revenue move? | Hop contract, human signs the narrative |
| **This alert** | What happened and what to do **next**? | Schema above |
| [Control tower](https://www.joinhorizon.co/blog/ai-operations-control-tower-ecommerce-2026/) | What requires a human **now**? | Ranked now-list, overflow watch |

Paging on every schema-valid alert without a cap recreates the 23-P1 Slack failure from the daily-brief post. Rank by blast radius. Advertised stockout beats a 2 percent AOV wiggle on a long-tail category. Overflow is watch, not a second "urgent" channel.

## Fail closed, then eval

The formatter is a **schema assembler**, not a novelist. Instruction text that says "be helpful" will fill `unknowns` with prose. Reject the payload instead.

| Eval case | Expect | Fail if |
| --------- | ------ | ------- |
| Metric tool returns a delta | `metric.evidence_tool` set; fixture `-15` replaced in your env | Headline uses **15%** with no tool call |
| ATP join available | Contributor with `getInventory` + `asOf` | Stockout claim from Memory |
| No sessions tool | Paid traffic in `unknowns` | "Ads died" as a contributor |
| Pause recommended | `autonomy: recommend` | Execute pause in week one |
| Industry abandonment cited as cause | Eval fail | [Baymard 70.22%](https://baymard.com/lists/cart-abandonment-rate) in `contributors` |

Goldens belong next to Gateway traces, not in a slide. Ten pass fixtures, three fail fixtures (missing tool, Baymard-as-cause, execute-by-default) is enough to ship the formatter.

## For your technical lead

**On June 17, 2026**, Amazon Bedrock AgentCore Harness reached general availability. It is a config-driven loop on the same platform as Runtime, Memory, Gateway, Identity, and Policy ([What's New](https://aws.amazon.com/about-aws/whats-new/2026/06/amazon-bedrock-agentcore-harness-generally-available/)). **Agents Classic** is in maintenance for new customers after **July 30, 2026**. Net-new alert agents should use [Bedrock AgentCore](https://www.joinhorizon.co/blog/amazon-bedrock-agentcore-production/). Full matrix: [lifecycle roundup](https://www.joinhorizon.co/blog/aws-service-lifecycle-updates-june-2026/).

> **First-party signals we reuse (not eCommerce outcomes):** Gateway server-side tools cut median tool round-trip **~180 ms → ~95 ms** on a **B2B CRM assistant** (12 tools, ~8k turns/day). See [Gateway post](https://www.joinhorizon.co/blog/amazon-bedrock-agentcore-gateway-server-side-tool-execution-2026/). Platform TCO silhouette: support-style AgentCore at **50K sessions/mo ~$791/mo** platform + model ([decision guide](https://www.joinhorizon.co/blog/aws-bedrock-agentcore-vs-amazon-q-enterprise-decision-guide-2026/)). Alert fan-out is cheap; chatty "explain more" threads are not. Model the mix on the [AgentCore pricing calculator](https://www.joinhorizon.co/tools/amazon-bedrock-agentcore-pricing-calculator/). Treat **~$791/mo** as a **platform cost floor to plan against**, not as GMV recovered from better alerts.

Use **Harness** to assemble the payload from read tools. Use **Runtime plus Strands** if you fan out to RCA and exception specialists with hop caps.

| Piece | Role here |
| ----- | --------- |
| **Gateway** | `salesByPeriod`, `getInventory`, and only the hops you actually have |
| **Policy (Cedar)** | Default-deny pause, markdown, PO send from the alert role |
| **Identity** | Associate channel. Shopper tokens DENY alert writes |
| **Observability** | Missing `evidence_tool`, contributor without tool, execute autonomy in week one |

There is **no native Shopify AgentCore connector**. Wrap Admin or warehouse APIs yourself. Gateway **~180 → ~95 ms** is the CRM canary: useful for tool placement, useless as a promise that the alert will "feel instant" once OMS and ads APIs join.

> **What broke:** First formatter used the instruction "explain the sales drop." It emitted Sales down 15% (the fixture) plus a paid-social story. `sessionsByChannel` was not on the OpenAPI. **Detection:** eval that requires `evidence_tool` on every contributor; Gateway trace showed only `salesByPeriod`. **Fix:** put paid traffic in `unknowns`; keep ATP contributor only after `getInventory`; mark causation `possible_contributor`; autonomy recommend on pause. **Lesson:** a percentage without a tool is a rumor. A contributor without a tool is fiction.

A related failure: `recommended_actions` defaulted to execute so the page would "close itself." A fixture pause fired on the wrong campaign because the ads join was stale. **Fix:** recommend; HITL for pause until the join carries `asOf`.

## What to do this week

1. Copy [`evidence-based-alert-schema.md`](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/evidence-based-alert-schema.md). Treat `-15` as a fixture.
2. Inventory metric + hop tools you actually have. Missing hops → `unknowns`.
3. Wire detect from [monitoring](https://www.joinhorizon.co/blog/ai-ecommerce-monitoring-agent-2026/); do not detect inside the formatter.
4. Reuse RCA hops: [playbook](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/root-cause-investigation-playbook.md) and [RCA post](https://www.joinhorizon.co/blog/ai-root-cause-analysis-ecommerce-2026/).
5. Tag every action with autonomy. Default recommend / draft. No execute in week one.
6. Reject payloads missing `evidence_tool` on metric or contributors.
7. Cap live pages. Do not duplicate the [daily brief](https://www.joinhorizon.co/blog/ai-ecommerce-operations-agent-daily-priorities-2026/) into a second firehose.
8. Run [`monday-checklist.md`](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/monday-checklist.md).
9. Model sessions on the [AgentCore pricing calculator](https://www.joinhorizon.co/tools/amazon-bedrock-agentcore-pricing-calculator/).
10. [Contact us](https://www.joinhorizon.co/contact-us/). Architecture: [Amazon Bedrock](https://www.joinhorizon.co/services/aws-bedrock/).

If you only do one thing: **forbid a percentage with no tool**. Put the gap in `unknowns`.

## What this post doesn't cover

- Always-on signal catalog and detectors: [monitoring](https://www.joinhorizon.co/blog/ai-ecommerce-monitoring-agent-2026/)
- Scheduled five-priority brief: [daily operations agent](https://www.joinhorizon.co/blog/ai-ecommerce-operations-agent-daily-priorities-2026/)
- Full RCA hop table and human-signed narrative: [root cause analysis](https://www.joinhorizon.co/blog/ai-root-cause-analysis-ecommerce-2026/)
- Strategic now-list architecture: [control tower](https://www.joinhorizon.co/blog/ai-operations-control-tower-ecommerce-2026/)
- A measured "alert quality" or GMV recovery from a named client
- The fixture 15% presented as last week's store
- A native Shopify AgentCore connector

## FAQ

### When should you NOT send an AI business alert?

Skip the alert when you have no metric tool, no comparison window, and no owner for the recommended action. A model that pastes Sales down 15% without `salesByPeriod` is a rumor. Also skip a live page if the same five items already sit in the scheduled daily brief and nobody will read a second channel.

### What could go wrong if contributors have no evidence_tool?

The model will invent a channel story. Sample turns blamed paid traffic while sessionsByChannel was never called. Detection: evals that fail when a contributor lacks evidence_tool or when causation is stated as fact. Fix: mark it unknown. Link RCA hops; do not fill the gap with language.

### Is the 15% sales drop a FactualMinds store KPI?

No. It is a fixture in the evidence-based alert schema so the payload shape is obvious. Do not cite it in a business case. Measure your own delta with your own salesByPeriod window.

### What could go wrong if recommended_actions default to execute?

You pause the wrong campaign, markdown without a pricing owner, or send a PO from an alert. Rank actions. Tag autonomy. Week-one default is recommend or draft. Request approval for irreversible writes. The alert is not a purchaser.

### How is this different from monitoring, the daily brief, or RCA?

Monitoring decides that a signal fired. The daily brief is a scheduled five-item JSON. RCA is the hop contract for why revenue moved. This post is the alert payload: headline plus contributors plus unknowns plus ranked next actions. Share evidence fields. Do not merge the four jobs into one prompt in week one.

### Harness or Runtime for evidence-based alerts?

Harness is enough to assemble a schema-constrained payload from named read tools after a detector fires. Use Runtime plus Strands if alert assembly fans out to RCA and exception specialists with hop caps. Net-new builds use AgentCore, not Agents Classic after July 30, 2026.

---

Need alerts that carry evidence instead of a bare percentage? [Contact FactualMinds](https://www.joinhorizon.co/contact-us/) for an architecture conversation, or start from the [RCA playbook](https://www.joinhorizon.co/blog/ai-root-cause-analysis-ecommerce-2026/).

## How the business alerts stays bounded

Send an alert that states what happened, the evidence, and the next human action.

- **Maturity:** Level 2 — reference architecture
- **Risk:** medium
- **Oversight:** monitored
- **Starts when:** A monitor or exception raises an event.
- **Tools:** Reads only, through named tools. No shell, no unrestricted SQL, and no undeclared API.
- **Stops for a person:** The alert does not execute the next action.
- **Checked by:** Evidence and the suggested owner are both present. Otherwise the alert is not sent.
- **Untrusted data:** Event payloads that try to mark themselves already handled.
- **If it fails:** If the business alerts stops, name the reason: completed, budget_exceeded, timed_out, cancelled, guardrail_blocked, approval_required, tool_failure, verification_failed, or partial_completion. Retry a timeout at most twice. Back off on rate limits. After repeated verification failure, escalate. Stop when the budget is exhausted or a permission is denied. No unbounded loop. The alert does not execute the next action.
- **Lifecycle:** Explore, then act, then confirm, then verify. Explore gathers the context for the business alerts. Act stays reversible. Confirm stops before an irreversible step. Verify is a separate check of the outcome.

Reference architecture, not a published production deployment. The shared contract is the [AWS store-agent architecture](https://www.joinhorizon.co/blog/aws-ai-agents-for-ecommerce-factualminds-2026/#operating-contract).

## FAQ

### When should you NOT send an AI business alert?
Skip the alert when you have no metric tool, no comparison window, and no owner for the recommended action. A model that pastes Sales down 15% without salesByPeriod is a rumor. Also skip a live page if the same five items already sit in the scheduled daily brief and nobody will read a second channel.

### What could go wrong if contributors have no evidence_tool?
The model will invent a channel story. Sample turns blamed paid traffic while sessionsByChannel was never called. Detection: evals that fail when a contributor lacks evidence_tool or when causation is stated as fact. Fix: mark it unknown. Link RCA hops; do not fill the gap with language.

### Is the 15% sales drop a FactualMinds store KPI?
No. It is a fixture in the evidence-based alert schema so the payload shape is obvious. Do not cite it in a business case. Measure your own delta with your own salesByPeriod window.

### What could go wrong if recommended_actions default to execute?
You pause the wrong campaign, markdown without a pricing owner, or send a PO from an alert. Rank actions. Tag autonomy. Week-one default is recommend or draft. Request approval for irreversible writes. The alert is not a purchaser.

### How is this different from monitoring, the daily brief, or RCA?
Monitoring decides that a signal fired. The daily brief is a scheduled five-item JSON. RCA is the hop contract for why revenue moved. This post is the alert payload: headline plus contributors plus unknowns plus ranked next actions. Share evidence fields. Do not merge the four jobs into one prompt in week one.

### Harness or Runtime for evidence-based alerts?
Harness is enough to assemble a schema-constrained payload from named read tools after a detector fires. Use Runtime plus Strands if alert assembly fans out to RCA and exception specialists with hop caps. Net-new builds use AgentCore, not Agents Classic after July 30, 2026.

---

*Source: https://www.joinhorizon.co/blog/ai-business-alerts-ecommerce-2026/*
