AutomationFlowsData & Sheets › Voxa W1 — Onboarding

Voxa W1 — Onboarding

Voxa W1 — Onboarding. Uses supabase, httpRequest. Webhook trigger; 14 nodes.

Webhook trigger★★★★☆ complexity14 nodesSupabaseHTTP Request
Data & Sheets Trigger: Webhook Nodes: 14 Complexity: ★★★★☆ Added:

This workflow follows the HTTP Request → Supabase recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "Voxa W1 \u2014 Onboarding",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "onboarding",
        "responseMode": "responseNode",
        "options": {
          "allowedOrigins": "*",
          "responseHeaders": {
            "entries": [
              {
                "name": "X-Voxa-Workflow",
                "value": "onboarding"
              }
            ]
          }
        }
      },
      "id": "node-webhook-onboarding",
      "name": "Webhook (POST /onboarding)",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        -1600,
        -40
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "asn-1",
              "name": "business_id",
              "value": "={{ $json.body.business_id }}",
              "type": "string"
            },
            {
              "id": "asn-2",
              "name": "tier",
              "value": "={{ $json.body.tier }}",
              "type": "string"
            },
            {
              "id": "asn-3",
              "name": "stripe_customer_id",
              "value": "={{ $json.body.stripe_customer_id }}",
              "type": "string"
            },
            {
              "id": "asn-4",
              "name": "stripe_subscription_id",
              "value": "={{ $json.body.stripe_subscription_id }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "node-normalize",
      "name": "Set normalize",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -1380,
        -40
      ]
    },
    {
      "parameters": {
        "operation": "getAll",
        "tableId": "businesses",
        "returnAll": false,
        "limit": 1,
        "filterType": "manual",
        "matchType": "allFilters",
        "filters": {
          "conditions": [
            {
              "keyName": "id",
              "condition": "eq",
              "keyValue": "={{ $json.business_id }}"
            }
          ]
        }
      },
      "id": "node-get-business",
      "name": "Supabase get business",
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        -1160,
        -40
      ],
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $env.NEXT_PUBLIC_APP_URL }}/api/agent/create",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "X-Voxa-Internal-Secret",
              "value": "={{ $env.VOXA_INTERNAL_SECRET }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"business_id\": \"{{ $('Set normalize').item.json.business_id }}\"\n}",
        "options": {
          "timeout": 15000,
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "id": "node-agent-create",
      "name": "HTTP agent.create",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -940,
        -40
      ],
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "method": "GET",
        "url": "=https://api.twilio.com/2010-04-01/Accounts/{{ $env.TWILIO_ACCOUNT_SID }}/AvailablePhoneNumbers/IN/Local.json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBasicAuth",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "SmsEnabled",
              "value": "true"
            },
            {
              "name": "VoiceEnabled",
              "value": "true"
            },
            {
              "name": "PageSize",
              "value": "5"
            }
          ]
        },
        "options": {
          "timeout": 15000
        }
      },
      "id": "node-twilio-list",
      "name": "HTTP twilio.list",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -720,
        -40
      ],
      "credentials": {
        "httpBasicAuth": {
          "name": "<your credential>"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://api.twilio.com/2010-04-01/Accounts/{{ $env.TWILIO_ACCOUNT_SID }}/IncomingPhoneNumbers.json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBasicAuth",
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "PhoneNumber",
              "value": "={{ $json.available_phone_numbers[0].phone_number }}"
            },
            {
              "name": "FriendlyName",
              "value": "=Voxa {{ $('Supabase get business').item.json.name }}"
            }
          ]
        },
        "options": {
          "timeout": 15000
        }
      },
      "id": "node-twilio-purchase",
      "name": "HTTP twilio.purchase",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -500,
        -40
      ],
      "credentials": {
        "httpBasicAuth": {
          "name": "<your credential>"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.elevenlabs.io/v1/convai/phone-numbers",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "xi-api-key",
              "value": "={{ $env.ELEVENLABS_API_KEY }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"phone_number\": \"{{ $('HTTP twilio.purchase').item.json.phone_number }}\",\n  \"label\": \"Voxa - {{ $('Supabase get business').item.json.name }}\",\n  \"provider\": \"twilio\",\n  \"provider_config\": {\n    \"sid\": \"{{ $env.TWILIO_ACCOUNT_SID }}\",\n    \"token\": \"{{ $env.TWILIO_AUTH_TOKEN }}\"\n  }\n}",
        "options": {
          "timeout": 15000
        }
      },
      "id": "node-el-phone-import",
      "name": "HTTP el.phoneNumbers.import",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -280,
        -40
      ],
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "method": "PATCH",
        "url": "=https://api.elevenlabs.io/v1/convai/phone-numbers/{{ $('HTTP el.phoneNumbers.import').item.json.phone_number_id }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "xi-api-key",
              "value": "={{ $env.ELEVENLABS_API_KEY }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"agent_id\": \"{{ $('HTTP agent.create').item.json.agentId }}\"\n}",
        "options": {
          "timeout": 15000
        }
      },
      "id": "node-el-phone-assign",
      "name": "HTTP el.phoneNumbers.assignAgent",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -60,
        -40
      ],
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "operation": "update",
        "tableId": "agents",
        "filterType": "manual",
        "matchType": "allFilters",
        "filters": {
          "conditions": [
            {
              "keyName": "business_id",
              "condition": "eq",
              "keyValue": "={{ $('Set normalize').item.json.business_id }}"
            }
          ]
        },
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "twilio_number_sid",
              "fieldValue": "={{ $('HTTP twilio.purchase').item.json.sid }}"
            },
            {
              "fieldId": "twilio_phone_e164",
              "fieldValue": "={{ $('HTTP twilio.purchase').item.json.phone_number }}"
            },
            {
              "fieldId": "status",
              "fieldValue": "active"
            }
          ]
        }
      },
      "id": "node-supabase-update-agents",
      "name": "Supabase update agents",
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        160,
        -40
      ],
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://api.twilio.com/2010-04-01/Accounts/{{ $env.TWILIO_ACCOUNT_SID }}/Messages.json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBasicAuth",
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "From",
              "value": "=whatsapp:{{ $env.TWILIO_WHATSAPP_FROM }}"
            },
            {
              "name": "To",
              "value": "=whatsapp:{{ $('Supabase get business').item.json.owner_whatsapp }}"
            },
            {
              "name": "Body",
              "value": "=Your Voxa AI receptionist is live! Number: {{ $('HTTP twilio.purchase').item.json.phone_number }}. Call it to test. Reply STOP to pause."
            }
          ]
        },
        "options": {
          "timeout": 15000
        }
      },
      "id": "node-twilio-whatsapp",
      "name": "HTTP twilio.whatsapp.activation",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        380,
        -40
      ],
      "credentials": {
        "httpBasicAuth": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\n  \"ok\": true,\n  \"agent_id\": \"{{ $('HTTP agent.create').item.json.agentId }}\",\n  \"phone_number\": \"{{ $('HTTP twilio.purchase').item.json.phone_number }}\",\n  \"twilio_number_sid\": \"{{ $('HTTP twilio.purchase').item.json.sid }}\"\n}",
        "options": {
          "responseCode": 200
        }
      },
      "id": "node-respond-ok",
      "name": "Respond ok",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        600,
        -40
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "err-1",
              "name": "error_message",
              "value": "={{ $json.error?.message || $json.message || 'onboarding step failed' }}",
              "type": "string"
            },
            {
              "id": "err-2",
              "name": "error_step",
              "value": "={{ $node.name }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "node-error-context",
      "name": "Set error.context",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -60,
        220
      ]
    },
    {
      "parameters": {
        "operation": "update",
        "tableId": "agents",
        "filterType": "manual",
        "matchType": "allFilters",
        "filters": {
          "conditions": [
            {
              "keyName": "business_id",
              "condition": "eq",
              "keyValue": "={{ $('Set normalize').item.json.business_id }}"
            }
          ]
        },
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "status",
              "fieldValue": "failed"
            }
          ]
        }
      },
      "id": "node-supabase-fail",
      "name": "Supabase mark failed",
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        160,
        220
      ],
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\n  \"ok\": false,\n  \"error\": \"{{ $('Set error.context').item.json.error_message }}\",\n  \"step\": \"{{ $('Set error.context').item.json.error_step }}\"\n}",
        "options": {
          "responseCode": 500
        }
      },
      "id": "node-respond-error",
      "name": "Respond error",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        380,
        220
      ]
    }
  ],
  "connections": {
    "Webhook (POST /onboarding)": {
      "main": [
        [
          {
            "node": "Set normalize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set normalize": {
      "main": [
        [
          {
            "node": "Supabase get business",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase get business": {
      "main": [
        [
          {
            "node": "HTTP agent.create",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP agent.create": {
      "main": [
        [
          {
            "node": "HTTP twilio.list",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set error.context",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP twilio.list": {
      "main": [
        [
          {
            "node": "HTTP twilio.purchase",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set error.context",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP twilio.purchase": {
      "main": [
        [
          {
            "node": "HTTP el.phoneNumbers.import",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set error.context",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP el.phoneNumbers.import": {
      "main": [
        [
          {
            "node": "HTTP el.phoneNumbers.assignAgent",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set error.context",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP el.phoneNumbers.assignAgent": {
      "main": [
        [
          {
            "node": "Supabase update agents",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set error.context",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase update agents": {
      "main": [
        [
          {
            "node": "HTTP twilio.whatsapp.activation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP twilio.whatsapp.activation": {
      "main": [
        [
          {
            "node": "Respond ok",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set error.context": {
      "main": [
        [
          {
            "node": "Supabase mark failed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase mark failed": {
      "main": [
        [
          {
            "node": "Respond error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "saveExecutionProgress": true,
    "saveManualExecutions": true,
    "callerPolicy": "workflowsFromSameOwner",
    "timezone": "Asia/Kolkata"
  },
  "versionId": "01000000-0000-4000-a000-000000000001",
  "id": "voxa-w1-onboarding",
  "tags": [
    {
      "id": "tag-voxa",
      "name": "voxa"
    },
    {
      "id": "tag-onboarding",
      "name": "onboarding"
    }
  ],
  "meta": {
    "templateCredsSetupCompleted": false,
    "description": "Voxa Workflow 1 \u2014 provisions Twilio number + ElevenLabs agent + phone import + assignment after Stripe Checkout completes. Responds synchronously so /api/stripe/webhook can ACK Stripe within 4s. Errors on any HTTP step fall through to a Supabase status='failed' branch."
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Voxa W1 — Onboarding. Uses supabase, httpRequest. Webhook trigger; 14 nodes.

Source: https://github.com/Sushant6095/voxa-stipeXelevenlabs/blob/39a43bd46d82f880dc779c1af83d4c159e7945ca/n8n/01-onboarding.json — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

booking no duplicate. Uses httpRequest, supabase. Webhook trigger; 38 nodes.

HTTP Request, Supabase
Data & Sheets

01-intake-storage. Uses airtable, supabase, stopAndError, httpRequest. Webhook trigger; 33 nodes.

Airtable, Supabase, Stop And Error +2
Data & Sheets

2. Refresh Pipedrive tokens. Uses stopAndError, stickyNote, supabase, httpRequest. Webhook trigger; 29 nodes.

Stop And Error, Supabase, HTTP Request
Data & Sheets

This workflow provides an OAuth 2.0 auth token refresh process for better control. Developers can utilize it as an alternative to n8n's built-in OAuth flow to achieve improved control and visibility.

Stop And Error, Supabase, HTTP Request
Data & Sheets

n8n-supabase-ai-pipeline. Uses supabase, httpRequest, postgres, readWriteFile. Webhook trigger; 25 nodes.

Supabase, HTTP Request, Postgres +1