Send TTS Voice Calls and Email Verification with ClickSend
Overview
This workflow automates a dual verification process: it sends a Text-to-Speech (TTS) voice call to a user's phone number and simultaneously sends a verification code via email. The user is then prompted to enter the codes received through both channels to confirm their identity. This is ideal for secure user onboarding, password resets, or any scenario where multi-factor verification is required.
By combining voice call delivery with email verification, this workflow provides an extra layer of security and accessibility — users who may not have immediate access to email can still verify via a phone call, and vice versa.
Workflow Steps
Below is the complete list of nodes in the workflow, with their types and authentication methods:
- On form submission (Form Trigger) — No auth. This node starts the workflow when a user submits an n8n form. The form collects: phone number (
To), voice type (Voice), language (Lang), email address (Email), and name (Nome). - Set voice code (Set) — No auth. This node sets a hardcoded verification code (
12345) that will be spoken in the voice call. - Code for voice (Code) — No auth. This JavaScript node takes the code from the previous step and inserts spaces between each character (e.g.,
12345becomes1 2 3 4 5) so the TTS voice reads each digit individually. - Send Voice (HTTP Request) — Basic Auth (username/password). This node sends a POST request to the ClickSend Voice API endpoint. The request body includes the spaced code, the recipient's phone number, voice type, and language. Authentication uses the credentials stored in n8n (generic HTTP Basic Auth).
- Verify voice code (Form) — No auth. This node presents a web form asking the user to enter the verification code they heard on the phone call.
- Is voice code correct? (IF) — No auth. This node compares the user's input from the form with the originally set code (
12345). If they match, the workflow proceeds to the success path; otherwise, it goes to the failure path. - Fail voice code (Form) — No auth. This node displays a completion form saying the voice code was invalid.
- Set email code (Set) — No auth. This node sets a different hardcoded code (
56789) for email verification. - Send Email (Email Send) — SMTP credentials (configured in n8n). This node sends an email to the user's address with the subject "Verify your code" and an HTML body containing the email verification code.
- Verify email code (Form) — No auth. This node presents a second web form asking the user to enter the code received in the email.
- Is email code correct? (IF) — No auth. This node compares the user's email input with the set code (
56789). If correct, the workflow proceeds to the success node; otherwise, it goes to the failure path. - Success (Form) — No auth. This node displays a completion form confirming that both the phone number and email have been verified successfully.
- Fail email code (Form) — No auth. This node displays a completion form saying the email code was invalid.
Setup Instructions
To use this workflow, you will need:
- ClickSend account: Register at ClickSend and obtain your API Key. You will receive €2 of free credits to test the voice calls.
- SMTP credentials: For sending emails, you need an SMTP server (e.g., Gmail, SendGrid, or your own mail server). Configure the SMTP credentials in n8n under "Credentials" > "Email Send (SMTP)".
- n8n instance: This workflow runs on n8n (self-hosted or cloud). Ensure you have the HTTP Request node, Form Trigger node, and Form nodes available.
Steps to configure:
- In the Send Voice node, set the authentication to "Basic Auth" and enter your ClickSend username (the registered email) and API Key as the password. The URL is already set to
{{ $env.WEBHOOK_URL }}— you can replace this with the actual ClickSend Voice API endpoint:https://api.clicksend.com/v3/voice/send. - In the Send Email node, configure the From Email field with your verified sender address and ensure your SMTP credentials are set in n8n.
- Optionally, update the hardcoded verification codes in the Set voice code and Set email code nodes to generate random codes (e.g., using a Code node or n8n's built-in functions).
- Publish the workflow and share the form URL (from the On form submission trigger) with your users.
Use Cases and Variations
- User onboarding: Automate the verification of new users' phone numbers and email addresses during sign-up.
- Password reset: Send a temporary code via voice call and email to confirm identity before allowing password changes.
- Two-factor authentication (2FA): Use this as a simple 2FA mechanism for sensitive actions.
- Customization: Replace the hardcoded codes with dynamically generated random numbers using a Code node. You can also add a database lookup to store verification attempts.
- Alternative services: Replace ClickSend with any TTS API (e.g., Twilio, Nexmo) by modifying the HTTP Request node's URL, method, and body.
Workflow JSON
{
"id": "1g8EAij2RwhNN70t",
"meta": {
"instanceId": "workflow-d3b682e5",
"versionId": "1.0.0",
"createdAt": "2025-09-29T07:07:42.383575",
"updatedAt": "2025-09-29T07:07:42.383864",
"owner": "n8n-user",
"license": "MIT",
"category": "automation",
"status": "active",
"priority": "high",
"environment": "production"
},
"name": "xSend and check TTS (Text-to-speech) voice calls end email verification",
"tags": [
"automation",
"n8n",
"production-ready",
"excellent",
"optimized"
],
"nodes": [
{
"id": "56842e20-266b-4770-b4cd-3106418caefa",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-480,
-740
],
"parameters": {
"width": 440,
"height": 180,
"content": "## STEP 1\n[Register here to ClickSend]({{ $env.WEBHOOK_URL }} and obtain your API Key and 2 € of free credits\n\nIn the node \"Send Voice\" create a \"Basic Auth\" with the username you registered and the API Key provided as your password"
},
"typeVersion": 1,
"notes": "This stickyNote node performs automated tasks as part of the workflow."
},
{
"id": "9dfff5ae-fc04-4957-a7b6-6866e8ab0854",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-480,
-320
],
"parameters": {
"width": 440,
"content": "## STEP 3\n\nSubmit the form and you will receive a call to the phone number you entered where the selected voice will tell you the content of the text you wrote."
// ... truncated (copy to see full JSON)How to Import This Workflow
- 1Copy the workflow JSON above using the Copy Workflow JSON button.
- 2Open your n8n instance and go to Workflows.
- 3Click Import from JSON and paste the copied workflow.
Don't have an n8n instance? Start your free trial at n8nautomation.cloud
Related Templates
AI Customer Support Chatbot with Elasticsearch Knowledge Base
Overview This workflow transforms a webhook endpoint into an intelligent customer support chatbot. It receives a customer question, searches a knowledge base stored in Elasticsearch, and generates a helpful, context-aware reply using OpenAI's GPT-4. The bot is designed to reduce human workload by answering common queries instantly, and gracefully escalates to a human agent when the answer is not found. It's ideal for embedding into a website, messaging app, or any frontend that can send HTTP POST requests. Node-by-Node Breakdown Chatbot Webhook (Frontend Trigger) — Type: (No auth) - Listens for POST requests at the path . The webhook ID is . This is the entry point where your frontend sends the customer's question as JSON body (e.g., ). Extract Customer Query — Type: (No auth) - Extracts from the incoming JSON body using a simple JavaScript code snippet: . This prepares the query for the next steps. Search Knowledge Base (Elasticsearch) — Type: (Requires Elasticsearch credentials – basic auth / API key) - Performs a search on the index using the extracted question as the query. The parameter is set to . It returns matching documents from the knowledge base. Generate AI Response with GPT-4 — Type: (API Key auth) - Uses the model to generate a response. The system message instructs the assistant to use the provided knowledge base content and to politely escalate if the answer is not found. The user message combines the customer question and the top knowledge base result (). Format Chatbot Reply — Type: (No auth) - Extracts the final reply from the OpenAI response: . This ensures the output is properly structured. Return Chatbot Reply — Type: (No auth) - Sends the formatted reply back to the caller (the frontend) as a JSON response. Setup Instructions Elasticsearch: You need a running Elasticsearch instance (cloud or self-hosted) with an index named . Populate it with documents containing your knowledge base articles (e.g., each document should have a field). Configure the Elasticsearch node in n8n with your host, port, and authentication credentials (API key or username/password). OpenAI: Obtain an API key from OpenAI. Add it as a credential in n8n (type: OpenAI API). Webhook URL: After activating the workflow, n8n will generate a unique webhook URL (e.g., ). Use this URL in your frontend (website, chatbot widget, etc.) to send POST requests. Activate the workflow: Toggle the workflow to active in n8n for the webhook to start listening. Use Cases & Adaptations Customer Support Portal: Embed the webhook URL in a live chat widget on your website to answer FAQs instantly. Slack or Discord Bot: Replace the webhook trigger with a Slack/Discord trigger and adjust the response format to send messages back to the channel. Multiple Knowledge Bases: Modify the Elasticsearch query to search across multiple indices or filter by category. Fallback to Human: Customize the GPT-4 system message to trigger a notification (e.g., email or Slack message) when the answer is not found. Model Upgrade: Swap for to reduce cost or use a custom fine-tuned model. Language Support: Add a language detection step before the query to route to different knowledge bases or translate the response.
Receive and Reply to Messages Across WhatsApp, Instagram, and Facebook Messenger with Fiwano
Overview This workflow provides a unified integration for receiving and replying to messages from WhatsApp, Instagram Direct Messages, and Facebook Messenger using the Fiwano platform. It demonstrates how to handle incoming messages from all three Meta-owned messaging channels through a single trigger and action node set, eliminating the need to build separate integrations for each platform. The workflow is ideal for customer support, lead response, or any scenario where you need to manage multi-channel messaging from one n8n instance. Workflow Steps Fiwano Trigger (API Key auth) — This node listens for incoming messages from all connected channels (WhatsApp, Instagram, Facebook Messenger). It uses the parameter to automatically register the workflow for every active channel in your Fiwano account. The trigger fires on "Message Received" events and provides a normalized payload regardless of which channel the message came from. Example — route by message type (No auth) — This is an IF node that checks the field from the incoming message. It routes messages into two branches: one for text messages (where equals "text") and another for all other message types (images, audio, video, documents, etc.). This demonstrates how to implement different reply logic based on message content type. Example — send text reply (API Key auth) — This Fiwano Send node replies to text messages. It uses the following parameters: - : Taken from the incoming message's field to ensure the reply goes back through the same channel - : Set to the sender's ID from - : A template that echoes the user's message: Example — send attachment reply (API Key auth) — This second Fiwano Send node handles replies to non-text messages (attachments). Its parameters: - : Same as above, using - : Same as above, using - : Acknowledges the attachment type: Setup Instructions Prerequisites A Fiwano account (sign up at fiwano.com) At least one connected messaging channel (WhatsApp Business API, Instagram Professional account, or Facebook Page connected to Messenger) n8n instance (self-hosted or cloud) with public accessibility for webhook triggers Installation Steps Install the n8n-nodes-fiwano community package in your n8n editor (verified package available in the n8n community nodes registry) Create a Fiwano API credential in n8n with your API key from the Fiwano portal (Recommended) Set a Webhook Secret on the credential for signature verification Connect your messaging channels through the Fiwano portal or their channel-connection API Save and activate the workflow — the trigger will auto-register for all active channels Use Cases and Variations Primary Use Cases Customer Support: Route incoming messages to a helpdesk or ticketing system based on message content or sender Lead Response: Automatically reply to inquiries from ads or business pages with personalized messages Notification System: Forward messages to Slack, email, or other internal tools Adaptation Ideas Replace the simple IF router with a more complex decision tree using Switch nodes or AI classification Add a database lookup (e.g., Airtable, Google Sheets) to check if the sender is an existing customer Integrate with OpenAI or other AI services to generate intelligent replies Add logging to a spreadsheet or database for analytics Implement different response templates for each channel type using the field Add human handoff logic when the AI or automated response cannot handle the query Important Notes The normalized payload from Fiwano includes: , (whatsapp/instagram/messenger), , , , , and (for attachments) You typically don't need to branch by channel type unless your business logic requires channel-specific behavior n8n must be publicly reachable for the webhook trigger to receive messages from Fiwano
HR & IT Helpdesk Chatbot with Audio Transcription on Telegram
Overview This workflow builds a fully functional HR & IT helpdesk chatbot that operates through Telegram. It ingests internal policy documents (e.g., employee handbooks, IT FAQs), creates a searchable knowledge base using vector embeddings stored in PostgreSQL, and then answers employee questions via text or voice messages. The chatbot uses Retrieval-Augmented Generation (RAG) to provide accurate, context-aware responses based on your company's specific policies. This is particularly useful for organizations that want to automate common HR and IT inquiries, reduce the burden on support teams, and provide 24/7 self-service to employees. The inclusion of voice message transcription makes it accessible for users who prefer speaking over typing. Workflow Steps Phase 1: Knowledge Base Ingestion (Run Once or on Update) When clicking 'Test workflow' (Manual Trigger — No auth) — This node starts the ingestion process manually. It is intended to be run once when setting up the workflow or whenever the policy documents are updated. HTTP Request (HTTP Request — No auth) — Fetches a PDF file from a public URL (in this example, an employee handbook from an S3 bucket). The URL can be changed to point to any PDF hosted online or on a shared drive. Extract from File (Extract from File — No auth) — Parses the downloaded PDF and extracts its text content. The operation is set to "pdf" to handle PDF documents. Recursive Character Text Splitter (Text Splitter — No auth) — Splits the extracted text into smaller chunks of 2000 characters each. This is necessary for creating meaningful vector embeddings and for efficient retrieval. Default Data Loader (Document Loader — No auth) — Converts the text chunks into document objects that can be stored in the vector store. It takes the text from the Extract from File node using the expression . Embeddings OpenAI (Embeddings — OpenAI API Key auth) — Generates vector embeddings for each text chunk using OpenAI's embedding models. These embeddings represent the semantic meaning of the text. Create HR Policies (PostgreSQL PGVector Store — Database credentials auth) — Inserts the document chunks and their embeddings into a PostgreSQL database with pgvector extension. This creates the searchable knowledge base. Phase 2: Chatbot Runtime Telegram Trigger (Telegram Trigger — Telegram Bot Token auth) — Listens for incoming messages on a Telegram bot. It captures all messages (text, voice, etc.) sent to the bot. Verify Message Type (Switch — No auth) — Routes messages based on their type: - Text messages (containing ) → sent to the AI agent - Voice messages (containing ) → sent for transcription - Other types → sent to a fallback response Edit Fields (Set — No auth) — For text messages, extracts the text content and passes it to the AI agent. Uses the expression . Telegram1 (Telegram — Telegram Bot Token auth) — For voice messages, downloads the audio file from Telegram using the from the incoming message. OpenAI (OpenAI — OpenAI API Key auth) — Transcribes the downloaded voice message into text using OpenAI's Whisper transcription API. The operation is set to "transcribe" and the binary property is set to "data". Unsupported Message Type (Telegram — Telegram Bot Token auth) — Sends a fallback message "I'm not able to process this message type." for unsupported message types (e.g., stickers, locations). AI Agent (AI Agent — No auth) — The core conversational agent. It receives the user's text (either directly or transcribed from voice) and generates a response. The system message is set to "You are a helpful assistant for HR and employee policies". OpenAI Chat Model (Chat Model — OpenAI API Key auth) — The language model powering the AI agent. It generates natural language responses based on the context and retrieved information. Postgres Chat Memory (Memory — Database credentials auth) — Maintains conversation history per user, using the Telegram chat ID as the session key. This allows the chatbot to remember context across multiple messages. Answer questions with a vector store (Vector Store Tool — No auth) — A tool that the AI agent uses to query the knowledge base. It is configured with the name "hremployeepolicies" and description "data for HR and employee policies". Postgres PGVector Store (Vector Store — Database credentials auth) — The actual vector store connection that retrieves relevant document chunks based on the user's query. OpenAI Chat Model1 (Chat Model — OpenAI API Key auth) — A second language model instance used specifically by the vector store tool for re-ranking or summarizing retrieved results. Embeddings OpenAI1 (Embeddings — OpenAI API Key auth) — A second embeddings instance used by the vector store tool to embed the user's query for similarity search. Telegram (Telegram — Telegram Bot Token auth) — Sends the AI agent's response back to the user in the same Telegram chat. Uses the expression for the response text. Setup Instructions Prerequisites OpenAI Account: You need an OpenAI API key with access to: - GPT-4 or GPT-3.5 for chat completion - text-embedding-ada-002 for embeddings - Whisper for audio transcription Telegram Bot: Create a bot via @BotFather on Telegram and obtain the bot token. PostgreSQL Database: A PostgreSQL database with the pgvector extension installed. You can use: - A local PostgreSQL instance - A cloud provider like Supabase, Aiven, or AWS RDS Configuration Steps Set up credentials in n8n: - OpenAI API: Add your OpenAI API key as a credential - Telegram Bot: Add your bot token as a credential - PostgreSQL: Add your database connection details (host, port, database name, user, password) Update the PDF URL: In the HTTP Request node, change the URL to point to your own policy documents (e.g., company handbook, IT policies, FAQs). Run the ingestion: Click "Test Workflow" on the When clicking 'Test workflow' node to populate the vector store with your documents. Set the webhook: Activate the workflow and set the Telegram webhook URL to your n8n instance's webhook URL (provided by the Telegram Trigger node). Test the chatbot: Send a text or voice message to your Telegram bot and verify it responds with relevant information from your policies. Use Cases and Variations Primary Use Cases HR Helpdesk: Answer questions about leave policies, benefits, payroll, company culture, and onboarding procedures. IT Support Desk: Provide troubleshooting steps for common IT issues, password reset instructions, software access requests, and hardware policies. Employee Onboarding: New hires can ask questions about company policies, team structures, and first-day procedures. Possible Variations Multiple Document Sources: Instead of a single PDF, use multiple HTTP Request nodes or connect to Google Drive, SharePoint, or Confluence to ingest documents from various sources. Different Channels: Replace the Telegram trigger with Slack, Microsoft Teams, or a web chat widget to deploy the chatbot on other platforms. Multi-language Support: Configure the OpenAI model to respond in multiple languages based on user preference or detected language. Human Handoff: Add a condition to escalate complex queries to a human agent via email or a ticketing system. Feedback Loop: Add a mechanism for users to rate responses and use that feedback to improve the knowledge base. Scheduled Re-indexing: Add a Cron trigger to periodically re-ingest documents to keep the knowledge base up to date.