This workflow corresponds to n8n.io template #12026 — we link there as the canonical source.
This workflow follows the Airtable → 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 →
{
"id": "KGIlO8s3haBFAuvM",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Smart Contract Event Monitor (Web3)",
"tags": [],
"nodes": [
{
"id": "55435e36-e03f-4100-94c6-a28059554241",
"name": "Daily Check",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-992,
-176
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 10
}
]
}
},
"typeVersion": 1.2
},
{
"id": "234c9b04-57ca-4158-96fc-57356114e670",
"name": "Fetch USDT transaction logs",
"type": "n8n-nodes-base.httpRequest",
"position": [
-576,
-176
],
"parameters": {
"url": "https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY",
"body": "={\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"eth_getLogs\",\n \"params\": [\n {\n \"fromBlock\": \"{{ $json.result }}\",\n \"toBlock\": \"{{ $json.result }}\",\n \"address\": \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n \"topics\": [\n \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\"\n ]\n }\n ]\n}\n",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "raw",
"sendHeaders": true,
"rawContentType": "application/json",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.3
},
{
"id": "4aa19463-9589-4350-b348-850635c2cb3f",
"name": "Extract transactions details",
"type": "n8n-nodes-base.code",
"position": [
-400,
-176
],
"parameters": {
"jsCode": "// Flatten the result array\nconst allLogs = $json.result || [];\n\nreturn allLogs\n .map(logs => {\n if (!logs.topics || logs.topics.length < 3) {\n return null; // skip invalid logs\n }\n\n function hexToAddress(topic) { return \"0x\" + topic.slice(-40); }\n function hexToDecimal(hex) { return BigInt(hex).toString(); }\n\n return {\n json: {\n contract: logs.address,\n from: hexToAddress(logs.topics[1]),\n to: hexToAddress(logs.topics[2]),\n value: hexToDecimal(logs.data),\n blockNumber: logs.blockNumber,\n txHash: logs.transactionHash\n }\n };\n })\n .filter(Boolean); // remove skipped logs\n"
},
"typeVersion": 2
},
{
"id": "9dc85842-0582-4142-ace2-181f9c729b13",
"name": "Filter high value transaction",
"type": "n8n-nodes-base.if",
"position": [
-240,
-176
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "66406893-0e29-4e18-90b3-7cd582d08a7f",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.value }}",
"rightValue": 1000000000
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "8b54525f-1508-4264-aa42-8beddec8ec72",
"name": "Save transaction",
"type": "n8n-nodes-base.airtable",
"position": [
64,
-288
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appF2iYPgVqqyXDC1",
"cachedResultUrl": "https://airtable.com/appF2iYPgVqqyXDC1",
"cachedResultName": "n8n Demo"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblMe6cVaetBcDN11",
"cachedResultUrl": "https://airtable.com/appF2iYPgVqqyXDC1/tblMe6cVaetBcDN11",
"cachedResultName": "Blockchain"
},
"columns": {
"value": {
"Value": "={{ $json.value }}",
"txHash": "={{ $json.txHash }}",
"Contract": "={{ $json.contract }}",
"To Address": "={{ $json.to }}",
"Block NUmber": "={{ $json.blockNumber }}",
"From Address": "={{ $json.from }}"
},
"schema": [
{
"id": "Contract",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Contract",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "From Address",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "From Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "To Address",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "To Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Value",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Value",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "txHash",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "txHash",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Block NUmber",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Block NUmber",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "d147eef6-5bad-4043-96c8-cd6dd84bbff1",
"name": "Genrate transction summary",
"type": "n8n-nodes-base.code",
"position": [
240,
-288
],
"parameters": {
"jsCode": "// Filter items that have a valid Value in Airtable output\nconst validItems = items.filter(item => item.json.fields && item.json.fields.Value !== undefined);\n\nif (validItems.length === 0) {\n return [{\n json: { text: \"No high-value transfers found.\" }\n }];\n}\n\n// Find the largest transfer\nconst largest = validItems.reduce((max, item) => {\n return BigInt(item.json.fields.Value) > BigInt(max.json.fields.Value) ? item : max;\n}, validItems[0]);\n\nreturn [{\n json: {\n text: `${validItems.length} high-value transfers detected. Largest transfer: ${largest.json.fields.Value} from ${largest.json.fields[\"From Address\"]} to ${largest.json.fields[\"To Address\"]}. Stored in Airtable.`\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "fb25e310-48b9-4e57-86aa-0b51466892b5",
"name": "Send transaction alert",
"type": "n8n-nodes-base.slack",
"position": [
432,
-288
],
"parameters": {
"text": "=High value transfer alert\n{{ $json.text }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09S57E2JQ2",
"cachedResultName": "n8n"
},
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "06ca1ebd-6139-4e00-b106-9147e5e32e9d",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1552,
-704
],
"parameters": {
"width": 432,
"height": 752,
"content": "## How it works\nThis workflow automatically checks the blockchain every day and looks for big USDT transactions happening in the latest block. It extracts the sender, receiver, amount, and transaction details. If the transaction value is higher than a defined limit, the workflow saves those records into Airtable for tracking. After saving, it creates a short summary and sends one clear alert message to Slack. That message tells the team how many large transactions were found and highlights the biggest one. This helps you stay updated without checking the blockchain manually or receiving too many notifications.\n\n\n## Setup steps\n\n**1.** Add your Alchemy API URL for Ethereum mainnet in the HTTP nodes.\n\n**2.** Set the USDT contract address and Transfer event topic (already included).\n\n**3.** Connect your Airtable account and select the correct base and table.\n\n**4.** Make sure fields in Airtable match the workflow: Contract, From Address, To Address, Value, Block Number, and txHash.\n\n**5.** Connect your Slack account and select the channel where you want alerts.\n\n**6.** Adjust the value threshold in the IF node if you want a different limit.\n\n**7.** Activate the workflow to start receiving daily notifications."
},
"typeVersion": 1
},
{
"id": "1a99ed87-73f7-46f1-b11d-dcfe11181a9a",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1088,
-256
],
"parameters": {
"color": 7,
"width": 224,
"height": 224,
"content": "Runs the workflow automatically at a set time every day."
},
"typeVersion": 1
},
{
"id": "2be408ef-49b0-4d6f-9a73-3c6b334bc362",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-848,
-432
],
"parameters": {
"color": 7,
"width": 784,
"height": 464,
"content": "## High-Value USDT Transaction Detection\n\n**Get latest blocknumber** \u2013 Gets the latest Ethereum block number from the blockchain.\n\n**Fetch USDT transaction logs** \u2013 Fetches all USDT \u201cTransfer\u201d events from that block.\n\n**Extract transactions details** \u2013 Extracts and formats sender, receiver, amount, and transaction details from the blockchain data.\n\n**Filter high value transaction** \u2013 Checks if the transaction amount is above the threshold to consider it \u201chigh-value.\u201d"
},
"typeVersion": 1
},
{
"id": "6416dc8f-82f9-48cd-94e7-b5516762a1e7",
"name": "Get latest blocknumber",
"type": "n8n-nodes-base.httpRequest",
"position": [
-784,
-176
],
"parameters": {
"url": "https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY",
"method": "POST",
"options": {},
"jsonBody": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"eth_blockNumber\",\n \"params\": []\n}\n",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.3
},
{
"id": "2190a35d-33af-46b4-b4db-fea6669be8df",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-16,
-528
],
"parameters": {
"color": 7,
"width": 656,
"height": 416,
"content": "## Record & Alert High-Value Transactions\n\n**Save transaction** \u2013 Saves the high-value transaction details into Airtable for tracking.\n\n**Genrate transaction summary** \u2013 Summarizes all saved transactions and identifies the largest one.\n\n**Send transaction alert** \u2013 Sends a clear alert to Slack with the number of high-value transactions and the largest transfer.\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "d08f763e-5a00-4780-94c3-de59b07d7bbe",
"connections": {
"Daily Check": {
"main": [
[
{
"node": "Get latest blocknumber",
"type": "main",
"index": 0
}
]
]
},
"Save transaction": {
"main": [
[
{
"node": "Genrate transction summary",
"type": "main",
"index": 0
}
]
]
},
"Get latest blocknumber": {
"main": [
[
{
"node": "Fetch USDT transaction logs",
"type": "main",
"index": 0
}
]
]
},
"Genrate transction summary": {
"main": [
[
{
"node": "Send transaction alert",
"type": "main",
"index": 0
}
]
]
},
"Fetch USDT transaction logs": {
"main": [
[
{
"node": "Extract transactions details",
"type": "main",
"index": 0
}
]
]
},
"Extract transactions details": {
"main": [
[
{
"node": "Filter high value transaction",
"type": "main",
"index": 0
}
]
]
},
"Filter high value transaction": {
"main": [
[
{
"node": "Save transaction",
"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.
airtableTokenApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automatically monitors the Ethereum blockchain, extracts USDT transfer events, filters large-value transactions, stores them in Airtable and sends a clean daily summary alert to Slack.
Source: https://n8n.io/workflows/12026/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This template provides a fully automated system for monitoring news on any topic you choose. It leverages Linkup's AI-powered web search to find recent, relevant articles, extracts key information lik
This n8n workflow monitors WooCommerce refund activity to detect unusual spikes in product returns at the SKU level. It compares return volumes across rolling 24-hour windows, alerts teams in Slack wh
This workflow is an automated employee time tracking and reporting system that monitors weekly work hours via TMetric, then delivers personalized summaries directly to each team member on Slack. It co
Import Productboard Notes Companies And Features Into Snowflake. Uses stickyNote, httpRequest, splitOut, snowflake. Scheduled trigger; 35 nodes.
Import Productboard Notes, Companies and Features into Snowflake. Uses stickyNote, httpRequest, splitOut, snowflake. Scheduled trigger; 35 nodes.