AutomationFlowsMarketing & Ads › Web3 Wallet Tracker: Sync Balances to Ga4, Bigquery, and Discord Whale Alerts

Web3 Wallet Tracker: Sync Balances to Ga4, Bigquery, and Discord Whale Alerts

ByAdil Khan @scalo-labs on n8n.io

This workflow bridges the gap between anonymous website traffic and on-chain wallet activity. It captures wallet connections via a webhook, enriches the data with real-time USD balances from the Zerion API, and syncs the results to Google Analytics 4, BigQuery, and Discord for…

Webhook trigger★★★★☆ complexity8 nodesHTTP RequestGoogle BigQueryDiscord
Marketing & Ads Trigger: Webhook Nodes: 8 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #13202 — we link there as the canonical source.

This workflow follows the Discord → HTTP Request 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
{
  "id": "bxHiJI04Rm0lO9HySi7-X",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Query web3 wallet balance, send data to BigQuery & GA4 and Discord whale alert",
  "tags": [
    {
      "id": "DJcYrZuaomqXolEb",
      "name": "bigquery",
      "createdAt": "2026-02-03T12:14:23.761Z",
      "updatedAt": "2026-02-03T12:14:23.761Z"
    },
    {
      "id": "hxhinyNy2Xb3p64A",
      "name": "web3",
      "createdAt": "2026-02-03T12:14:25.662Z",
      "updatedAt": "2026-02-03T12:14:25.662Z"
    },
    {
      "id": "m5iCWoJAMNpsodp3",
      "name": "ga4",
      "createdAt": "2026-01-25T15:28:48.821Z",
      "updatedAt": "2026-01-25T15:28:48.821Z"
    }
  ],
  "nodes": [
    {
      "id": "1d0a4bb5-0e3a-47dc-adb9-f33e6a1bb1b6",
      "name": "Webhook - Receive data from GTM",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -1136,
        240
      ],
      "parameters": {
        "path": "wallet_ingest",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "f089dcc1-b3c2-48d6-a2b4-adb891792086",
      "name": "HTTP Request - Query wallet balance in Zerion",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -912,
        240
      ],
      "parameters": {
        "url": "=https://api.zerion.io/v1/wallets/{{$json.body.wallet_address}}/portfolio?currency=usd",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBasicAuth"
      },
      "credentials": {
        "httpBasicAuth": {
          "name": "<your credential>"
        },
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "ba6d173a-6c35-421d-89d7-28bca5f9a9e9",
      "name": "HTTP Request - Send Measurement Protocol Hit Wallet Balance",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -464,
        48
      ],
      "parameters": {
        "url": "https://www.google-analytics.com/mp/collect?measurement_id=G-6ZRWY6SYN7&api_secret=XPOhYOSeTduRKY7R4zPL6g",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"client_id\": \"{{ $json.ga_client_id }}\",\n  \"events\": [\n    {\n      \"name\": \"connect_wallet\", \n      \"params\": {\n        \"wallet_usd_balance\": {{ $json.wallet_usd_balance }},\n        \"engagement_time_msec\": \"100\",\n        \"session_id\": \"{{ $json.ga_session_id }}\" \n      }\n    }\n  ]\n}",
        "sendBody": true,
        "contentType": "=json",
        "specifyBody": "json",
        "bodyParameters": {
          "parameters": [
            {}
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "1b70d51e-0922-4842-8309-45e3b34618ac",
      "name": "Edit Fields ",
      "type": "n8n-nodes-base.set",
      "position": [
        -688,
        240
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "be1eb1bf-8623-4ca8-a2f9-2ef8a4b60643",
              "name": "wallet_usd_balance",
              "type": "string",
              "value": "={{$json.data.attributes.total.positions}}"
            },
            {
              "id": "10a32845-ce83-4361-ba47-1855d2c98217",
              "name": "hashed_wallet_id",
              "type": "string",
              "value": "={{ $('Webhook - Receive data from GTM').item.json.body.hashed_wallet_id }}"
            },
            {
              "id": "688570ca-c158-40ab-a882-3a1b7f70aff7",
              "name": "ga_client_id",
              "type": "string",
              "value": "={{ $('Webhook - Receive data from GTM').item.json.body.ga_client_id }}"
            },
            {
              "id": "aad1a7d8-61b3-4c63-80f5-95da18cccfbc",
              "name": "ga_session_id",
              "type": "string",
              "value": "={{ $('Webhook - Receive data from GTM').item.json.body.ga_session_id }}"
            },
            {
              "id": "e46e8e48-7a95-472c-b6bd-0b6cae472dc1",
              "name": "wallet_id",
              "type": "string",
              "value": "={{ $('Webhook - Receive data from GTM').item.json.body.wallet_address }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "e5512096-4a45-458f-86f7-0daeee3c3715",
      "name": "BigQuery - Send wallet address to a table",
      "type": "n8n-nodes-base.googleBigQuery",
      "position": [
        -464,
        240
      ],
      "parameters": {
        "options": {},
        "tableId": {
          "__rl": true,
          "mode": "list",
          "value": "wallet_mapping",
          "cachedResultName": "wallet_mapping"
        },
        "dataMode": "define",
        "fieldsUi": {
          "values": [
            {
              "fieldId": "wallet_address",
              "fieldValue": "={{ $json.wallet_id }}"
            },
            {
              "fieldId": "hashed_wallet_id",
              "fieldValue": "={{ $json.hashed_wallet_id }}"
            },
            {
              "fieldId": "ga_client_id",
              "fieldValue": "={{ $json.ga_client_id }}"
            },
            {
              "fieldId": "ga_session_id",
              "fieldValue": "={{ $json.ga_session_id }}"
            }
          ]
        },
        "datasetId": {
          "__rl": true,
          "mode": "list",
          "value": "wallets",
          "cachedResultName": "wallets"
        },
        "operation": "insert",
        "projectId": {
          "__rl": true,
          "mode": "list",
          "value": "scalo-labs-testing",
          "cachedResultUrl": "https://console.cloud.google.com/bigquery?project=scalo-labs-testing",
          "cachedResultName": "scalo-labs-testing"
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "fd749ec1-5489-46b6-9506-485d4967fc11",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1680,
        -336
      ],
      "parameters": {
        "width": 1792,
        "height": 976,
        "content": "## Query web3 wallet USD balance + send data to BigQuery & GA4 through Measurement Protocol \n\n## How it works\n\nThis workflow seamlessly receives wallet details from Google Tag Manager, queries the wallet USD balance in Zerion and passes the wallet balance details to BigQuery and Google Analytics as a custom metric through the Measurement Protocol system.  It also runs a check and if the wallet balance is greater than a set amount, it sends a message to a specific Discord channel with a 'Whale alert; their usd balance and balances by each blockchain'\nVideo walkthrough: https://youtu.be/2_wuTRzRpkg\n\n## Setup steps\n\n1.  **Webhook trigger**: Configure a POST n8n link to ingest the wallet details directly from Google Tag Manager, once the user connects their wallet on the website.\n2.  **Credentials**: Configure credentials for GA4, Zerion and BigQuery.\n3.  **HTTP Request for wallet balance**: Queries wallet balance in Zerion API\n4. **HTTP request**: Send a POST event to GA4 with the wallet balance as a measurement protocol hit to append the details to an already existing session/client id\n5. **BigQuery** : Send wallet address, hashed wallet address, USD balance, session and client id to map GA4 data to BigQuery (using hashed wallet address as a join key)\n6. **Switch** Check if USD balance is higher than a particular amount\n7. **If condition is met, send a message to a Discord channel sharing wallet balance details, wallet id and balance by each chain."
      },
      "typeVersion": 1
    },
    {
      "id": "6e8d44e0-c087-49cf-a7b6-a0a13fec0b9c",
      "name": "Switch - Check if balance>50 to know whale",
      "type": "n8n-nodes-base.switch",
      "position": [
        -464,
        432
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "loose"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "8dfef380-0168-4712-9ec5-1b6e4bb85ac1",
                    "operator": {
                      "type": "number",
                      "operation": "gte"
                    },
                    "leftValue": "={{ $json.wallet_usd_balance.toNumber() }}",
                    "rightValue": 50
                  }
                ]
              }
            }
          ]
        },
        "options": {},
        "looseTypeValidation": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "87eb6e4a-d09b-43b8-9f9b-7e1e47dfb685",
      "name": "Send a message to admin channel - whale wallet balance details",
      "type": "n8n-nodes-base.discord",
      "position": [
        -240,
        432
      ],
      "parameters": {
        "content": "=\ud83d\udea8 **WHALE ALERT** \ud83d\udea8\nTotal Balance: ${{ $json.wallet_usd_balance.toNumber().toFixed(2) }}\nWallet: {{ $json.wallet_id }}\n\n**Chain Breakdown:**\n{{ Object.entries($node[\"HTTP Request - Query wallet balance in Zerion\"].json.data.attributes.positions_distribution_by_chain).filter(c => c[1] > 0.1).map(c => \"\u2022 \" + c[0].toUpperCase() + \": $\" + c[1].toFixed(2)).join('\\n') }}\n\n[View Portfolio](https://app.zerion.io/{{ $json.wallet_id }}/overview)",
        "guildId": {
          "__rl": true,
          "mode": "list",
          "value": "1477397884948185342",
          "cachedResultUrl": "https://discord.com/channels/1477397884948185342",
          "cachedResultName": "Block Raptor's server"
        },
        "options": {},
        "resource": "message",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "1477397986873970880",
          "cachedResultUrl": "https://discord.com/channels/1477397884948185342/1477397986873970880",
          "cachedResultName": "whale-connected"
        }
      },
      "credentials": {
        "discordBotApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    }
  ],
  "active": true,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "00ae1c62-8b10-4951-bd8c-25e4e4cf269f",
  "connections": {
    "Edit Fields ": {
      "main": [
        [
          {
            "node": "HTTP Request - Send Measurement Protocol Hit Wallet Balance",
            "type": "main",
            "index": 0
          },
          {
            "node": "BigQuery - Send wallet address to a table",
            "type": "main",
            "index": 0
          },
          {
            "node": "Switch - Check if balance>50 to know whale",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook - Receive data from GTM": {
      "main": [
        [
          {
            "node": "HTTP Request - Query wallet balance in Zerion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch - Check if balance>50 to know whale": {
      "main": [
        [
          {
            "node": "Send a message to admin channel - whale wallet balance details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request - Query wallet balance in Zerion": {
      "main": [
        [
          {
            "node": "Edit Fields ",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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

This workflow bridges the gap between anonymous website traffic and on-chain wallet activity. It captures wallet connections via a webhook, enriches the data with real-time USD balances from the Zerion API, and syncs the results to Google Analytics 4, BigQuery, and Discord for…

Source: https://n8n.io/workflows/13202/ — original creator credit. Request a take-down →

More Marketing & Ads workflows → · Browse all categories →

Related workflows

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

Marketing & Ads

This workflow automates bulk email campaigns with built-in validation, deliverability protection, and smart send-time optimization.

HTTP Request, Postgres, Gmail
Marketing & Ads

Fetch Multiple Google Analytics GA4 metrics daily, post to Discord, update previous day’s entry as GA data finalizes over seven days. Automates daily traffic reporting Maintains single message per day

Google Analytics, Discord, HTTP Request
Marketing & Ads

This workflow is designed to manage the assignment and validation of unique QR code coupons within a lead generation system with SuiteCRM.

HTTP Request, Form Trigger, Google Sheets +1
Marketing & Ads

This workflow acts as an instant SDR that replies to new inbound leads across multiple channels in real time. It first captures and normalizes all incoming lead data into a unified structure. The work

Google Sheets, HTTP Request, Gmail +1
Marketing & Ads

AI Lead Qualification & Roting System. Uses httpRequest, twilio, airtable. Webhook trigger; 26 nodes.

HTTP Request, Twilio, Airtable