This workflow follows the Agent → Google Sheets 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 →
{
"name": "Ai Agente de IA - Nutricionista",
"nodes": [
{
"parameters": {
"operation": "toBinary",
"sourceProperty": "data.base64",
"binaryPropertyName": "dataDownload",
"options": {
"fileName": "={{ $('Webhook1').item.json.body.data.pushName + '_' + $now.toFormat('dd.MM.yy.HH.mm.ss') + '.jpeg' }}\n",
"mimeType": "={{ $json.data.mimetype }}"
}
},
"type": "n8n-nodes-base.convertToFile",
"typeVersion": 1.1,
"position": [
400,
928
],
"id": "a283e581-c5e3-4e34-917c-17b2beced197",
"name": "Convert to File"
},
{
"parameters": {
"resource": "chat-api",
"operation": "get-media-base64",
"instanceName": "BotJornada",
"messageId": "={{ $json.body.data.key.id }}"
},
"type": "n8n-nodes-evolution-api.evolutionApi",
"typeVersion": 1,
"position": [
192,
928
],
"id": "7f52c744-6eda-4900-b273-a761030e4b03",
"name": "DownloadImage",
"retryOnFail": true,
"waitBetweenTries": 5000,
"credentials": {
"evolutionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"resource": "messages-api",
"instanceName": "BotJornada",
"remoteJid": "={{ $('Webhook1').item.json.body.data.key.remoteJid }}",
"messageText": "={{ $json.output.resumo }}",
"options_message": {
"delay": 3000
}
},
"type": "n8n-nodes-evolution-api.evolutionApi",
"typeVersion": 1,
"position": [
1680,
1056
],
"id": "a8bd1b35-7430-49c6-891b-812edb6fa2f3",
"name": "RespondToUser",
"retryOnFail": true,
"waitBetweenTries": 5000,
"credentials": {
"evolutionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"content": "## PROCESSAMENTO DE IMAGEM",
"height": 480,
"width": 1000
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-96,
784
],
"id": "7e13fc18-fb2b-41a4-b096-96c443873425",
"name": "Sticky Note3"
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $json.body.data.message.conversation }}",
"rightValue": "[undefined]",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"id": "ea666ce3-c656-4b66-bde0-1869e8c8444c"
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "isText"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "4d0ea9be-fa53-410a-89da-3929f27fb844",
"leftValue": "={{ $json.body.data.message.imageMessage.mimetype }}",
"rightValue": "image/jpeg",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "isImage"
}
]
},
"looseTypeValidation": true,
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.2,
"position": [
432,
432
],
"id": "57f72e24-d606-4f06-a025-091f4b4808a5",
"name": "TypeMessage"
},
{
"parameters": {
"model": {
"__rl": true,
"value": "gpt-4.1-mini",
"mode": "list",
"cachedResultName": "gpt-4.1-mini"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
1104,
1104
],
"id": "9582b45a-ddb3-44ae-98d7-377da8776a23",
"name": "OpenAI Chat Model1",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"resource": "image",
"operation": "analyze",
"modelId": {
"__rl": true,
"value": "gpt-4o-mini",
"mode": "list",
"cachedResultName": "GPT-4O-MINI"
},
"text": "Sua tarefa \u00e9 analisar a imagem enviada e retornar uma resposta estruturada com base no conte\u00fado visual. Siga as regras abaixo **na ordem de prioridade**:\n\n1. Se a imagem for de um **prato de comida**, identifique:\n - Os **alimentos vis\u00edveis** (por nome, como arroz, feij\u00e3o, carne, salada etc).\n - Uma **estimativa da por\u00e7\u00e3o** de cada alimento (pequena, m\u00e9dia ou grande).\n - A **estimativa de calorias totais** no prato.\n\nResponda exatamente no seguinte formato:\n\n\"Prato identificado\"\n\"Alimentos: [lista de alimentos com por\u00e7\u00e3o estimada]\"\n\"Calorias estimadas: [valor aproximado em kcal]\"\n\n**Exemplo:**\n\nPrato identificado\nAlimentos: arroz (m\u00e9dio), feij\u00e3o (pequeno), frango grelhado (m\u00e9dio), salada (grande)\nCalorias estimadas: 620 kcal\nProteina estimada: 40 gramas\n\n\n2. Se a imagem **n\u00e3o for de comida**, retorne:\n\n\ud83d\udc49 \"Imagem fora do contexto nutricional\" \n\ud83d\udc49 \"Descri\u00e7\u00e3o: [descri\u00e7\u00e3o gen\u00e9rica da imagem]\"\n\n---\n\n\ud83d\udccc **Notas importantes:**\n\n- Sempre verifique se a imagem realmente mostra **comida no prato**.\n- Use nomes comuns de alimentos e **evite termos t\u00e9cnicos**.\n- Se a imagem estiver desfocada ou for inconclusiva, retorne como \"Imagem fora do contexto nutricional\" com uma descri\u00e7\u00e3o apropriada.\n\nTodas as respostas devem ser escritas **em portugu\u00eas** e seguir **exatamente o formato acima**.\n\nSe quiser, posso preparar tamb\u00e9m o prompt do segundo agente (que faz a recomenda\u00e7\u00e3o nutricional com base nos alimentos detectados). Deseja isso?\n",
"inputType": "base64",
"binaryPropertyName": "dataDownload",
"options": {
"detail": "low"
}
},
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 1.8,
"position": [
576,
928
],
"id": "903dfee2-53b4-4b80-b290-a6873557a95d",
"name": "Vision",
"retryOnFail": true,
"waitBetweenTries": 3000,
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"content": "## GERENCIADOR DE MENSAGEM\n ",
"height": 460,
"width": 996
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-96,
304
],
"id": "1f41ba99-93e9-441e-a6fe-d9ce754c34eb",
"name": "Sticky Note6"
},
{
"parameters": {
"resource": "messages-api",
"instanceName": "BotJornada",
"remoteJid": "={{ $json.body.data.key.remoteJid }}",
"messageText": "=Seja bem-vindo! \ud83d\ude04\nO que voc\u00ea comeu hoje? Me manda uma foto do seu prato e eu te conto quantas calorias tem a\u00ed!",
"options_message": {
"delay": 3000
}
},
"type": "n8n-nodes-evolution-api.evolutionApi",
"typeVersion": 1,
"position": [
688,
336
],
"id": "dc822ac9-0c8c-4cf5-9475-647c0d6cdb0b",
"name": "WelcomeMessage",
"credentials": {
"evolutionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"content": "## REGISTRA REFEI\u00c7\u00c3O\n",
"height": 480,
"width": 1000
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
928,
784
],
"id": "48e79446-20af-4142-9694-0cd84fc8a37f",
"name": "Sticky Note7"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a897cbf4-f60a-493f-814d-75093074c478",
"name": "conversation",
"value": "=Imagem enviada pelo usu\u00e1rio: \n{{$node[\"Vision\"].json[\"content\"]}}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
752,
928
],
"id": "78fc062f-4fcb-4963-8cd8-908abab3f90f",
"name": "formatToLLM3"
},
{
"parameters": {},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
0,
928
],
"id": "c941dccb-a0c8-4177-8377-2bac8caee48e",
"name": "Wait5s1"
},
{
"parameters": {
"httpMethod": "POST",
"path": "c9d2ebfb-f621-4bbb-b9cd-394616f43aa5",
"options": {
"binaryPropertyName": "data"
}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
192,
432
],
"id": "c0e09466-a9c7-481e-a11f-e152305ce2f1",
"name": "Webhook1"
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"value": "ID_DA_SUA_PLANILHA",
"mode": "list",
"cachedResultName": "registrarRefeicao",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/ID_DA_SUA_PLANILHA/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "P\u00e1gina1",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/ID_DA_SUA_PLANILHA/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"data": "={{ $json.output.data }}",
"hora": "={{ $json.output.hora }}",
"refeicao": "={{ $json.output.refeicao }}",
"calorias": "={{ $json.output.calorias }}",
"proteina": "={{ $json.output.proteina }}"
},
"matchingColumns": [],
"schema": [
{
"id": "data",
"displayName": "data",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "hora",
"displayName": "hora",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "refeicao",
"displayName": "refeicao",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "calorias",
"displayName": "calorias",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "proteina",
"displayName": "proteina",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.6,
"position": [
1680,
848
],
"id": "a6a17b44-5cdc-482c-b301-828f83633276",
"name": "Append row in sheet",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsonSchemaExample": "{\n \"data\": \"2025-07-24\",\n \"hora\": \"12:45\",\n \"refeicao\": \"Almo\u00e7o\",\n \"calorias\": 680,\n \"proteina\": 45,\n \"resumo\": \"\u2705 Refei\u00e7\u00e3o registrada com sucesso! Foram aproximadamente 680 kcal e 45g de prote\u00edna no almo\u00e7o de hoje, \u00e0s 12:45. Continue firme!\"\n}\n"
},
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"typeVersion": 1.3,
"position": [
1328,
1088
],
"id": "2e907174-656d-4b1c-ad54-eed6ed63ed09",
"name": "Structured Output Parser"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a897cbf4-f60a-493f-814d-75093074c478",
"name": "conversation",
"value": "={{ $json.body.data.message.conversation }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
688,
560
],
"id": "3b69fcd7-1f1d-4779-b4a3-59d68a25b580",
"name": "formatToLLM"
},
{
"parameters": {
"resource": "messages-api",
"instanceName": "BotJornada",
"remoteJid": "={{ $('Webhook1').item.json.body.data.key.remoteJid }}",
"messageText": "={{ $json.output }}",
"options_message": {
"delay": 3000
}
},
"type": "n8n-nodes-evolution-api.evolutionApi",
"typeVersion": 1,
"position": [
1648,
432
],
"id": "a886d71e-d74b-4759-8dfa-6b6192ad4963",
"name": "RespondToUser1",
"retryOnFail": true,
"waitBetweenTries": 5000,
"credentials": {
"evolutionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "={{ $json.conversation }}",
"options": {
"systemMessage": "=Voc\u00ea \u00e9 um agente nutricionista que recebe perguntas em texto pelo WhatsApp. Sua fun\u00e7\u00e3o \u00e9 interpretar essas mensagens e consultar os dados registrados anteriormente em uma planilha de alimenta\u00e7\u00e3o.\n\nVoc\u00ea conta com uma ferramenta chamada `ConsultaNutricional`, que retorna os seguintes campos por data:\n\n- data (formato YYYY-MM-DD)\n- refeicao (ex: \"almo\u00e7o\", \"jantar\", etc.)\n- calorias (valor num\u00e9rico)\n- proteina (valor num\u00e9rico)\n- hora (ex: \"12:45\")\n\n### Comportamento esperado:\n\n1. Quando o usu\u00e1rio enviar perguntas como:\n - \"Quantas calorias eu comi hoje?\"\n - \"Quanto de prote\u00edna j\u00e1 consumi?\"\n - \"Qual foi minha \u00faltima refei\u00e7\u00e3o?\"\n\n2. Use a ferramenta `ConsultaNutricional` para buscar os registros da data de hoje (`{{ $now }}`).\n\n3. Some todas as calorias e prote\u00ednas do dia e responda com algo como:\n\ud83d\udc49 \"Consultei aqui pra voc\u00ea! Hoje voc\u00ea j\u00e1 consumiu **[X] kcal** e **[Y]g de prote\u00edna**.\"\n\n4. Se houver m\u00faltiplas refei\u00e7\u00f5es, voc\u00ea pode mencionar a \u00faltima refei\u00e7\u00e3o registrada tamb\u00e9m:\n\ud83d\udc49 \"Sua \u00faltima refei\u00e7\u00e3o foi \u00e0s 13:40, com 520 kcal e 38g de prote\u00edna.\"\n\n5. Se **n\u00e3o houver nenhum dado hoje**, diga:\n\ud83d\udc49 \"Ainda n\u00e3o encontrei nenhuma refei\u00e7\u00e3o registrada hoje. Que tal me mandar uma foto do seu prato agora?\"\n\n\u26a0\ufe0f Importante:\n- **N\u00e3o use nenhuma ferramenta de grava\u00e7\u00e3o.**\n- Apenas use a `ConsultaNutricional` para buscar dados.\n\nTodas as respostas devem ser em **portugu\u00eas**, com linguagem amig\u00e1vel, simples e motivadora.\n\nData de hoje: {{ $now }}\n\nSomente responder assuntos relacionados a consulta nutricional, sempre que for perguntado sobre outro assunto, voltar para o contexto de nutri\u00e7\u00e3o",
"maxIterations": 15
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.9,
"position": [
1248,
416
],
"id": "37d8deaa-7f71-4b8b-98b9-12c777a30821",
"name": "consultaNutricional"
},
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
1120,
624
],
"id": "fb0fbf37-639e-453c-8c30-eea813ecec68",
"name": "OpenAI Chat Model",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "ID_DA_SUA_PLANILHA",
"mode": "list",
"cachedResultName": "registrarRefeicao",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/ID_DA_SUA_PLANILHA/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "P\u00e1gina1",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/ID_DA_SUA_PLANILHA/edit#gid=0"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheetsTool",
"typeVersion": 4.6,
"position": [
1456,
624
],
"id": "24735dd1-6716-46ef-a764-569257f35b1f",
"name": "consultaNutricional1",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "={{ $json.conversation }}",
"hasOutputParser": true,
"options": {
"systemMessage": "=Voc\u00ea \u00e9 um agente nutricionista que recebe uma mensagem de texto contendo o resultado da an\u00e1lise de uma imagem de um prato de comida. Sua tarefa \u00e9 interpretar esse conte\u00fado e gerar uma resposta no formato JSON estruturado.\n\nA resposta **deve seguir exatamente** o seguinte formato:\n\n{\n \"data\": \"YYYY-MM-DD\",\n \"hora\": \"HH:mm\",\n \"refeicao\": \"[descri\u00e7\u00e3o completa da refei\u00e7\u00e3o com alimentos e por\u00e7\u00f5es]\",\n \"calorias\": [n\u00famero inteiro],\n \"proteina\": [n\u00famero inteiro],\n \"source\": \"whatsapp\",\n \"resumo\": \"\u2705 Refei\u00e7\u00e3o registrada com sucesso! Foram aproximadamente [calorias] kcal e [proteina]g de prote\u00edna. Continue assim!\"\n}\n\n### Regras:\n\n* Use a **data e hora atual** no formato correto (ex: `\"2025-07-24\"` e `\"12:45\"`).\n* O campo `refeicao` deve conter a descri\u00e7\u00e3o dos alimentos com por\u00e7\u00f5es, exatamente como foi extra\u00eddo da an\u00e1lise (ex: \"arroz (m\u00e9dio), feij\u00e3o (m\u00e9dio), carne mo\u00edda (m\u00e9dia), salada (pequena)\").\n* O campo `source` **deve sempre ser** `\"whatsapp\"`.\n* O campo `resumo` deve ser uma mensagem amig\u00e1vel que ser\u00e1 enviada ao usu\u00e1rio confirmando o registro da refei\u00e7\u00e3o, com os valores de calorias e prote\u00ednas inseridos dinamicamente.\n\n### Se n\u00e3o for poss\u00edvel identificar calorias, prote\u00ednas ou alimentos com clareza:\n\n* Retorne **apenas**:\n\n{\n \"resumo\": \"N\u00e3o consegui interpretar corretamente essa imagem. Pode enviar uma foto mais n\u00edtida, por favor?\"\n}\n```\n\nTodas as respostas devem estar em **portugu\u00eas**. Seja objetivo, acolhedor e motivador.\n\nData de hoje: {{ $now }}",
"maxIterations": 15
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.9,
"position": [
1216,
848
],
"id": "93107acd-1159-4b73-a7eb-d64913848b86",
"name": "registrarRefeicao1"
},
{
"parameters": {
"content": "## CONSULTA CALORIAS \n ",
"height": 460,
"width": 996
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
928,
304
],
"id": "01a5b051-3410-47cd-addb-790f0a924466",
"name": "Sticky Note"
}
],
"connections": {
"Convert to File": {
"main": [
[
{
"node": "Vision",
"type": "main",
"index": 0
}
]
]
},
"DownloadImage": {
"main": [
[
{
"node": "Convert to File",
"type": "main",
"index": 0
}
]
]
},
"TypeMessage": {
"main": [
[
{
"node": "formatToLLM",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait5s1",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model1": {
"ai_languageModel": [
[
{
"node": "registrarRefeicao1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Vision": {
"main": [
[
{
"node": "formatToLLM3",
"type": "main",
"index": 0
}
]
]
},
"WelcomeMessage": {
"main": [
[]
]
},
"formatToLLM3": {
"main": [
[
{
"node": "registrarRefeicao1",
"type": "main",
"index": 0
}
]
]
},
"Wait5s1": {
"main": [
[
{
"node": "DownloadImage",
"type": "main",
"index": 0
}
]
]
},
"Webhook1": {
"main": [
[
{
"node": "TypeMessage",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "registrarRefeicao1",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"formatToLLM": {
"main": [
[
{
"node": "consultaNutricional",
"type": "main",
"index": 0
}
]
]
},
"consultaNutricional": {
"main": [
[
{
"node": "RespondToUser1",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "consultaNutricional",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"consultaNutricional1": {
"ai_tool": [
[
{
"node": "consultaNutricional",
"type": "ai_tool",
"index": 0
}
]
]
},
"registrarRefeicao1": {
"main": [
[
{
"node": "RespondToUser",
"type": "main",
"index": 0
},
{
"node": "Append row in sheet",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "61bf21ac-833d-402b-8edc-7601346acd2e",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "cinrzuSV6JnpB9ds",
"tags": []
}
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.
evolutionApigoogleSheetsOAuth2ApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Ai Agente de IA - Nutricionista. Uses n8n-nodes-evolution-api, lmChatOpenAi, openAi, googleSheets. Webhook trigger; 22 nodes.
Source: https://github.com/josefarias3108/agente_nutricionista/blob/fb1b92ef9ff545170a69dc41ec7ecd238a4af326/N8N/AiAgentedeIA-Nutricionista.json — 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.
agente wpp audio msg separada. Uses agent, lmChatOpenAi, n8n-nodes-evolution-api, toolThink. Webhook trigger; 39 nodes.
Enhance your support, onboarding, and internal knowledge workflows with an intelligent RAG-powered chatbot that responds using live data stored in Google Sheets. 🤖📚 Built for teams that rely on struct
leads. Uses supabase, gmail, formTrigger, httpRequest. Webhook trigger; 62 nodes.
This automation is designed to help you generate AI-powered music tracks, cover art, and fully rendered music videos — all triggered from a simple Telegram chat and managed via Google Sheets.
🧠 Gwen – The AI Voice Marketing Agent Gwen is your intelligent voice-powered marketing assistant built in n8n. She combines the power of OpenAI, ElevenLabs, and automation workflows to handle content