This workflow corresponds to n8n.io template #14537 — we link there as the canonical source.
This workflow follows the Form → Form Trigger 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": "GG15oLz99f573nvG",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Get Brand Identity from Web Page",
"tags": [],
"nodes": [
{
"id": "5ebe586e-34e7-43f6-a59f-15841ca0cfae",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
192,
-112
],
"parameters": {
"url": "={{ $json.URL }}",
"options": {
"allowUnauthorizedCerts": true
}
},
"typeVersion": 4.4
},
{
"id": "e7869d3a-8b6c-42be-a82d-3fd43348dd30",
"name": "Extract Vault A",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
496,
-112
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "models/gemini-3-flash-preview",
"cachedResultName": "models/gemini-3-flash-preview"
},
"options": {},
"messages": {
"values": [
{
"role": "model",
"content": "**System Instruction:** You are the Litopy Extraction Engine. Your goal is to analyze the provided raw text from a brand's website and extract a rigid \"Identity Definition\" into JSON format. Do not describe the tone; quantify it.\n\n**Task:**\n1. **Lexicon Mining:** Identify words used frequently that are *not* standard English stop-words. Identify \"Corporate Speak\" that is notably absent (these become Forbidden Words).\n2. **Syntax Calculus:** Calculate the average words per sentence. Does the text use fragments? (e.g., \"Fast. Secure. Done.\") If yes, mark `complexity_score` low.\n3. **Stance Detection:** Determine if the brand speaks *at* the user (Mentor) or *with* the user (Peer). Look for \"We believe\" statements vs. \"You should\" statements.\n \n \n **Output:** strictly valid JSON matching the `vault_a_style_matrix` schema.\n\"vault_a_style_matrix\": {\n \"lexicon_constraints\": {\n \"power_words\": [\n \"List of 5-10 high-frequency words unique to the brand (e.g., 'Bespoke', 'Ecosystem')\"\n ],\n \"forbidden_words\": [\n \"List of banned generic terms (e.g., 'Synergy', 'Delve', 'Game-changer')\"\n ],\n \"preferred_synonyms\": {\n \"client\": \"partner\",\n \"cost\": \"investment\",\n \"buy\": \"acquire\"\n }\n },\n \"syntax_signature\": {\n \"average_sentence_length\": \"Integer (e.g., 12)\",\n \"complexity_score\": \"Float 0.0-1.0 (0=Hemingway, 1=Academic)\",\n \"active_voice_ratio\": \"Float 0.0-1.0 (Target >0.8)\",\n \"paragraph_structure\": \"String (e.g., 'One-sentence hooks only', '3-line blocks')\"\n },\n \"stance_parameters\": {\n \"relationship_model\": \"String (Options: 'Peer', 'Mentor', 'Challenger', 'Servant')\",\n \"risk_appetite\": \"String (Options: 'Conservative', 'Aggressive', 'Contrarian')\",\n \"emotional_temperature\": \"Float 0.0-1.0 (0=Clinical, 1=Hyper-Emotive)\"\n },\n \"formatting_rules\": {\n \"emoji_usage\": \"String (e.g., 'None', 'Bullets only', 'Gen-Z style')\",\n \"header_style\": \"String (e.g., 'Title Case', 'All Caps', 'Lowercase')\",\n \"cta_structure\": \"String (e.g., 'Soft ask', 'Hard URL', 'Question')\"\n }\n }\n\n**Output Validation:** Check the output that it is valid JSON with a single object (no array on top level). Only return valid JSON using the data structure provided (no array on top level - just a single object). Ensure the JSON output is valid using the data structure provided!\n"
},
{
"content": "=**Input Text:**\n\n {{ $json.data }}"
}
]
},
"simplify": false,
"jsonOutput": true,
"builtInTools": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "53c0287a-7a4c-47b7-ab61-fc1bd730e63e",
"name": "HTML",
"type": "n8n-nodes-base.html",
"position": [
1344,
-112
],
"parameters": {
"html": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <style>\n :root {\n --primary: #4A90E2;\n --success: #27ae60;\n --danger: #e74c3c;\n --bg: #f8f9fc;\n --text: #2d3436;\n --card-bg: #ffffff;\n }\n body { \n font-family: 'Inter', -apple-system, sans-serif; \n background-color: var(--bg); \n color: var(--text);\n line-height: 1.6;\n padding: 40px 20px;\n margin: 0;\n }\n .container { max-width: 900px; margin: 0 auto; }\n .header { margin-bottom: 30px; text-align: center; }\n .header h1 { margin: 0; color: #1a1f36; font-size: 28px; }\n .header p { color: #697386; margin-top: 5px; }\n\n .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }\n .card { \n background: var(--card-bg); \n border-radius: 12px; \n padding: 24px; \n box-shadow: 0 4px 6px rgba(0,0,0,0.05);\n border: 1px solid #eef2f7;\n }\n .full-width { grid-column: span 2; }\n \n h2 { font-size: 14px; text-transform: uppercase; letter-spacing: 1px; color: #8898aa; margin-bottom: 20px; border-bottom: 1px solid #eee; padding-bottom: 10px; }\n\n /* Tags for Words */\n .tag-container { display: flex; flex-wrap: wrap; gap: 8px; }\n .tag { padding: 4px 12px; border-radius: 6px; font-size: 13px; font-weight: 600; }\n .tag-power { background: #e3f9eb; color: var(--success); }\n .tag-forbidden { background: #fee2e2; color: var(--danger); }\n\n /* Tables */\n table { width: 100%; border-collapse: collapse; margin-top: 10px; }\n th { text-align: left; font-size: 12px; color: #8898aa; padding: 8px; }\n td { padding: 8px; border-bottom: 1px solid #f1f1f1; font-size: 14px; }\n\n /* Metrics */\n .metric-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; }\n .metric-label { font-weight: 500; }\n .metric-value { font-family: monospace; background: #f1f3f5; padding: 2px 8px; border-radius: 4px; }\n \n .progress-bar { background: #eef2f7; height: 8px; border-radius: 4px; overflow: hidden; margin-top: 5px; }\n .progress-fill { background: var(--primary); height: 100%; }\n\n @media (max-width: 600px) { .grid { grid-template-columns: 1fr; } .full-width { grid-column: span 1; } }\n </style>\n</head>\n<body>\n\n<div class=\"container\">\n <div class=\"header\">\n <h1>Brand Identity Style Matrix</h1>\n <p>Content Governance & Style Parameters</p>\n <p>{{ $('Add Missing Protocol').item.json.URL }}</p>\n </div>\n\n <div class=\"grid\">\n \n <div class=\"card full-width\">\n <h2>Lexicon Constraints</h2>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <div>\n <p style=\"font-size: 13px; font-weight: bold; margin-bottom: 10px;\">Power Words</p>\n <div class=\"tag-container\">\n {{ $json.parsed.vault_a_style_matrix.lexicon_constraints.power_words.map(w => `<span class=\"tag tag-power\">${w}</span>`).join('') }}\n </div>\n </div>\n <div>\n <p style=\"font-size: 13px; font-weight: bold; margin-bottom: 10px;\">Forbidden Words</p>\n <div class=\"tag-container\">\n {{ $json.parsed.vault_a_style_matrix.lexicon_constraints.forbidden_words.map(w => `<span class=\"tag tag-forbidden\">${w}</span>`).join('') }}\n </div>\n </div>\n </div>\n\n <div style=\"margin-top: 25px;\">\n <p style=\"font-size: 13px; font-weight: bold;\">Preferred Synonyms</p>\n <table>\n <thead><tr><th>Replace</th><th>Use Instead</th></tr></thead>\n <tbody>\n {{ Object.entries($json.parsed.vault_a_style_matrix.lexicon_constraints.preferred_synonyms).map(([key, val]) => `<tr><td>${key}</td><td><strong>${val}</strong></td></tr>`).join('') }}\n </tbody>\n </table>\n </div>\n </div>\n\n <div class=\"card\">\n <h2>Syntax Signature</h2>\n <div class=\"metric-row\">\n <span class=\"metric-label\">Avg Sentence Length</span>\n <span class=\"metric-value\">{{ $json.parsed.vault_a_style_matrix.syntax_signature.average_sentence_length }} words</span>\n </div>\n \n <div class=\"metric-label\" style=\"font-size: 14px;\">Active Voice Ratio ({{ $json.parsed.vault_a_style_matrix.syntax_signature.active_voice_ratio * 100 }}%)</div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" style=\"width: {{ $json.parsed.vault_a_style_matrix.syntax_signature.active_voice_ratio * 100 }}%\"></div>\n </div>\n\n <p style=\"font-size: 13px; margin-top: 20px; color: #666;\">\n <strong>Structure:</strong><br>\n {{ $json.parsed.vault_a_style_matrix.syntax_signature.paragraph_structure }}\n </p>\n </div>\n\n <div class=\"card\">\n <h2>Stance & Tone</h2>\n <div class=\"metric-row\">\n <span class=\"metric-label\">Relationship Model</span>\n <span class=\"tag\" style=\"background: #edf2ff; color: #3b5bdb;\">{{ $json.parsed.vault_a_style_matrix.stance_parameters.relationship_model }}</span>\n </div>\n <div class=\"metric-row\">\n <span class=\"metric-label\">Risk Appetite</span>\n <span>{{ $json.parsed.vault_a_style_matrix.stance_parameters.risk_appetite }}</span>\n </div>\n <div class=\"metric-label\" style=\"font-size: 14px;\">Emotional Temp ({{ $json.parsed.vault_a_style_matrix.stance_parameters.emotional_temperature }})</div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" style=\"width: {{ $json.parsed.vault_a_style_matrix.stance_parameters.emotional_temperature * 100 }}%; background: #fab005;\"></div>\n </div>\n </div>\n\n <div class=\"card full-width\">\n <h2>Formatting Rules</h2>\n <div style=\"display: flex; justify-content: space-around; text-align: center;\">\n <div>\n <small>Emoji Usage</small>\n <div style=\"font-weight: 600;\">{{ $json.parsed.vault_a_style_matrix.formatting_rules.emoji_usage }}</div>\n </div>\n <div>\n <small>Header Style</small>\n <div style=\"font-weight: 600;\">{{ $json.parsed.vault_a_style_matrix.formatting_rules.header_style }}</div>\n </div>\n <div>\n <small>CTA Structure</small>\n <div style=\"font-weight: 600;\">{{ $json.parsed.vault_a_style_matrix.formatting_rules.cta_structure }}</div>\n </div>\n </div>\n </div>\n\n </div>\n</div>\n\n</body>\n</html>"
},
"typeVersion": 1.2
},
{
"id": "d2c64bad-5189-4736-99f8-eb29a13e8ff4",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1152,
-448
],
"parameters": {
"width": 576,
"height": 864,
"content": "## Extract Brand Identity Markers from Web Page\n**This n8n template retrieves verbal brand identity markers from any web site using Google Gemini AI.**\n\n#### Customer Perception Review\nHow does a customer coming to your web site perceive your content? Use this to check against the key messages you want the customer to understand after visiting your web site.\n\n#### Brand Identity Extraction\nMarketing Agencies need to understand for each customers their specific tone and communication style to replicate it for updates and new content.\n\n### How it works\n- Execute the workflow and enter any web site address\n- The HTTP node retrieves the web page\n- The core logic is the Gemini AI prompt to review the web page content and respond with a pre-defined JSON data structure containing the verbal brand identity markers\n- The JSON structure returned from the AI node is parsed and displayed on a web page. \n\n### How to customize\n- Inject your own processing logic after the \"Extract AI Response\" node\n- You can directly access the JSON fields returned. For an example see how the HTML node creates the web page with the JSON data.\n\n### Requirements\n- Gemini account for LLM\n\n### Need Help?\nJoin the [Discord](https://discord.com/invite/XPKeKXeB7d) or ask in the [Forum](https://community.n8n.io/)!\n\nFor support reach out to the creator at blakewise.com\n\nHappy Hacking!\n\n"
},
"typeVersion": 1
},
{
"id": "595869a8-9b62-486b-9b73-81bc18c4284d",
"name": "Extract AI Response",
"type": "n8n-nodes-base.set",
"position": [
944,
-112
],
"parameters": {
"options": {
"dotNotation": false
},
"assignments": {
"assignments": [
{
"id": "815badc3-d2ba-438a-bfe8-666e290b177b",
"name": "raw",
"type": "string",
"value": "={{ $json.candidates[0].content.parts[0].text }}"
},
{
"id": "50561d91-dd5d-4b54-a019-22f261a7945d",
"name": "parsed",
"type": "object",
"value": "={{ $json.candidates[0].content.parts[0].text }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "41207e46-7e10-4279-8807-6b01247c95d9",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-336
],
"parameters": {
"color": 7,
"width": 448,
"height": 544,
"content": "## Brand Identity Marker Extraction\n\nGemini is doing the heavy lifting. The core logic of this workflow is in the Gemini prompt to extract the key identifiers of the brands voice and style and report it back in a structured (pre-defined JSON) format."
},
"typeVersion": 1
},
{
"id": "bc7c47d7-5a0f-43e8-818e-a286d7d00f27",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
-336
],
"parameters": {
"color": 7,
"width": 628,
"height": 544,
"content": "## Extract nested Data\n\nThe JSON returned by Gemini is parsed and injected into a web page template for easier reading. \n\nReplace the HTML node with your own processing if you want to extend this template."
},
"typeVersion": 1
},
{
"id": "14e9581a-b5c8-4363-8bef-0c091f24ade7",
"name": "Add Missing Protocol",
"type": "n8n-nodes-base.set",
"position": [
-64,
32
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "={\n \"URL\": \"https://{{ $json.URL }}\",\n \"submittedAt\": \"{{ $json.submittedAt }}\",\n \"formMode\": \"{{ $json.formMode }}\"\n}\n"
},
"typeVersion": 3.4
},
{
"id": "9db9ac45-c5c1-4df2-b41a-b2ac4f9fe6e0",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
-336
],
"parameters": {
"color": 7,
"width": 640,
"height": 544,
"content": "## Retrieve the Web Page Content\n\nCheck if the http or https protocol prefix was entered. If not, prefix with https:// and retrieve the web page."
},
"typeVersion": 1
},
{
"id": "db7e5b9a-b719-489a-9cfc-353ceaae0cc4",
"name": "Check URL",
"type": "n8n-nodes-base.switch",
"position": [
-272,
-128
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "http",
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "d25a45bb-8822-4815-a726-fb969e658a8c",
"operator": {
"type": "string",
"operation": "startsWith"
},
"leftValue": "={{ $json.URL }}",
"rightValue": "http://"
}
]
},
"renameOutput": true
},
{
"outputKey": "https",
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "ec311e16-a45c-49f8-92b9-5aa0cd68d411",
"operator": {
"type": "string",
"operation": "startsWith"
},
"leftValue": "={{ $json.URL }}",
"rightValue": "https://"
}
]
},
"renameOutput": true
},
{
"outputKey": "No protocol",
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "8952e304-dae5-4203-a8e9-4e1a5fd879f5",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "",
"rightValue": ""
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.4
},
{
"id": "4840d67f-103e-4201-bd6f-0fa2095231b2",
"name": "URL Form",
"type": "n8n-nodes-base.formTrigger",
"position": [
-496,
-112
],
"parameters": {
"options": {
"appendAttribution": false
},
"formTitle": "Get Brand Identity",
"formFields": {
"values": [
{
"fieldLabel": "URL"
}
]
},
"formDescription": "Enter the URL for the main web site to extract the Brand Identity."
},
"typeVersion": 2.5
},
{
"id": "9052bfa2-29f5-48df-8ac9-906f1c690a8f",
"name": "Form",
"type": "n8n-nodes-base.form",
"position": [
1552,
-112
],
"parameters": {
"operation": "completion",
"respondWith": "showText",
"responseText": "={{ $json.html }}"
},
"typeVersion": 2.5
},
{
"id": "b9821a94-d11f-4463-bd24-61a2216fb3d0",
"name": "Extract Nested Data",
"type": "n8n-nodes-base.set",
"position": [
1152,
-112
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "6ece9336-8816-468b-9a87-60a458d88ad5",
"name": "parsed.vault_a_style_matrix.lexicon_constraints.power_words",
"type": "array",
"value": "={{ $json.parsed.vault_a_style_matrix.lexicon_constraints.power_words }}"
},
{
"id": "4825c479-d411-4eef-886b-383519ab990e",
"name": "parsed.vault_a_style_matrix.lexicon_constraints.forbidden_words",
"type": "array",
"value": "={{ $json.parsed.vault_a_style_matrix.lexicon_constraints.forbidden_words }}"
},
{
"id": "3b48d4b4-6ef3-4ad3-8347-086f4209d139",
"name": "parsed.vault_a_style_matrix.lexicon_constraints.preferred_synonyms",
"type": "object",
"value": "={{ $json.parsed.vault_a_style_matrix.lexicon_constraints.preferred_synonyms }}"
},
{
"id": "4648a1cc-8bc2-4561-acb4-65df8ce84057",
"name": "parsed.vault_a_style_matrix.syntax_signature",
"type": "object",
"value": "={{ $json.parsed.vault_a_style_matrix.syntax_signature }}"
},
{
"id": "b5540b4e-ad8c-4848-8909-0b252594d0d7",
"name": "parsed.vault_a_style_matrix.stance_parameters",
"type": "object",
"value": "={{ $json.parsed.vault_a_style_matrix.stance_parameters }}"
},
{
"id": "19596518-d981-404f-8cc8-16dc15a51c21",
"name": "parsed.vault_a_style_matrix.formatting_rules",
"type": "object",
"value": "={{ $json.parsed.vault_a_style_matrix.formatting_rules }}"
}
]
}
},
"typeVersion": 3.4
}
],
"active": true,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "6c570c72-79ed-4322-8b22-77a26468acda",
"connections": {
"HTML": {
"main": [
[
{
"node": "Form",
"type": "main",
"index": 0
}
]
]
},
"URL Form": {
"main": [
[
{
"node": "Check URL",
"type": "main",
"index": 0
}
]
]
},
"Check URL": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
],
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
],
[
{
"node": "Add Missing Protocol",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "Extract Vault A",
"type": "main",
"index": 0
}
]
]
},
"Extract Vault A": {
"main": [
[
{
"node": "Extract AI Response",
"type": "main",
"index": 0
}
]
]
},
"Extract AI Response": {
"main": [
[
{
"node": "Extract Nested Data",
"type": "main",
"index": 0
}
]
]
},
"Extract Nested Data": {
"main": [
[
{
"node": "HTML",
"type": "main",
"index": 0
}
]
]
},
"Add Missing Protocol": {
"main": [
[
{
"node": "HTTP Request",
"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.
googlePalmApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This n8n template retrieves verbal brand identity markers from any web site.
Source: https://n8n.io/workflows/14537/ — 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 workflow processes passport images submitted through a form, extracts structured data using OpenAI OCR, and generates QR codes with the extracted information. Results are displayed on the form co
This n8n template automates scraping content from Skool communities using the Olostep API. It collects structured data from Skool pages and stores it in a clean format, making it easy to analyze commu
automation_financial_recording. Uses telegramTrigger, telegram, googleGemini, lmChatGoogleGemini. Event-driven trigger; 35 nodes.
automation_financial_recording. Uses telegramTrigger, telegram, googleGemini, lmChatGoogleGemini. Event-driven trigger; 35 nodes.
automation_financial_recording. Uses telegramTrigger, telegram, googleGemini, lmChatGoogleGemini. Event-driven trigger; 35 nodes.