AutomationFlowsSlack & Telegram › Content Intake (form + Whatsapp)

Content Intake (form + Whatsapp)

05 - Content Intake (Form + WhatsApp). Uses formTrigger, httpRequest, supabase, errorTrigger. Event-driven trigger; 16 nodes.

Event trigger★★★★☆ complexity16 nodesForm TriggerHTTP RequestSupabaseError Trigger
Slack & Telegram Trigger: Event Nodes: 16 Complexity: ★★★★☆ Added:

This workflow follows the Error Trigger → 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
{
  "name": "05 - Content Intake (Form + WhatsApp)",
  "nodes": [
    {
      "id": "form-trigger",
      "name": "Content Submission Form",
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2,
      "position": [
        250,
        300
      ],
      "parameters": {
        "formTitle": "Post New Product Content",
        "formDescription": "Submit content to be published on Facebook and Instagram",
        "formFields": {
          "values": [
            {
              "fieldLabel": "title",
              "fieldType": "text",
              "requiredField": true,
              "placeholder": "e.g. TP-Link AX3000 Wi-Fi 6 Router"
            },
            {
              "fieldLabel": "image",
              "fieldType": "file",
              "requiredField": false,
              "acceptFileTypes": ".jpg,.jpeg,.png,.webp"
            },
            {
              "fieldLabel": "description",
              "fieldType": "textarea",
              "requiredField": false,
              "placeholder": "Optional: describe the product (leave blank for AI to generate)"
            }
          ]
        },
        "responseMode": "responseNode",
        "options": {}
      }
    },
    {
      "id": "extract-fields",
      "name": "Extract Submitted Fields",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        470,
        300
      ],
      "parameters": {
        "jsCode": "const formData = $input.item.json;\nconst title = formData.title || formData.data?.title || '';\nconst description = formData.description || formData.data?.description || '';\nconst imageUrl = formData.image || formData.data?.image || '';\n\nif (!title.trim()) {\n  throw new Error('Title is required');\n}\n\nreturn [{ json: {\n  title: title.trim(),\n  description: description.trim(),\n  imageUrl: imageUrl.trim(),\n  hasImage: imageUrl.trim().length > 0,\n  hasDescription: description.trim().length > 0,\n}}];"
      }
    },
    {
      "id": "check-image",
      "name": "Has Image?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        690,
        300
      ],
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "conditions": [
            {
              "id": "cond-has-image",
              "leftValue": "={{ $json.hasImage }}",
              "rightValue": true,
              "operator": {
                "type": "boolean",
                "operation": "true"
              }
            }
          ],
          "combinator": "and"
        }
      }
    },
    {
      "id": "upload-provided-image",
      "name": "Upload Provided Image to Cloudinary",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        910,
        150
      ],
      "parameters": {
        "method": "POST",
        "url": "=https://api.cloudinary.com/v1_1/{{ $env.CLOUDINARY_CLOUD_NAME }}/image/upload",
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "file",
              "value": "={{ $('Extract Submitted Fields').item.json.imageUrl }}"
            },
            {
              "name": "api_key",
              "value": "={{ $env.CLOUDINARY_API_KEY }}"
            },
            {
              "name": "upload_preset",
              "value": "sales_bot_unsigned"
            },
            {
              "name": "folder",
              "value": "products"
            }
          ]
        }
      }
    },
    {
      "id": "groq-image-prompt",
      "name": "Groq: Build FLUX Image Prompt",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        910,
        450
      ],
      "parameters": {
        "method": "POST",
        "url": "https://api.groq.com/openai/v1/chat/completions",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $env.GROQ_API_KEY }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ model: 'meta/llama-3.3-70b-instruct', messages: [{ role: 'system', content: 'You are a product photography prompt writer. Write a single FLUX 1 image generation prompt for a professional product photo. Output only the prompt, nothing else.' }, { role: 'user', content: 'Product: ' + $('Extract Submitted Fields').item.json.title }], max_tokens: 150, temperature: 0.5 }) }}"
      }
    },
    {
      "id": "nvidia-flux",
      "name": "NVIDIA FLUX: Generate Product Image",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1130,
        450
      ],
      "parameters": {
        "method": "POST",
        "url": "https://ai.api.nvidia.com/v1/genai/black-forest-labs/flux.1-dev",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $env.NVIDIA_FLUX_API_KEY }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ prompt: $json.choices[0].message.content, width: 1024, height: 1024, num_inference_steps: 20, guidance_scale: 3.5, seed: Math.floor(Math.random() * 999999) }) }}"
      }
    },
    {
      "id": "upload-flux-image",
      "name": "Upload AI Image to Cloudinary",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1350,
        450
      ],
      "parameters": {
        "method": "POST",
        "url": "=https://api.cloudinary.com/v1_1/{{ $env.CLOUDINARY_CLOUD_NAME }}/image/upload",
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "file",
              "value": "=data:image/png;base64,{{ $json.artifacts?.[0]?.base64 || $json.image || '' }}"
            },
            {
              "name": "api_key",
              "value": "={{ $env.CLOUDINARY_API_KEY }}"
            },
            {
              "name": "upload_preset",
              "value": "sales_bot_unsigned"
            },
            {
              "name": "folder",
              "value": "products/ai-generated"
            }
          ]
        }
      }
    },
    {
      "id": "merge-image-path",
      "name": "Merge: Get Cloudinary URL",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1570,
        300
      ],
      "parameters": {
        "jsCode": "// Collect cloudinary URL from whichever path ran\nconst allItems = $input.all();\nconst cloudinaryUrl = allItems[0]?.json?.secure_url || allItems[0]?.json?.url || '';\nconst base = $('Extract Submitted Fields').item.json;\nreturn [{ json: { ...base, cloudinaryUrl } }];"
      }
    },
    {
      "id": "check-description",
      "name": "Has Description?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        1790,
        300
      ],
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "conditions": [
            {
              "id": "cond-has-desc",
              "leftValue": "={{ $json.hasDescription }}",
              "rightValue": true,
              "operator": {
                "type": "boolean",
                "operation": "true"
              }
            }
          ],
          "combinator": "and"
        }
      }
    },
    {
      "id": "pass-description",
      "name": "Use Provided Description",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.3,
      "position": [
        2010,
        150
      ],
      "parameters": {
        "mode": "manual",
        "fields": {
          "values": [
            {
              "name": "finalDescription",
              "type": "stringValue",
              "value": "={{ $json.description }}"
            },
            {
              "name": "cloudinaryUrl",
              "type": "stringValue",
              "value": "={{ $json.cloudinaryUrl }}"
            },
            {
              "name": "title",
              "type": "stringValue",
              "value": "={{ $json.title }}"
            }
          ]
        }
      }
    },
    {
      "id": "groq-description",
      "name": "Groq: Generate Description",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        2010,
        450
      ],
      "parameters": {
        "method": "POST",
        "url": "https://api.groq.com/openai/v1/chat/completions",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $env.GROQ_API_KEY }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ model: 'meta/llama-3.3-70b-instruct', messages: [{ role: 'system', content: 'Write a 2-3 sentence product description for a networking hardware product. Include product type, key features, and ideal use case. Professional tone.' }, { role: 'user', content: 'Product name: ' + $('merge-image-path').item.json.title }], max_tokens: 200, temperature: 0.6 }) }}"
      }
    },
    {
      "id": "build-final",
      "name": "Build Final Payload",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        2230,
        300
      ],
      "parameters": {
        "jsCode": "const allItems = $input.all();\nconst item = allItems[0]?.json || {};\n\n// Description: from pass-through or from Groq response\nlet description = item.finalDescription || item.description || '';\nif (!description && item.choices) {\n  description = item.choices[0]?.message?.content?.trim() || '';\n}\n\n// Cloudinary URL: from this item or from earlier merge node\nconst cloudinaryUrl = item.cloudinaryUrl || $('merge-image-path').item.json?.cloudinaryUrl || '';\nconst title = item.title || $('Extract Submitted Fields').item.json?.title || '';\n\nreturn [{ json: { title, description, cloudinaryUrl } }];"
      }
    },
    {
      "id": "insert-queue",
      "name": "Insert into content_queue",
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        2450,
        300
      ],
      "parameters": {
        "operation": "create",
        "tableId": "content_queue",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "product_tag",
              "fieldValue": "={{ $json.title.toLowerCase().includes('router') ? 'router' : $json.title.toLowerCase().includes('access point') || $json.title.toLowerCase().includes(' ap') ? 'access_point' : $json.title.toLowerCase().includes('switch') ? 'switch' : 'router' }}"
            },
            {
              "fieldId": "cloudinary_url",
              "fieldValue": "={{ $json.cloudinaryUrl }}"
            },
            {
              "fieldId": "caption_fb",
              "fieldValue": ""
            },
            {
              "fieldId": "caption_ig",
              "fieldValue": ""
            },
            {
              "fieldId": "boost_eligible",
              "fieldValue": false
            },
            {
              "fieldId": "platforms",
              "fieldValue": "={{ ['fb','ig'] }}"
            }
          ]
        }
      },
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "id": "form-response",
      "name": "Respond to Form",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        2670,
        300
      ],
      "parameters": {
        "respondWith": "text",
        "responseBody": "\u2705 Content queued! '{{ $('Build Final Payload').item.json.title }}' will be published next time the daily schedule runs (10AM)."
      }
    },
    {
      "id": "error-trigger-05",
      "name": "On Error",
      "type": "n8n-nodes-base.errorTrigger",
      "typeVersion": 1,
      "position": [
        250,
        520
      ]
    },
    {
      "id": "log-error-05",
      "name": "Log Error",
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        470,
        520
      ],
      "parameters": {
        "operation": "create",
        "tableId": "error_log",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "workflow",
              "fieldValue": "05-content-intake"
            },
            {
              "fieldId": "node_name",
              "fieldValue": "={{ $json.execution.lastNodeExecuted }}"
            },
            {
              "fieldId": "error_message",
              "fieldValue": "={{ $json.error.message }}"
            }
          ]
        }
      },
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Content Submission Form": {
      "main": [
        [
          {
            "node": "Extract Submitted Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Submitted Fields": {
      "main": [
        [
          {
            "node": "Has Image?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Has Image?": {
      "main": [
        [
          {
            "node": "Upload Provided Image to Cloudinary",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Groq: Build FLUX Image Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload Provided Image to Cloudinary": {
      "main": [
        [
          {
            "node": "Merge: Get Cloudinary URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq: Build FLUX Image Prompt": {
      "main": [
        [
          {
            "node": "NVIDIA FLUX: Generate Product Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "NVIDIA FLUX: Generate Product Image": {
      "main": [
        [
          {
            "node": "Upload AI Image to Cloudinary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload AI Image to Cloudinary": {
      "main": [
        [
          {
            "node": "Merge: Get Cloudinary URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge: Get Cloudinary URL": {
      "main": [
        [
          {
            "node": "Has Description?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Has Description?": {
      "main": [
        [
          {
            "node": "Use Provided Description",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Groq: Generate Description",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Use Provided Description": {
      "main": [
        [
          {
            "node": "Build Final Payload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq: Generate Description": {
      "main": [
        [
          {
            "node": "Build Final Payload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Final Payload": {
      "main": [
        [
          {
            "node": "Insert into content_queue",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Insert into content_queue": {
      "main": [
        [
          {
            "node": "Respond to Form",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On Error": {
      "main": [
        [
          {
            "node": "Log Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [
    {
      "name": "sales-automation"
    }
  ]
}

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

05 - Content Intake (Form + WhatsApp). Uses formTrigger, httpRequest, supabase, errorTrigger. Event-driven trigger; 16 nodes.

Source: https://github.com/hckeer/automatewholebusiness/blob/9da09c3a8bf5afb3dc438a43b6447b7d67de712e/n8n-workflows/05-content-intake.json — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

This workflow collects a blog brief via an n8n form, uses Anthropic Claude to generate an outline and write each section, saves both outline and article as formatted Google Docs in Google Drive, then

Form Trigger, Google Sheets, HTTP Request +2
Slack & Telegram

clients kept booking meetings during my prayer times. i'd either miss a prayer or scramble to reschedule. the problem wasn't the clients — it was that my calendar had no blocked windows for salah. i n

Telegram Trigger, HTTP Request, Google Calendar +3
Slack & Telegram

This workflow is designed for **customer support teams, e-commerce founders, and operations managers** who want to handle thousands of customer queries seamlessly. Instead of building a brand-new chat

Telegram Trigger, Supabase, WhatsApp +2
Slack & Telegram

This n8n workflow automates task management by integrating Trello, Supabase, and Telegram to streamline card creation, user assignment, and due date notifications. It ensures seamless synchronization

Trello Trigger, Telegram, Supabase +1
Slack & Telegram

This workflow is an AI-powered roto matte generation and first-pass compositing pipeline designed for VFX production. It transforms structured roto requests into multiple high-precision matte passes u

HTTP Request, Slack, Error Trigger +4