Hi everyone
We’re running into an unusual (and potentially serious) behavior with our n8n setup, and would love your insights.
Context:
We manage outbound automation workflows for multiple clients from a single self-hosted n8n instance.
Each client has:
- Their own Lemlist account
- Their own n8n credential with a dedicated API Key
- Their own outbound logic and separate API URL
The Problem(s):
Triggers (e.g. Webhooks) firing across clients
Some workflows are built with HTTP Request triggers, and we’ve noticed this:
When Client A replies, a workflow designed for Client B sometimes triggers — even though the credentials and API endpoint are totally different.
- Each client uses their own Lemlist API key
- Their webhooks are distinct
- But when one client replies, the wrong automation occasionally activates
This suggests n8n is somehow confusing webhook origins, or there’s shared logic being re-used underneath that shouldn’t be.
2.
API Keys replaced with __n8n_BLANK_VALUE_...
When we save a credential with a valid API key, it initially works (test connection ), but after reopening the credential, the key is replaced with:
__n8n_BLANK_VALUE_e5362baf-c777-4d57-a609-6eaf1f9e87f6
This makes it:
- Impossible to confirm what’s saved
- Easy to accidentally overwrite or save it blank again
- Impossible to debug if it’s connected to the trigger issue above
Our Questions:
- Is the trigger firing across clients a known issue?
- Could this be caused by reused credentials internally or duplicate webhook URLs?
- Any tips on isolating workflows reliably per-client?
- Is the
__n8n_BLANK_VALUE_...
behavior expected for credentials?- Are API keys stored safely?
- What happens if we re-save the credential without modifying that field?
Why we care:
We manage automations for many clients from a central instance.
Accidental webhook overlaps or misfired automations can cause client cross-contamination, which is a serious issue.
We’d appreciate any insights, or whether this warrants a GitHub issue/report.
Thanks so much
Here the first part of our automation with the error on the trigger:
{
“nodes”: [
{
“parameters”: {
“event”: “linkedinReplied”,
“options”: {}
},
“type”: “n8n-nodes-base.lemlistTrigger”,
“typeVersion”: 1,
“position”: [
0,
0
],
“id”: “51421098-478c-48a3-ba89-36882c0c8bfe”,
“name”: “Linkedin1”,
“webhookId”: “558b2d13-88d6-4b4f-bb37-e441809e0c38”,
“credentials”: {
“lemlistApi”: {
“id”: “3qmpR7XPHgu1NTJt”,
“name”: “ISI-IT”
}
}
},
{
“parameters”: {
“modelId”: {
“__rl”: true,
“value”: “gpt-4o”,
“mode”: “list”,
“cachedResultName”: “GPT-4O”
},
“messages”: {
“values”: [
{
“content”: “=Sei un assistente AI per analisi di sequenze LinkedIn.\n\n⚙️ OBIETTIVO \nIdentificare l’ULTIMO messaggio del sender prima della risposta del prospect.\n\n────────────────────────────────────────\nIDENTIFICAZIONE ATTORI\n────────────────────────────────────────\n\nSENDER = {{ $(‘Linkedin1’).first().json.sendUserName }}\n- Solo i messaggi del SENDER vengono classificati come RC/M1/M2/M3\n- Ignora tutti i messaggi di altri mittenti\n\nPROSPECT = Chiunque NON sia il sender\n- Le risposte del prospect determinano l’output\n\n────────────────────────────────────────\nTIPI DI MESSAGGI\n────────────────────────────────────────\n\nRC (Richiesta Connessione)\n✓ "Piacere entrare in contatto"\n✓ "Sarebbe bello collegarci"\n✓ Massimo 30 parole\n✗ NO servizi, prodotti, link, numeri\n\nCOMMERCIALI (M1, M2, M3)\n✓ Presenta servizio/prodotto\n✓ Menziona problemi/soluzioni\n✓ Contiene numeri/risultati/casi\n✓ Propone call/demo/meeting\n✓ Include link articoli/report\n✓ Parla di clienti/testimonianze\n\nNON COMMERCIALI (ignora)\n✗ "Come stai?"\n✗ "Buona giornata"\n✗ Solo emoji\n✗ Ringraziamenti semplici\n\n────────────────────────────────────────\nALGORITMO\n────────────────────────────────────────\n\n1. Identifica chi è {{ $(‘Linkedin1’).first().json.sendUserName }} nella conversazione\n2. Trova dove il prospect risponde per la PRIMA volta\n3. Guarda l’ULTIMO messaggio di {{ $(‘Linkedin1’).first().json.sendUserName }} prima di quella risposta\n4. Classifica quel messaggio:\n - È una RC? → Output: RC\n - È il 1° commerciale? → Output: M1\n - È il 2° commerciale? → Output: M2\n - È il 3°+ commerciale? → Output: M3\n\n⚠️ CONTA SOLO i messaggi commerciali di {{ $(‘Linkedin1’).first().json.sendUserName }} per M1/M2/M3\n\n────────────────────────────────────────\nESEMPI CON TRAPPOLE\n────────────────────────────────────────\n\nCaso 1 - Non farti ingannare dai non-commerciali:\nSender: Piacere! [RC]\nSender: Come stai? [NON COMMERCIALE - ignora]\nSender: Ti aiuto con LinkedIn… [M1 - primo commerciale]\nProspect: Interessante\n→ M1\n\nCaso 2 - I numeri non cambiano l’ordine:\nSender: Piacere! [RC]\nSender: Ho aiutato 50 aziende a crescere del 300%… [M1 - primo commerciale]\nProspect: Wow!\n→ M1 (NON M2 anche se ha numeri)\n\nCaso 3 - Follow-up sono commerciali:\nSender: Piacere! [RC]\nSender: Servizio X… [M1]\nSender: Volevo assicurarmi avessi letto… [M2 - è un follow-up]\nProspect: Sì, dimmi\n→ M2\n\nCaso 4 - Chiusura con proposta:\nSender: Piacere! [RC]\nSender: Servizio… [M1]\nSender: Caso studio… [M2]\nSender: Capisco tu sia busy, ti mando info? [M3 - propone azione]\nProspect: Ok\n→ M3\n\n────────────────────────────────────────\nCONTROLLO FINALE\n────────────────────────────────────────\n\nPrima di rispondere, chiediti:\n□ Ho trovato la PRIMA risposta del prospect?\n□ Qual è l’ULTIMO messaggio del sender prima?\n□ Ho contato SOLO i commerciali per M1/M2/M3?\n□ Ho ignorato i non-commerciali?\n\n────────────────────────────────────────\nOUTPUT\n────────────────────────────────────────\nispondi esattamente con una di queste 4 opzioni, e solo la parola singola:\n\nRC M1 M2 M3\n\nNon aggiungere altro testo o spiegazioni.\n\nUNA sola parola:\nRC\nM1\nM2\nM3\n\nreturn risposta; // e NON **${risposta}**
\n\n────────────────────────────────────────\n\nInput:\n{{ $json.conversationHistory }}”
}
]
},
“options”: {}
},
“type”: “@n8n/n8n-nodes-langchain.openAi”,
“typeVersion”: 1.8,
“position”: [
800,
0
],
“id”: “50286ec2-e3d4-4b66-a155-e81f06b161d9”,
“name”: “Tipo di Messaggio (M1-M2-M3)1”,
“credentials”: {
“openAiApi”: {
“id”: “rQxLwaGgjopI0fZA”,
“name”: “OpenAi account”
}
}
},
{
“parameters”: {
“url”: “=https://api.lemlist.com/api/inbox/{{ $(‘Linkedin1’).item.json.contactId }}?userId={{ $(‘Linkedin1’).item.json.createdBy }}&limit=100&markAsRead=false\n”,
“authentication”: “predefinedCredentialType”,
“nodeCredentialType”: “lemlistApi”,
“sendHeaders”: true,
“headerParameters”: {
“parameters”: [
{
“name”: “Authorization”,
“value”: “Bearer sk-proj-Pcw9cxkakSd01FFdOfQ0IEtSaEYAoEw-mmAQVd9uiHBpvM5i_TGcZ3rE3RhMlSzA9NGxMn8uv1T3BlbkFJS1hWA21lRRfmRZfbGWNP3AqXtFW-Mc4kmjMgfxVpsi6qtb7-YO6-7I76bO2tp0zPDgZEUtAA”
}
]
},
“options”: {
“pagination”: {
“pagination”: {
“parameters”: {
“parameters”: [
{
“name”: “page”,
“value”: “={{ $pageCount + 1 }}”
}
]
},
“limitPagesFetched”: true,
“maxRequests”: 5
}
}
}
},
“type”: “n8n-nodes-base.httpRequest”,
“typeVersion”: 4.2,
“position”: [
400,
0
],
“id”: “f1ac52f3-dfa7-46e9-baea-11597cb54a6c”,
“name”: “Estrai Conversazione1”,
“retryOnFail”: true,
“maxTries”: 5,
“credentials”: {
“lemlistApi”: {
“id”: “3qmpR7XPHgu1NTJt”,
“name”: “ISI-IT”
}
},
“onError”: “continueRegularOutput”
},
{
“parameters”: {
“jsCode”: “const allItems = $input.all();\nconst messages = allItems.flatMap(item => item.json.data || );\nmessages.sort((a, b) => new Date(a.createdAt) - new Date(b.createdAt));\n\nconst commercialId = $json.createdBy;\n\nconst conversation = messages\n .filter(m => (m.text || m.message)?.trim().length > 1)\n .map(m => {\n const msg = (m.text || m.message || ‘’).trim();\n\n // Strategia Fallback: usa m.createdBy se esiste, altrimenti m.type\n let isLead;\n\n if (typeof m.createdBy !== ‘undefined’) {\n isLead = m.createdBy !== commercialId;\n } else if (m.type && m.type.toLowerCase().includes(‘replied’)) {\n isLead = true;\n } else {\n isLead = false;\n }\n\n const sender = isLead\n ? ${m.leadFirstName || m.firstName || 'Lead'} ${m.leadLastName || ''}
.trim()\n : m.sendUserName || ‘User’;\n\n return ${sender}: ${msg}
;\n })\n .join(‘\n\n’);\n\nreturn [{ json: { conversationHistory: conversation } }];\n\n”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
580,
0
],
“id”: “5ed4ecbe-822a-4a5c-bc51-55e3d1650446”,
“name”: “Riordina conversazione1”
},
{
“parameters”: {
“assignments”: {
“assignments”: [
{
“id”: “cc1f6c4f-69c4-4092-b1d2-13c234b927c9”,
“name”: “lead.Data Ultima Risposta”,
“value”: “={{ new Date($today).toLocaleDateString(‘en-GB’) }}”,
“type”: “string”
},
{
“id”: “456db652-d064-4c10-86a4-8334adaacffb”,
“name”: “lead.Nome e Cognome”,
“value”: “={{ $(‘Linkedin1’).item.json.leadFirstName }} {{ $(‘Linkedin1’).item.json.leadLastName }}”,
“type”: “string”
},
{
“id”: “13b491d7-8e61-4abb-9b60-1bf0e50c699f”,
“name”: “lead.firstname”,
“value”: “={{ $json.leadFirstName }}”,
“type”: “string”
},
{
“id”: “3374478a-34b0-4b14-9bef-e1eca13d62dc”,
“name”: “lead.lastname”,
“value”: “={{ $json.leadLastName }}”,
“type”: “string”
},
{
“id”: “2ebcd220-40aa-4ed4-a571-83364a93d649”,
“name”: “=azienda.Nome Azienda”,
“value”: “={{ $(‘Linkedin1’).item.json.leadCompanyName }}”,
“type”: “string”
},
{
“id”: “bd0f8a15-57ae-49f0-81e1-2d0df1bcef9b”,
“name”: “lead.ruolo”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.occupation }}”,
“type”: “string”
},
{
“id”: “3599b27a-cdfe-4311-ad60-6f7e22868b36”,
“name”: “lead.linkedinUrl”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.linkedinUrl }}”,
“type”: “string”
},
{
“id”: “39bce1ed-c591-4793-8960-e4b1de45ab5c”,
“name”: “lead.location”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.location }}”,
“type”: “string”
},
{
“id”: “5115345b-e827-4383-ae22-1474bb3ccd01”,
“name”: “lead.Lead ID (Lemlist)”,
“value”: “={{ $(‘Linkedin1’).item.json.lead._id }}”,
“type”: “string”
},
{
“id”: “d2d852f8-862a-47d0-9f2c-7552baea90e5”,
“name”: "lead.Email ",
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.email }}”,
“type”: “string”
},
{
“id”: “95421108-66bc-4e0a-9b5f-37dc52a8e6bf”,
“name”: “lead.Personalizzazione”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.Personalizzazione }}”,
“type”: “string”
},
{
“id”: “e49ffa9d-8b54-4247-893f-e3a6558777b3”,
“name”: “lead.Step Campagna”,
“value”: “={{ $(‘Linkedin1’).item.json.sequenceStep }}”,
“type”: “string”
},
{
“id”: “ca34f176-da62-49f6-9e45-3fce98bd608e”,
“name”: “azienda.Company Url”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.companyLinkedinUrl }}”,
“type”: “string”
},
{
“id”: “1e44449e-c6d8-4a36-aa4c-40d19adf36cb”,
“name”: “lemlist.Azione”,
“value”: “={{ $(‘Linkedin1’).item.json.metaData.type }}”,
“type”: “string”
},
{
“id”: “4e478072-45bd-40ab-bdb1-783314b73eb5”,
“name”: “azienda.Settore”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.industry }}”,
“type”: “string”
},
{
“id”: “fcc9bfc6-af24-4095-8f64-c9ce4465a878”,
“name”: “azienda.Country”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.locationName }}”,
“type”: “string”
},
{
“id”: “f925c47f-eb15-4061-a507-c759c0c8c2c8”,
“name”: “relatedSentAt”,
“value”: “={{ new Date($(‘Linkedin1’).item.json.relatedSentAt).toLocaleDateString(‘en-GB’) }}”,
“type”: “string”
},
{
“id”: “1b979aa5-23d1-4330-b615-5232f03c9301”,
“name”: “azienda.Company Description”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.companyDescription }}”,
“type”: “string”
},
{
“id”: “959bdeaa-150e-4423-90c7-d74231f7faf9”,
“name”: “lead.Phone”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.phone }}”,
“type”: “string”
},
{
“id”: “4849bf74-fdd3-4abb-b31d-2aa5893cdc4e”,
“name”: “Lemlist.Nome Campagna”,
“value”: “={{ $(‘Linkedin1’).item.json.name }}”,
“type”: “string”
},
{
“id”: “6ae98d2c-a155-4082-a3fc-088c1c0d6dc6”,
“name”: “Account Name (Salesflare Crm)”,
“value”: “={{(() => {\n const c = $json.leadCompanyName;\n if (c && c.trim() !== ‘’) return c;\n return Lead - ${$json.leadFirstName} ${$json.leadLastName} - ${$json.leadEmail}
;\n})()}}\n”,
“type”: “string”
},
{
“id”: “22306b94-182b-4bf8-8b99-be45b9159424”,
“name”: “azienda.companySize”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.companySize }}”,
“type”: “string”
},
{
“id”: “b6691a98-260f-4a98-8d65-ae0a6a160cf0”,
“name”: “lead.headline”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.tagline }}”,
“type”: “string”
},
{
“id”: “c8cb2ab8-2dc6-4c79-a768-d0e943a6ed77”,
“name”: “lead.summary”,
“value”: “={{ $(‘Linkedin1’).item.json.lead.variables.summary }}”,
“type”: “string”
},
{
“id”: “9bd51684-73fa-47bf-a4c8-47db65d1f667”,
“name”: “lead.Personalizzazione”,
“value”: “={{ $json.lead.variables.Personalizzazione }}”,
“type”: “string”
},
{
“id”: “51cd3b74-b3d1-4671-b2bc-2550ced0364a”,
“name”: "Lemlist.Azione ",
“value”: “={{ $json.emailTemplateName }}”,
“type”: “string”
},
{
“id”: “85401538-6c2e-423e-a422-a14cffece2b9”,
“name”: “Lemlist.sequenceTested”,
“value”: “={{ $json.sequenceTested }}”,
“type”: “string”
}
]
},
“options”: {}
},
“type”: “n8n-nodes-base.set”,
“typeVersion”: 3.4,
“position”: [
200,
0
],
“id”: “b1dd1191-330b-4949-9126-f701b09bb39f”,
“name”: “Riorganizza dati4”
}
],
“connections”: {
“Linkedin1”: {
“main”: [
[
{
“node”: “Riorganizza dati4”,
“type”: “main”,
“index”: 0
}
]
]
},
“Tipo di Messaggio (M1-M2-M3)1”: {
“main”: [
]
},
“Estrai Conversazione1”: {
“main”: [
[
{
“node”: “Riordina conversazione1”,
“type”: “main”,
“index”: 0
}
]
]
},
“Riordina conversazione1”: {
“main”: [
[
{
“node”: “Tipo di Messaggio (M1-M2-M3)1”,
“type”: “main”,
“index”: 0
}
]
]
},
“Riorganizza dati4”: {
“main”: [
[
{
“node”: “Estrai Conversazione1”,
“type”: “main”,
“index”: 0
}
]
]
}
},
“pinData”: {},
“meta”: {
“instanceId”: “dae913555bc5d1c10a43edaf3e1adf588f181b200fd973cde4788659a756d05d”
}
}