Event registration AI agent on WhatsApp

Answers questions about your events, agenda and speakers on WhatsApp, and registers attendees.

AI agentAdvanced Saves ~12 hours/month AI AgentsBy Flowngn team

Works with n8n · Make · Zapier

How it works

Trigger: WhatsApp — someone sends a message
  1. Someone asks about an event.
  2. The agent answers from your Events sheet: dates, venue, agenda, price, seats left.
  3. It registers them with name and email.
  4. It shares the payment link for paid events and alerts your team.

What it can do

Unlike a fixed flow, an agent decides which of its tools to use, in what order — and remembers the conversation.

  • Answers about dates, venues, agenda and speakers
  • Registers attendees
  • Offers the waiting list when an event is full

System prompt

The instructions that shape the agent. It's already inside the n8n template — copy it into Make or Zapier, and adjust the YOUR_… parts.

System prompt
You are the WhatsApp registration assistant for YOUR_ORGANISATION's events. Reply in the customer's language and dialect (Egyptian Arabic, Gulf Arabic, Modern Standard Arabic or English). Be warm and brief.

Today is {{ $now.toFormat('cccc d LLLL yyyy') }}.

Tools:
- "Events": upcoming events (event, date, time, venue or online link, price, seats_left, agenda, speakers).
- "Register attendee": registers someone. Use only after they confirm the event, their full name, and email.
- "Notify team": alerts the organisers about registrations, group bookings, sponsorship or speaking requests, and questions you can't answer.

Rules:
- Only register for events with seats_left above 0; otherwise offer the waiting list through "Notify team".
- Never invent speakers, agenda items, prices or discounts.
- For paid events, share the payment link YOUR_PAYMENT_LINK after registering and say the seat is confirmed once paid.

Safety rules

Built into the prompt and the tools:

  • Never invents speakers, prices or discounts
  • Only registers for events with seats left

Uses your own AI key (Claude, OpenAI or another model). Cost depends on the model and conversation length — a small, fast model keeps most conversations to a fraction of a cent.

Diagram

WIncoming messageWhatsApp Trigger{ }Get questionCodeEvents agentAI AgentClaude modelAnthropic Chat Mo…◷MemorySimple MemoryGEventsGoogle Sheets ToolGRegister atten…Google Sheets ToolTNotify teamTelegram ToolWReply on WhatsAppWhatsApp Business Cloud
Trigger App Code AI Agent tool

Code

JavaScript used in the Code step — already included in the template below.

Get question · Code node
// Keeps only text messages and pulls out who sent it and what they asked.
const msg = $input.first().json.messages?.[0];
if (!msg || msg.type !== "text") return [];

return [{ json: { from: msg.from, question: msg.text.body } }];

Build it

Pick your tool — same automation, step by step.

Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder. AI steps use a Claude model node — swap it for OpenAI, Gemini or Ollama if you prefer.

Workflow JSON
Show code (295 lines)
{
  "name": "Event registration AI agent on WhatsApp (Flowngn)",
  "nodes": [
    {
      "parameters": {
        "content": "## Event registration AI agent on WhatsApp\nAnswers questions about your events, agenda and speakers on WhatsApp, and registers attendees.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
        "height": 260,
        "width": 340
      },
      "id": "22e073b5-5396-44a5-a7e7-c44fe2954dfb",
      "name": "Setup notes",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -420,
        -60
      ]
    },
    {
      "parameters": {
        "updates": [
          "messages"
        ]
      },
      "id": "22e073b5-5396-44a5-a7e7-c44fe2954dfb",
      "name": "Incoming message",
      "type": "n8n-nodes-base.whatsAppTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ],
      "webhookId": "22e073b5-5396-44a5-a7e7-c44fe2954dfb"
    },
    {
      "parameters": {
        "jsCode": "// Keeps only text messages and pulls out who sent it and what they asked.\nconst msg = $input.first().json.messages?.[0];\nif (!msg || msg.type !== \"text\") return [];\n\nreturn [{ json: { from: msg.from, question: msg.text.body } }];"
      },
      "id": "22e073b5-5396-44a5-a7e7-c44fe2954dfb",
      "name": "Get question",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        300,
        0
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.question }}",
        "options": {
          "systemMessage": "=You are the WhatsApp registration assistant for YOUR_ORGANISATION's events. Reply in the customer's language and dialect (Egyptian Arabic, Gulf Arabic, Modern Standard Arabic or English). Be warm and brief.\n\nToday is {{ $now.toFormat('cccc d LLLL yyyy') }}.\n\nTools:\n- \"Events\": upcoming events (event, date, time, venue or online link, price, seats_left, agenda, speakers).\n- \"Register attendee\": registers someone. Use only after they confirm the event, their full name, and email.\n- \"Notify team\": alerts the organisers about registrations, group bookings, sponsorship or speaking requests, and questions you can't answer.\n\nRules:\n- Only register for events with seats_left above 0; otherwise offer the waiting list through \"Notify team\".\n- Never invent speakers, agenda items, prices or discounts.\n- For paid events, share the payment link YOUR_PAYMENT_LINK after registering and say the seat is confirmed once paid."
        }
      },
      "id": "22e073b5-5396-44a5-a7e7-c44fe2954dfb",
      "name": "Events agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.9,
      "position": [
        600,
        0
      ]
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "claude-sonnet-5",
          "mode": "list"
        },
        "options": {}
      },
      "id": "22e073b5-5396-44a5-a7e7-c44fe2954dfb",
      "name": "Claude model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.3,
      "position": [
        260,
        220
      ]
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('Get question').item.json.from }}",
        "contextWindowLength": 10
      },
      "id": "22e073b5-5396-44a5-a7e7-c44fe2954dfb",
      "name": "Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [
        430,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Returns upcoming events: date, time, venue, price, seats_left, agenda, speakers.",
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Events",
          "mode": "name"
        },
        "options": {}
      },
      "id": "22e073b5-5396-44a5-a7e7-c44fe2954dfb",
      "name": "Events",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.5,
      "position": [
        600,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Registers an attendee for an event.",
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Registrations",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "date": "={{ $now.toISO() }}",
            "phone": "={{ $('Get question').item.json.from }}",
            "event": "={{ $fromAI('event', \"Event name\", 'string') }}",
            "name": "={{ $fromAI('name', \"Attendee's full name\", 'string') }}",
            "email": "={{ $fromAI('email', \"Attendee's email\", 'string') }}",
            "status": "registered"
          }
        },
        "options": {}
      },
      "id": "22e073b5-5396-44a5-a7e7-c44fe2954dfb",
      "name": "Register attendee",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.5,
      "position": [
        770,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Alerts the organisers about registrations, group bookings and questions you can't answer.",
        "chatId": "YOUR_TEAM_CHAT_ID",
        "text": "={{ $fromAI('message', \"What the team needs to know, including the customer's phone\", 'string') }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "id": "22e073b5-5396-44a5-a7e7-c44fe2954dfb",
      "name": "Notify team",
      "type": "n8n-nodes-base.telegramTool",
      "typeVersion": 1.2,
      "position": [
        940,
        220
      ]
    },
    {
      "parameters": {
        "operation": "send",
        "phoneNumberId": "YOUR_PHONE_NUMBER_ID",
        "recipientPhoneNumber": "={{ $('Get question').item.json.from }}",
        "textBody": "={{ $json.output }}"
      },
      "id": "22e073b5-5396-44a5-a7e7-c44fe2954dfb",
      "name": "Reply on WhatsApp",
      "type": "n8n-nodes-base.whatsApp",
      "typeVersion": 1,
      "position": [
        900,
        0
      ]
    }
  ],
  "connections": {
    "Incoming message": {
      "main": [
        [
          {
            "node": "Get question",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get question": {
      "main": [
        [
          {
            "node": "Events agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Events agent": {
      "main": [
        [
          {
            "node": "Reply on WhatsApp",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude model": {
      "ai_languageModel": [
        [
          {
            "node": "Events agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Memory": {
      "ai_memory": [
        [
          {
            "node": "Events agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Events": {
      "ai_tool": [
        [
          {
            "node": "Events agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Register attendee": {
      "ai_tool": [
        [
          {
            "node": "Events agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Notify team": {
      "ai_tool": [
        [
          {
            "node": "Events agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

Open in the playground to edit →

Tips

  • Lower seats_left as people pay, so the agent never overbooks.

Related flows