← Back to BlogGuide

Why Your AI Agent Keeps Doing the Same Thing Twice

H.··7 min read

A startup founder told me this story last week. He'd set up an AI agent to send follow-up emails to leads who hadn't responded in 48 hours. Smart automation. The kind of thing that should save hours of manual work.

The agent sent the first batch perfectly. Then it crashed overnight. When it restarted the next morning, it had no memory of the emails it had already sent. So it sent them all again. Same leads, same emails, same subject lines.

Then it crashed again that afternoon. Restarted. Sent them a third time.

By the time he noticed, 200 leads had received the same follow-up email three times in 24 hours. Some replied with "please stop emailing me." Some marked it as spam. His domain reputation took a hit that took weeks to recover from.

This is the idempotency problem, and it's the most common failure mode in AI agent automation.

Why agents repeat themselves

The root cause is simple: most AI agents are stateless between sessions. They wake up, see a trigger, and act on it. They don't check whether they already acted on that same trigger yesterday.

Think about how a human handles this. You come into work, check your task list, and mentally note "I already emailed those leads yesterday." You have memory. You have context. You know what you did.

An AI agent without proper state management is like an employee with amnesia who reads the same to-do list every morning and starts everything from scratch.

This shows up everywhere:

Each one seems minor in isolation. Together, they erode trust in the entire system. Your team stops relying on the agent because they can't trust it won't do something embarrassing.

The three layers of idempotency

Solving this isn't just about adding a "did I do this already?" check. It's about building three layers of protection:

Layer 1: Action logging

Every external action your agent takes should be logged with a unique identifier. Sent an email? Log the recipient, subject, and timestamp. Created a calendar event? Log the event ID. Posted to Slack? Log the message timestamp.

Before taking any action, check the log. If an identical action exists within a reasonable time window, skip it.

In OpenClaw, this happens naturally through the memory system. Your agent's workspace files persist between sessions:

## Actions Log - March 6, 2026

### Emails Sent
- 10:15 AM — Follow-up to john@acme.com (re: proposal review) — msgID: abc123
- 10:16 AM — Follow-up to sarah@startup.io (re: demo scheduling) — msgID: def456

### Slack Posts
- 10:30 AM — #sales channel — Weekly pipeline update — ts: 1709712600.001234

When the agent restarts, it reads these files and knows exactly what it's already done. No amnesia. No duplicate emails.

Layer 2: Trigger deduplication

Sometimes the same trigger fires multiple times. An email arrives, gets processed, but the "unread" flag doesn't clear fast enough. The next check sees it again and processes it a second time.

The fix: assign a unique ID to each trigger event and track which IDs have been processed.

Email ID: msg-2026-03-06-001 → Processed ✓
Email ID: msg-2026-03-06-001 → Already processed, skipping
Email ID: msg-2026-03-06-002 → New, processing...

OpenClaw's heartbeat system helps here. Instead of running continuous loops that might catch the same event twice, heartbeats fire at defined intervals. The agent processes what's new since the last heartbeat, marks it as handled, and waits for the next cycle.

Layer 3: External state checks

The most resilient layer: before acting, check the actual state of the target system.

About to send a follow-up email? Check if the lead already replied. About to create a calendar event? Check if an event with that title already exists for that time. About to post a Slack message? Check the channel's recent history.

This catches cases where the action happened but the log was lost — maybe the agent crashed between completing the action and writing the log entry.

Task: Send follow-up to john@acme.com
Check: Did john@acme.com reply to original email?
Result: Yes, replied 2 hours ago
Action: Skip follow-up, update CRM instead

Real-world patterns that work

Here are three patterns I've seen work reliably across dozens of self-hosted AI agent deployments:

The checkpoint pattern

Break complex workflows into steps with checkpoints. Each step logs its completion. If the agent restarts mid-workflow, it resumes from the last checkpoint instead of starting over.

Workflow: Weekly client report
[✓] Step 1: Pull data from CRM
[✓] Step 2: Generate analysis
[✓] Step 3: Create PDF
[ ] Step 4: Email to client
[ ] Step 5: Post summary to Slack

Agent crashes after step 3? It restarts, reads the checkpoint file, and picks up at step 4. The report doesn't get regenerated. The data doesn't get pulled again.

The cooldown pattern

For recurring actions, enforce a minimum time between executions. Even if the trigger fires again, the agent won't act until the cooldown expires.

This is especially useful for notification-type actions where duplicates are annoying but not catastrophic. Your agent won't post the same weather alert to Slack twice in an hour even if the check runs multiple times.

The idempotency key pattern

For critical actions like sending emails or making API calls, generate a deterministic key from the action's parameters. Same recipient + same subject + same day = same key. Before executing, check if that key exists in your action log.

This is borrowed from payment processing, where Stripe and other platforms use idempotency keys to prevent double-charges. The same principle applies perfectly to AI agent actions.

How OpenClaw handles this

OpenClaw's architecture naturally supports idempotent operations through several mechanisms:

Persistent workspace. Your agent's memory files survive restarts. Action logs, state tracking, and checkpoint files persist in the workspace directory. The agent always knows what it did in previous sessions.

Heartbeat system. Instead of continuous polling that risks processing events twice, OpenClaw's heartbeat fires at configured intervals. The agent processes new events, logs them, and returns to waiting. Clean, predictable, no overlap.

Cron scheduling. For timed tasks, OpenClaw's cron system ensures a job runs exactly when scheduled. If the agent was down when the cron should have fired, it runs once on recovery — not three times to "catch up."

Skill-level state. Custom skills can maintain their own state files, tracking exactly what they've processed and what's pending.

The cost of getting this wrong

Duplicate actions aren't just annoying. They have real consequences:

A YC founder I know had his AI agent create 47 duplicate Jira tickets for the same bug. His engineering team spent a morning cleaning it up and then voted to disable the agent integration entirely. Months of automation work undone by one missing deduplication check.

Getting started without the headache

Building idempotent AI agent workflows from scratch requires thinking through failure modes, implementing logging, and testing edge cases. It's not hard conceptually, but there are a lot of places where things go quietly wrong.

If you'd rather skip the debugging phase, OpenClaw Setup handles this as part of every deployment. We configure proper state management, action logging, and deduplication for your specific use case. Your agent runs on your hardware, handles restarts gracefully, and doesn't send your leads three copies of the same email.

Want your AI agent running reliably by tomorrow? Book a free 15-minute call and we'll set up an idempotent deployment tuned for your workflow.

Related Reading

Get Your AI Agent Running

We handle the entire setup — deploy, configure, and secure OpenClaw so you don't have to.

  • Fully deployed in 48 hours
  • All channels — Slack, Telegram, WhatsApp
  • Security hardened from day one
  • 14-day hypercare included

One-time setup

$999

Complete setup, no recurring fees