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": "Metavoir Creative Intake To Review Brief",
"_comment": "Inactive documentation-only n8n proof template. Uses fictional demo data, Code nodes, and placeholders only. No HTTP Request nodes, no external API calls, no production route changes, no real credentials, no real IDs, no real customer data.",
"nodes": [
{
"parameters": {},
"id": "node-manual-trigger",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
200,
300
]
},
{
"parameters": {
"jsCode": "return [{ json: { schema_version: 'metavoir_creative_intake_proof_v1', proof_name: 'Metavoir Creative Intake To Review Brief', proof_only: true, raw_intake: 'CRM Vorschau: Neue Anfrage von Lea Beispiel von CayAni Demo. Es geht um Branding, Website Struktur und vielleicht Shopify Relaunch. Sie wirkt warm, Timing ist grob naechster Monat, Budget muss noch geklaert werden. Naechster Schritt: kurzer Call mit Antonia.', received_channel: 'telegram_style_note', received_by: 'Antonia', demo_case: 'complete_enough_intake', placeholders: { credentials: { monday: 'PLACEHOLDER_MONDAY_CREDENTIAL', google_drive: 'PLACEHOLDER_GOOGLE_DRIVE_CREDENTIAL', google_docs: 'PLACEHOLDER_GOOGLE_DOCS_CREDENTIAL', telegram: 'PLACEHOLDER_TELEGRAM_CREDENTIAL', ai: 'PLACEHOLDER_OPENAI_OR_AI_CREDENTIAL' }, ids: { monday_contacts_board_id: 'PLACEHOLDER_MONDAY_CONTACTS_BOARD_ID', monday_inquiries_board_id: 'PLACEHOLDER_MONDAY_INQUIRIES_BOARD_ID', google_drive_parent_folder_id: 'PLACEHOLDER_GOOGLE_DRIVE_PARENT_FOLDER_ID', google_docs_template_id: 'PLACEHOLDER_GOOGLE_DOCS_TEMPLATE_ID', telegram_chat_id: 'PLACEHOLDER_TELEGRAM_CHAT_ID' } }, boundary: { external_calls_allowed: false, writes_allowed: false, human_review_required: true } } }];"
},
"id": "node-set-demo-intake",
"name": "Set Demo Telegram Intake",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
420,
300
]
},
{
"parameters": {
"jsCode": "const data = $json;\nconst required = ['raw_intake', 'received_channel', 'received_by'];\nconst missing = required.filter((field) => !data[field]);\nreturn [{ json: { ...data, validation: { valid: missing.length === 0, required_fields_missing: missing, note: 'Validation only. No external calls.' } } }];"
},
"id": "node-validate-required-fields",
"name": "Validate Required Fields",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
640,
300
]
},
{
"parameters": {
"jsCode": "const raw = String($json.raw_intake || '').trim();\nconst text = raw.toLowerCase().replace(/\\s+/g, ' ');\nreturn [{ json: { ...$json, normalized_intake: { raw_note: raw, normalized_text: text, language: 'de', proposal_only: true, received_channel: $json.received_channel, received_by: $json.received_by } } }];"
},
"id": "node-normalize-intake",
"name": "Normalize Intake",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
860,
300
]
},
{
"parameters": {
"jsCode": "const text = $json.normalized_intake.normalized_text;\nlet intakeType = 'unclear_or_unsupported';\nif (text.includes('neue anfrage') || text.includes('branding') || text.includes('website') || text.includes('shopify')) intakeType = 'metavoir_relationship_intake';\nif (text.includes('follow-up') || text.includes('nachfassen') || text.includes('wartet')) intakeType = 'metavoir_follow_up_update';\nif (text.includes('referenz') || text.includes('proof') || text.includes('freigabe') || text.includes('joyce')) intakeType = 'metavoir_proof_or_project_review';\nreturn [{ json: { ...$json, classification: { intake_type: intakeType, confidence: intakeType === 'unclear_or_unsupported' ? 0.35 : 0.82, reason: 'Deterministic demo classification. No AI call.' } } }];"
},
"id": "node-classify-intake-type",
"name": "Classify Intake Type",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1080,
300
]
},
{
"parameters": {
"jsCode": "const raw = $json.normalized_intake.raw_note;\nconst match = raw.match(/von\\s+([A-Z\u00c4\u00d6\u00dc][A-Za-z\u00c4\u00d6\u00dc\u00e4\u00f6\u00fc\u00df' -]+?)\\s+von\\s+([^.,]+)[.,]/);\nconst contactName = match ? match[1].trim() : null;\nconst company = match ? match[2].trim() : null;\nreturn [{ json: { ...$json, contact: { full_name: contactName, company, role: raw.toLowerCase().includes('founder') ? 'Founder' : null, contact_source: 'telegram_style_note', lead_temperature: raw.toLowerCase().includes('warm') ? 'warm' : 'unknown', relationship_status: raw.toLowerCase().includes('warm') ? 'warm lead' : 'new relationship' } } }];"
},
"id": "node-extract-contact-fields",
"name": "Extract Contact Fields",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1300,
300
]
},
{
"parameters": {
"jsCode": "const text = $json.normalized_intake.normalized_text;\nconst services = [];\nif (text.includes('branding')) services.push('Branding');\nif (text.includes('website')) services.push('Website Struktur');\nif (text.includes('shopify')) services.push('Shopify Relaunch');\nif (text.includes('newsletter')) services.push('Newsletter / Retention');\nconst summary = services.length > 0 ? services.join(', ') : null;\nreturn [{ json: { ...$json, inquiry: { inquiry_name: summary ? `${$json.contact.company || 'Unbekanntes Unternehmen'} - ${summary}` : null, inquiry_type: summary ? 'project request' : 'unclear', status: 'new', priority: text.includes('warm') ? 'high' : 'medium', service_mix: services, budget_signal: text.includes('budget') ? 'needs clarification' : null, timing: text.includes('naechster monat') || text.includes('n\u00e4chster monat') ? 'grober Start naechster Monat' : null, next_action: 'Timing, Budget und Scope klaeren' } } }];"
},
"id": "node-extract-inquiry-fields",
"name": "Extract Inquiry Fields",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1520,
300
]
},
{
"parameters": {
"jsCode": "const missing = [];\nconst critical = [];\nif (!$json.contact.full_name) { missing.push('Kontaktperson'); critical.push('Kontaktperson'); }\nif (!$json.contact.company) { missing.push('Unternehmen'); critical.push('Unternehmen'); }\nif (!$json.inquiry.inquiry_name) { missing.push('konkreter Bedarf'); critical.push('konkreter Bedarf'); }\nif (!$json.inquiry.budget_signal) missing.push('Budget');\nif (!$json.inquiry.timing) missing.push('Projekt-Timeline');\nmissing.push('Entscheider:in');\nreturn [{ json: { ...$json, missing_fields: { all: Array.from(new Set(missing)), critical: Array.from(new Set(critical)), has_critical_missing_fields: critical.length > 0 } } }];"
},
"id": "node-detect-missing-fields",
"name": "Detect Missing Fields",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1740,
300
]
},
{
"parameters": {
"jsCode": "const text = $json.normalized_intake.normalized_text;\nconst needed = text.includes('joyce') || text.includes('referenz') || text.includes('proof') || text.includes('claim') || text.includes('freigabe') || text.includes('visuell');\nconst reasons = [];\nif (text.includes('referenz') || text.includes('proof')) reasons.push('Referenz oder Proof Nutzung erwaehnt');\nif (text.includes('claim')) reasons.push('Claim Safety pruefen');\nif (text.includes('joyce') || text.includes('freigabe')) reasons.push('Joyce Freigabe erwaehnt');\nreturn [{ json: { ...$json, joyce_review: { needed, reasons, owner: needed ? 'Joyce' : 'Antonia' } } }];"
},
"id": "node-detect-joyce-review-need",
"name": "Detect Joyce Review Need",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1960,
300
]
},
{
"parameters": {
"jsCode": "const ids = $json.placeholders.ids;\nreturn [{ json: { ...$json, monday_target: { contact_board: { name: 'Contacts', board_id: ids.monday_contacts_board_id }, inquiry_board: { name: 'Inquiries', board_id: ids.monday_inquiries_board_id }, preferred_board: $json.inquiry.inquiry_name ? 'Inquiries' : 'Contacts', draft_only: true, blocked_until_human_approval: true } } }];"
},
"id": "node-suggest-monday-target",
"name": "Suggest Monday Target",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2180,
300
]
},
{
"parameters": {
"jsCode": "const company = $json.contact.company || 'Ungeklaertes Unternehmen';\nreturn [{ json: { ...$json, google_drive_suggestion: { draft_only: true, parent_folder_id: $json.placeholders.ids.google_drive_parent_folder_id, suggested_path: `Metavoir/02_Client-Briefs/${company}/02_Review-Brief`, folder_name: `${company} - Creative Intake Review`, blocked_until_human_approval: true } } }];"
},
"id": "node-suggest-google-drive-folder-path",
"name": "Suggest Google Drive Folder Path",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2400,
300
]
},
{
"parameters": {
"jsCode": "const contact = $json.contact;\nconst inquiry = $json.inquiry;\nconst missing = $json.missing_fields.all;\nconst drive = $json.google_drive_suggestion;\nconst joyce = $json.joyce_review;\nconst markdown = [`# Metavoir Intake Review Brief`, ``, `## Eingang`, `- Quelle: ${$json.received_channel}`, `- Originalnotiz: ${$json.normalized_intake.raw_note}`, ``, `## Kontakt`, `- Name: ${contact.full_name || '(fehlt)'}`, `- Rolle: ${contact.role || '(unklar)'}`, ``, `## Unternehmen`, `- Name: ${contact.company || '(fehlt)'}`, ``, `## Anfrage`, `- Typ: ${inquiry.inquiry_type}`, `- Kurzbeschreibung: ${inquiry.inquiry_name || '(fehlt)'}`, ``, `## Vermuteter Bedarf`, `- ${inquiry.service_mix.length ? inquiry.service_mix.join(', ') : '(unklar)'}`, ``, `## Metavoir Kontext`, `- Lead Temperature: ${contact.lead_temperature}`, `- Priority: ${inquiry.priority}`, ``, `## Joyce Review`, `- Noetig: ${joyce.needed ? 'ja' : 'nein'}`, `- Gruende: ${joyce.reasons.length ? joyce.reasons.join('; ') : '(keine)'}`, ``, `## Offene Fragen`, ...missing.map((item) => `- ${item}`), ``, `## Monday Vorschlag`, `- Board: ${$json.monday_target.preferred_board}`, `- Next Action: ${inquiry.next_action}`, ``, `## Google Drive Vorschlag`, `- Pfad: ${drive.suggested_path}`, ``, `## Naechster menschlicher Schritt`, `- ${inquiry.next_action}`, ``, `## Notizen`, `- Proof only. Keine externen Systeme wurden beschrieben als geschrieben.`].join('\\n');\nreturn [{ json: { ...$json, google_docs_brief_markdown: markdown } }];"
},
"id": "node-render-google-docs-brief-markdown",
"name": "Render Google Docs Brief Markdown",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2620,
300
]
},
{
"parameters": {
"jsCode": "const hasCritical = $json.missing_fields.has_critical_missing_fields;\nreturn [{ json: { ...$json, branch_decision: { node_name: 'IF Missing Critical Fields', route: hasCritical ? 'clarification_required' : 'review_brief_ready', has_critical_missing_fields: hasCritical } } }];"
},
"id": "node-if-missing-critical-fields",
"name": "IF Missing Critical Fields",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2840,
300
]
},
{
"parameters": {
"jsCode": "const critical = $json.missing_fields.critical;\nconst reply = critical.length ? ['Review-Brief noch nicht vollstaendig. Es fehlen kritische Angaben.', '', 'Bitte klaeren:', ...critical.map((field) => `- ${field}`), '', 'Es wurde nichts gespeichert oder versendet.'].join('\\n') : null;\nreturn [{ json: { ...$json, clarification_reply: reply } }];"
},
"id": "node-build-clarification-reply",
"name": "Build Clarification Reply",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
3060,
300
]
},
{
"parameters": {
"jsCode": "const output = { title: 'Metavoir Creative Intake Review Brief', ready_for_human_review: !$json.missing_fields.has_critical_missing_fields, intake_type: $json.classification.intake_type, contact: $json.contact, inquiry: $json.inquiry, missing_fields: $json.missing_fields.all, joyce_review: $json.joyce_review, google_docs_markdown: $json.google_docs_brief_markdown };\nreturn [{ json: { ...$json, review_brief_output: output } }];"
},
"id": "node-build-review-brief-output",
"name": "Build Review Brief Output",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
3280,
300
]
},
{
"parameters": {
"jsCode": "return [{ json: { ...$json, human_review_gate: { required: true, approval_status: 'pending_review', reviewer_options: ['Antonia', 'Joyce', 'Karl'], blocked_actions: ['create Monday item', 'create Google Doc', 'create Drive folder', 'send Telegram message', 'write CRM state'], note: 'Human approval is mandatory before any live integration.' } } }];"
},
"id": "node-human-review-gate-placeholder",
"name": "Human Review Gate Placeholder",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
3500,
300
]
},
{
"parameters": {
"jsCode": "const contact = $json.contact;\nconst itemName = contact.full_name && contact.company ? `${contact.full_name} - ${contact.company}` : 'Ungeklaerter Kontakt';\nreturn [{ json: { ...$json, monday_contact_draft_payload: { draft_only: true, target_system: 'monday', credential_placeholder: $json.placeholders.credentials.monday, board: 'Contacts', board_id: $json.placeholders.ids.monday_contacts_board_id, item_name: itemName, fields: { 'Full name': contact.full_name, 'Company': contact.company, 'Contact source': contact.contact_source, 'Lead temperature': contact.lead_temperature, 'Relationship status': contact.relationship_status, 'Next action': $json.inquiry.next_action, 'Responsible person': 'Antonia', 'Notes': 'Review-Brief zuerst menschlich pruefen.' }, blocked_until_human_approval: true } } }];"
},
"id": "node-build-monday-contact-draft-payload",
"name": "Build Monday Contact Draft Payload",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
3720,
300
]
},
{
"parameters": {
"jsCode": "const company = $json.contact.company || 'Ungeklaertes Unternehmen';\nreturn [{ json: { ...$json, monday_inquiry_draft_payload: { draft_only: true, target_system: 'monday', credential_placeholder: $json.placeholders.credentials.monday, board: 'Inquiries', board_id: $json.placeholders.ids.monday_inquiries_board_id, item_name: $json.inquiry.inquiry_name || `${company} - Anfrage klaeren`, fields: { 'Inquiry type': $json.inquiry.inquiry_type, 'Status': $json.inquiry.status, 'Priority': $json.inquiry.priority, 'Joyce needed': $json.joyce_review.needed, 'Next action': $json.inquiry.next_action, 'Decision needed': $json.joyce_review.needed ? 'Joyce Review vor Referenznutzung' : 'Antonia Review vor CRM-Uebernahme', 'Notes': 'Draft Payload. Nicht an Monday gesendet.' }, blocked_until_human_approval: true } } }];"
},
"id": "node-build-monday-inquiry-draft-payload",
"name": "Build Monday Inquiry Draft Payload",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
3940,
300
]
},
{
"parameters": {
"jsCode": "return [{ json: { ...$json, google_docs_draft_payload: { draft_only: true, target_system: 'google_docs', credential_placeholder: $json.placeholders.credentials.google_docs, template_id: $json.placeholders.ids.google_docs_template_id, drive_parent_folder_id: $json.placeholders.ids.google_drive_parent_folder_id, suggested_title: `${$json.contact.company || 'Ungeklaertes Unternehmen'} - Metavoir Intake Review Brief`, body_markdown: $json.google_docs_brief_markdown, blocked_until_human_approval: true } } }];"
},
"id": "node-build-google-docs-draft-payload",
"name": "Build Google Docs Draft Payload",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4160,
300
]
},
{
"parameters": {
"jsCode": "const route = $json.branch_decision.route;\nlet text;\nif (route === 'clarification_required') {\n text = $json.clarification_reply;\n} else {\n text = ['Review-Brief erstellt. Es wurde nichts in CRM, Monday, Google oder Telegram geschrieben.', '', 'Vorschlag:', `- Board: ${$json.monday_target.preferred_board}`, `- Next Action: ${$json.inquiry.next_action}`, `- Joyce Review: ${$json.joyce_review.needed ? 'ja' : 'nein'}`, '- Human Review: erforderlich'].join('\\n');\n}\nreturn [{ json: { ...$json, telegram_confirmation_text: { draft_only: true, credential_placeholder: $json.placeholders.credentials.telegram, chat_id_placeholder: $json.placeholders.ids.telegram_chat_id, text, not_sent: true } } }];"
},
"id": "node-build-telegram-confirmation-text",
"name": "Build Telegram Confirmation Text",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4380,
300
]
},
{
"parameters": {
"jsCode": "return [{ json: { proof_name: $json.proof_name, active_runtime: false, proof_only: true, validation: $json.validation, branch_decision: $json.branch_decision, normalized_intake: $json.normalized_intake, classification: $json.classification, contact: $json.contact, inquiry: $json.inquiry, missing_fields: $json.missing_fields, joyce_review: $json.joyce_review, monday_target: $json.monday_target, google_drive_suggestion: $json.google_drive_suggestion, review_brief_output: $json.review_brief_output, human_review_gate: $json.human_review_gate, monday_contact_draft_payload: $json.monday_contact_draft_payload, monday_inquiry_draft_payload: $json.monday_inquiry_draft_payload, google_docs_draft_payload: $json.google_docs_draft_payload, telegram_confirmation_text: $json.telegram_confirmation_text, placeholder_credentials_used: $json.placeholders.credentials, placeholder_ids_used: $json.placeholders.ids, external_calls_made: false, writes_made: false } }];"
},
"id": "node-demo-output",
"name": "Demo Output",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4600,
300
]
}
],
"connections": {
"Manual Trigger": {
"main": [
[
{
"node": "Set Demo Telegram Intake",
"type": "main",
"index": 0
}
]
]
},
"Set Demo Telegram Intake": {
"main": [
[
{
"node": "Validate Required Fields",
"type": "main",
"index": 0
}
]
]
},
"Validate Required Fields": {
"main": [
[
{
"node": "Normalize Intake",
"type": "main",
"index": 0
}
]
]
},
"Normalize Intake": {
"main": [
[
{
"node": "Classify Intake Type",
"type": "main",
"index": 0
}
]
]
},
"Classify Intake Type": {
"main": [
[
{
"node": "Extract Contact Fields",
"type": "main",
"index": 0
}
]
]
},
"Extract Contact Fields": {
"main": [
[
{
"node": "Extract Inquiry Fields",
"type": "main",
"index": 0
}
]
]
},
"Extract Inquiry Fields": {
"main": [
[
{
"node": "Detect Missing Fields",
"type": "main",
"index": 0
}
]
]
},
"Detect Missing Fields": {
"main": [
[
{
"node": "Detect Joyce Review Need",
"type": "main",
"index": 0
}
]
]
},
"Detect Joyce Review Need": {
"main": [
[
{
"node": "Suggest Monday Target",
"type": "main",
"index": 0
}
]
]
},
"Suggest Monday Target": {
"main": [
[
{
"node": "Suggest Google Drive Folder Path",
"type": "main",
"index": 0
}
]
]
},
"Suggest Google Drive Folder Path": {
"main": [
[
{
"node": "Render Google Docs Brief Markdown",
"type": "main",
"index": 0
}
]
]
},
"Render Google Docs Brief Markdown": {
"main": [
[
{
"node": "IF Missing Critical Fields",
"type": "main",
"index": 0
}
]
]
},
"IF Missing Critical Fields": {
"main": [
[
{
"node": "Build Clarification Reply",
"type": "main",
"index": 0
}
]
]
},
"Build Clarification Reply": {
"main": [
[
{
"node": "Build Review Brief Output",
"type": "main",
"index": 0
}
]
]
},
"Build Review Brief Output": {
"main": [
[
{
"node": "Human Review Gate Placeholder",
"type": "main",
"index": 0
}
]
]
},
"Human Review Gate Placeholder": {
"main": [
[
{
"node": "Build Monday Contact Draft Payload",
"type": "main",
"index": 0
}
]
]
},
"Build Monday Contact Draft Payload": {
"main": [
[
{
"node": "Build Monday Inquiry Draft Payload",
"type": "main",
"index": 0
}
]
]
},
"Build Monday Inquiry Draft Payload": {
"main": [
[
{
"node": "Build Google Docs Draft Payload",
"type": "main",
"index": 0
}
]
]
},
"Build Google Docs Draft Payload": {
"main": [
[
{
"node": "Build Telegram Confirmation Text",
"type": "main",
"index": 0
}
]
]
},
"Build Telegram Confirmation Text": {
"main": [
[
{
"node": "Demo Output",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"tags": [
"metavoir",
"n8n-proof",
"creative-intake",
"review-brief",
"inactive-template"
]
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Metavoir Creative Intake To Review Brief. Event-driven trigger; 21 nodes.
Source: https://github.com/KalleNolte/REMEMBER-Water-Is-the-Holy-Grail/blob/235db8456f51d0b23889027ca6299e6dc233090b/AI-Content-Engine/scripts/n8n-metavoir-creative-intake-review-brief.template.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.
Product - Google Search Console API Examples. Uses httpRequest. Event-driven trigger; 36 nodes.
Retry on fail except for known error Template. Uses stopAndError, noOp, stickyNote, manualTrigger. Event-driven trigger; 19 nodes.
02 - Flow Control Demo (IF & Switch). Event-driven trigger; 16 nodes.
Multi-Service Screenshot Scraping: ScraperAPI, Scrapingdog, & ScreenshotOne. Uses manualTrigger, httpRequest, stickyNote, dateTime. Event-driven trigger; 13 nodes.