🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

Heleni WhatsApp

by @netanel-abergel

Complete WhatsApp management for OpenClaw agents: per-conversation memory (groups + DMs), unanswered message tracking, loop prevention, and multi-PA coordina...

Versionv1.1.0
Installs1
βš™οΈ Configuration

init_whatsapp_memory() {
  TYPE="$1"       # "group" or "dm"
  ID="$2"         # JID or phone number
  NAME="$3"       # Human-readable name

SAFE_ID=$(echo "$ID" | tr '@.+' '---')

if [ "$TYPE" = "group" ]; then DIR="$HOME/.openclaw/workspace/memory/whatsapp/groups/$SAFE_ID" mkdir -p "$DIR" cat > "$DIR/meta.json" << EOF {"type": "group", "jid": "$ID", "name": "$NAME", "created": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"} EOF touch "$DIR/context.md" "$DIR/decisions.md" "$DIR/people.md" else DIR="$HOME/.openclaw/workspace/memory/whatsapp/dms/$SAFE_ID" mkdir -p "$DIR" cat > "$DIR/meta.json" << EOF {"type": "dm", "phone": "$ID", "name": "$NAME", "created": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"} EOF touch "$DIR/context.md" "$DIR/notes.md" fi

echo "Initialized WhatsApp memory: $NAME" }

Examples:

init_whatsapp_memory "group" "YOUR_GROUP_JID@g.us" "PA Team"

init_whatsapp_memory "dm" "+PHONE_NUMBER" "Contact Name"

Writing Memory

wa_log() {
  TYPE="$1"                        # "group" or "dm"
  ID="$2"                          # JID or phone
  CONTENT="$3"                     # what to log
  FILE_NAME="${4:-context.md}"     # context.md / decisions.md / notes.md

SAFE_ID=$(echo "$ID" | tr '@.+' '---') BASE="$HOME/.openclaw/workspace/memory/whatsapp"

if [ "$TYPE" = "group" ]; then FILE="$BASE/groups/$SAFE_ID/$FILE_NAME" else FILE="$BASE/dms/$SAFE_ID/$FILE_NAME" fi

if [ ! -f "$FILE" ]; then mkdir -p "$(dirname "$FILE")" touch "$FILE" fi

echo "[$(date -u +%Y-%m-%d\ %H:%M)] $CONTENT" >> "$FILE" }

Reading Memory

wa_context() {
  TYPE="$1"
  ID="$2"
  LINES="${3:-20}"

SAFE_ID=$(echo "$ID" | tr '@.+' '---') BASE="$HOME/.openclaw/workspace/memory/whatsapp"

if [ "$TYPE" = "group" ]; then DIR="$BASE/groups/$SAFE_ID" else DIR="$BASE/dms/$SAFE_ID" fi

if [ ! -d "$DIR" ]; then echo "No memory for this conversation yet." return fi

NAME=$(python3 -c " import json with open('$DIR/meta.json') as f: print(json.load(f).get('name', '?')) " 2>/dev/null || echo "?")

echo "=== $NAME ===" echo "--- Recent ---" tail -"$LINES" "$DIR/context.md" 2>/dev/null || echo "(empty)" echo "--- Notes/Decisions ---" cat "$DIR/notes.md" "$DIR/decisions.md" 2>/dev/null | tail -10 || echo "(none)" }

Search Across All Memory

wa_search() {
  QUERY="$1"
  BASE="$HOME/.openclaw/workspace/memory/whatsapp"

echo "Searching WhatsApp memory for: '$QUERY'" grep -r "$QUERY" "$BASE" --include="*.md" -l 2>/dev/null | while read file; do DIR=$(dirname "$file") NAME=$(python3 -c " import json with open('$DIR/meta.json') as f: print(json.load(f).get('name', '?')) " 2>/dev/null || echo "?") echo "Found in: $NAME" grep -n "$QUERY" "$file" | head -3 echo "" done }

What to Log

| File | Use for | |---|---| | context.md | Ongoing conversation events, tasks assigned | | decisions.md | Agreed outcomes, group decisions | | people.md | Who's in the group, their role/style | | notes.md | DM tasks, owner preferences, follow-ups |

Never log: casual greetings, duplicate info, credentials.

Before Responding β€” Inject Context

1. Extract JID or phone from inbound metadata
2. If group: run wa_context "group" "$JID" 10
   If DM:    run wa_context "dm" "$PHONE" 10
3. Use context to inform your response
4. After responding: log anything worth remembering


πŸ“‹ Tips & Best Practices

Use this section when the agent is not responding to WhatsApp messages.

Step 1 β€” Classify the problem:

  • Dashboard shows "Disconnected" β†’ Connection issue: re-link WhatsApp in OpenClaw settings, scan QR code with WhatsApp Business app. Session expires after ~14 days of inactivity.
  • Dashboard shows "Connected" but Messages = 0 β†’ Ingest issue: run openclaw gateway restart, wait 30s, check if count increments.
  • Messages count increments but no reply β†’ Runtime issue: check billing and API key.
  • Step 2 β€” Fix ingest issues (Messages = 0):

    openclaw gateway status
    openclaw gateway restart
    

    Wait 30 seconds, then test

    openclaw gateway logs --last 50 # Look for: binding failed, session dropped, ingest error
    If errors persist β†’ escalate to platform admin (infrastructure issue).

    Step 3 β€” Fix runtime issues (no reply despite incoming messages):

    # Check for billing errors
    grep -i "billing\|402\|credits" ~/.openclaw/logs/agent.log | tail -20

    Verify API key (expect HTTP 200)

    curl -s -o /dev/null -w "%{http_code}" \ -H "x-api-key: $ANTHROPIC_API_KEY" \ -H "anthropic-version: 2023-06-01" \ https://api.anthropic.com/v1/models

    200 = OK | 401 = invalid key | 402 = billing error

    Prevention:

  • Send at least one message every 7 days to prevent session expiry
  • Check Messages count during heartbeat to catch ingest issues early
  • Never use the same phone number on two devices simultaneously
  • When to escalate: Gateway restart doesn't fix Messages = 0, logs show socket/binding/session errors, or multiple agents affected at the same time.

    View on ClawHub
    TERMINAL
    clawhub install heleni-whatsapp

    πŸ§ͺ Use this skill with your agent

    Most visitors already have an agent. Pick your environment, install or copy the workflow, then run the smoke-test prompt above.

    πŸ” Can't find the right skill?

    Search 60,000+ AI agent skills β€” free, no login needed.

    Search Skills β†’