Thanks for this but now you have completely lost me, I’ve tried doing this about 3 times with importing cURL and notion APIs etc but it’s still not working{
"name": "Strategy Call",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "strategy",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
7872,
320
],
"id": "efd78539-00a6-4934-9b01-b92822a39737",
"name": "Webhook",
"webhookId": "b1b3ed71-757d-4ae5-a164-04e7495da15c"
},
{
"parameters": {
"resource": "databasePage",
"operation": "getAll",
"databaseId": {
"__rl": true,
"value": "2173b1c6-ed75-8040-9fcc-c712c2b631d3",
"mode": "list",
"cachedResultName": "CRM",
"cachedResultUrl": "https://www.notion.so/2173b1c6ed7580409fccc712c2b631d3"
},
"returnAll": true,
"filterType": "manual",
"filters": {
"conditions": [
{
"key": "Email|email",
"condition": "equals",
"emailValue": "={{ $json.body.email }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.notion",
"typeVersion": 2.2,
"position": [
8096,
320
],
"id": "fedcbd91-3a88-4a3f-b84e-af1a68fd8f69",
"name": "Get many database pages",
"retryOnFail": false,
"credentials": {
"notionApi": {
"id": "FK0SvXKRNwl0pAk9",
"name": "Notion account"
}
},
"onError": "continueErrorOutput"
},
{
"parameters": {
"resource": "databasePage",
"operation": "update",
"pageId": {
"__rl": true,
"value": "={{ $('Get many database pages').item.json.id }}",
"mode": "id"
},
"propertiesUi": {
"propertyValues": [
{
"key": "1st CV|files",
"fileUrls": {
"fileUrl": [
{
"name": "={{ $('Webhook').item.json.body.cv[0].filename }}",
"url": "={{ $('Webhook').item.json.body.cv[0].url }}"
}
]
}
},
{
"key": "Google Meet Link|rich_text",
"richText": true,
"text": {
"text": [
{
"text": "={{ $('Webhook').item.json.body['meet-url'] }}",
"isLink": true,
"textLink": "={{ $('Webhook').item.json.body['meet-url'] }}",
"annotationUi": {}
}
]
}
},
{
"key": "Event|date",
"includeTime": false,
"date": "={{ $('Webhook').item.json.body['meet-start'] }}"
},
{
"key": "Reschedule|rich_text",
"richText": true,
"text": {
"text": [
{
"text": "={{ $('Webhook').item.json.body.reschedule }}",
"isLink": true,
"textLink": "={{ $('Webhook').item.json.body.reschedule }}",
"annotationUi": {}
}
]
}
},
{
"key": "LinkedIn|url",
"ignoreIfEmpty": true,
"urlValue": "={{ $('Webhook').item.json.body.linkedin }}"
},
{
"key": "Email|email",
"emailValue": "={{ $('Webhook').item.json.body.email }}"
},
{
"key": "Name|title",
"title": "={{ $('Webhook').item.json.body[' name'] }}"
},
{
"key": "Current income|number",
"numberValue": "={{ $('Webhook').item.json.body.income }}"
},
{
"key": "Why now?|rich_text",
"textContent": "={{ $('Webhook').item.json.body['why-now'] }}"
},
{
"key": "How will this help?|rich_text",
"textContent": "={{ $('Webhook').item.json.body.future }}"
},
{
"key": "Problem|select",
"selectValue": "={{ $('Webhook').item.json.body.challenge }}"
},
{
"key": "Years of exp|number",
"numberValue": "={{ $('Webhook').item.json.body.exp }}"
},
{
"key": "Industry|rich_text",
"textContent": "={{ $('Webhook').item.json.body.industry }}"
},
{
"key": "Employment status|rich_text",
"textContent": "={{ $('Webhook').item.json.body.status }}"
},
{
"key": "Target title|rich_text",
"textContent": "={{ $('Webhook').item.json.body.title }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.notion",
"typeVersion": 2.2,
"position": [
8320,
224
],
"id": "5e2ced25-de1d-456d-bd33-9f3fd165a895",
"name": "Update a database page",
"credentials": {
"notionApi": {
"id": "FK0SvXKRNwl0pAk9",
"name": "Notion account"
}
}
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "gpt-5.1",
"mode": "list",
"cachedResultName": "GPT-5.1"
},
"responses": {
"values": [
{
"role": "system",
"content": "=You are generating a Career Diagnostic Report for a candidate. Forget all previous student information. Use only the data provided in:\n\nForm responses: {{ $('Webhook').item.json.body }}\nApplications made: {{ $('Webhook').item.json.body.apps }}\nInterviews: {{ $('Webhook').item.json.body.int }}\nOffers:{{ $('Webhook').item.json.body.offers }}\nIndustry:{{ $('Webhook').item.json.body.industry }}\ntarget title: {{ $('Webhook').item.json.body.title }}\nCurrent employment status: {{ $('Webhook').item.json.body.status }}\nyears of experience: {{ $('Webhook').item.json.body.exp }}\nChallenge:{{ $('Webhook').item.json.body.challenge }}\nCV: {{ $('Webhook').item.json.body.cv[0].url }}\n\n\nYour job is to produce an accurate, severe, role-specific diagnostic. No generic statements. No soft skills. No assumptions beyond what the data supports. All feedback must be tied directly to the candidate’s real answers, hard skills, experience, and application behaviour.\n\n===================================================\nSTRICT ROLE-ALIGNMENT & ELIGIBILITY RULES\n===================================================\n\nThe candidate’s **target job title** is the single anchor for all reasoning. \nYou must:\n\n1. Identify that job title from the form field.\n2. Compare the candidate’s **actual CV experience**, tools, coursework, and results against:\n • real hard-skill requirements for that job title \n • typical entry criteria for that job title \n3. If the candidate misses key requirements:\n • State this clearly \n • Explain exactly which requirements are missing \n • Advise whether they should reevaluate or commit to bridging the gaps \n4. Only reference the skills that appear on their CV OR are clearly missing and needed for the target role.\n\nHard skills example logic:\n- Finance/Analyst roles → financial modelling, SQL, Power BI, forecasting, financial statements, analytics tools.\n- If these skills do NOT appear on their CV, state the gap bluntly and tell them to add or learn them.\n\nNever mention soft skills such as:\nExcel, PowerPoint, teamwork, communication, data analysis, adaptability, organisation, reporting, stakeholder management, leadership, or any similar soft/generalist skill.\n\nOnly mention true hard skills such as:\nSQL, Power BI, Python, Tableau, financial modelling, DAX, accounting fundamentals, APIs, Bloomberg, etc.\n\n===================================================\nSCORING LOGIC — MUST BE HARSH & DATA-DRIVEN\n===================================================\n\nBase scoring ONLY on:\n- Evidence visible on the CV \n- Application count \n- Interview count \n- Experience level \n- Hard skills \n- Relevance to the target job title \n- Ability to hit typical requirements of the target role\n\nRules:\n- If applications < 20 → score “Professional network” ≤ 4/10 \n- If interviews = 0 → score “CV marketability” ≤ 5/10 and state that the candidate is **not communicating value on paper** \n- If interview rate = 0–20% → mention low conversion \n- A healthy application→interview rate is 40% → use this as the diagnostic benchmark \n- If experience is under 2 years, avoid any senior framing \n\n===================================================\nSTRICT CV FEEDBACK RULES\n===================================================\n\nAll CV advice MUST:\n- Give **specific rewritten example bullets** that match the target role \n- Be hard-skill + method + measurable output \n- Never reference soft skills \n- Never reference irrelevant skills not in job requirements \n- If hard skills are missing, recommend EXACT ones based on industry norms\n\nExample format (you must create role-specific ones):\n“Built a Power BI dashboard using DAX to automate weekly financial variance reporting which reduced manual processing time by 6 hours weekly.”\n\nIf candidate lacks tools:\n- Tell them exactly which ones to add (SQL, Power BI, financial modelling, Python, etc.)\n- Tell them to add a personal or coursework-based project if none exists\n\n===================================================\nSTRICT SKILLS FRAMING RULES\n===================================================\n\nThe Skills section:\n- Must contain ONLY hard technical skills relevant to the target industry\n- NO soft skills (Excel, PowerPoint, “data analysis”, “communication”, etc.)\n- Grouped into relevant categories (e.g. Modelling, Data Tools, BI Tools)\n\nIf candidate lacks hard technical skills for the target role:\n- State this clearly \n- Provide a short list of 3–5 must-have hard skills \n- Give instructions to add a small project to evidence each one\n\n===================================================\nSTRICT NETWORKING RULES\n===================================================\n\nNetworking guidance MUST:\n- NEVER recommend university events \n- NEVER recommend career fairs \n- NEVER recommend speaking to “university people” \n- MUST recommend a targeted alumni and professional outreach system\n\nRequired networking structure:\n1. Identify 20–40 people in target roles (alumni, people with similar background, mutual interests). \n2. Send 1–2 personalised messages per day. \n3. Messages must reference:\n • their role \n • why the candidate reached out \n • a micro-connection point \n4. Request a 10–15 minute chat. \n5. Track outreach in a spreadsheet. \n6. Build a consistent daily rhythm that compounds.\n\n===================================================\nVOICE AND STYLE\n===================================================\n\n- Calm, direct, note-like, supportive.\n- No hype, no clichés, no metaphors.\n- Use first person sparingly (“I’m seeing…”).\n- Address the candidate as “you”.\n- Small human imperfection allowed (0.1 percent).\n\n===================================================\nOUTPUT REQUIREMENTS\n===================================================\n\nReturn plain text.\nEven spacing between headings and paragraphs\nNo tables.\n\n===================================================\nSUMMARY FORMAT RULES\n===================================================\n\nThe Summary must include these in order:\n\nCareer direction (X/10) - one sentence \nCV marketability (X/10) - one sentence \nSkills framing (X/10) - one sentence \nProfessional network (X/10) - one sentence \nOverall Score (X/10)\n\nThen EXACTLY 3 <li> bullets describing:\n1. Main blockers specific to this candidate \n2. Four–six week path \n3. The fastest lever for improvement \n\n===================================================\nACTION PLAN RULES\n===================================================\n\nFive subsections in this order:\n\nCareer direction \nCV marketability \nSkills framing\nProfessional network\n\nEach subsection contains 3–6 <li> bullets that:\n- Directly reference the candidate’s actual data \n- Give concrete instructions \n- Incorporate missing hard skills \n- Reference whether they qualify for their target job title \n- Critically analyse their experience against real job requirements \n\n\nNever use phrases like \"this candidate\", always write \"your\" or \"you\".\n===================================================\nFINAL SANITISATION\n===================================================\n\nGenerate this report ready for using inside Notion."
},
{
"content": "The output will be used to create Notion page blocks using the notion Block API. Use all possible blocks that are available from the Notion Block API. If using a bullet list, remember that each item is a type=bulleted_list_item, it is not all bullets in one list\n\nExample output, an array of objects\n[\n{\"type\":\"heading_2\", \"content\":\"Overview\"},\n{\"type\":\"paragraph\", \"content\":\"This college....\"},\n...\n]"
}
]
},
"builtInTools": {},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 2,
"position": [
8544,
224
],
"id": "12965a89-9a34-40ce-acd6-a1d9c38e0c58",
"name": "Message a model",
"credentials": {
"openAiApi": {
"id": "hURCHiTVsQwMpLiB",
"name": "OpenAi account"
}
}
},
{
"parameters": {
"options": {}
},
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
9120,
224
],
"id": "258fc660-5da3-4937-bd5d-67f9bdd773ff",
"name": "Loop Over Items"
},
{
"parameters": {
"jsCode": "const inputText = $input.first().json.output?.[0]?.content?.[0]?.text || \"\";\n\nlet blocks;\ntry {\n blocks = JSON.parse(inputText);\n} catch (e) {\n throw new Error(\"Invalid JSON from ChatGPT\");\n}\n\n// Normalise to Notion-friendly type names\nfunction mapType(type) {\n if (type === \"heading2\") return \"heading_2\";\n if (type === \"heading3\") return \"heading_3\";\n if (type === \"paragraph\") return \"paragraph\";\n if (type === \"bullet\") return \"bulleted_list_item\";\n if (type === \"number\") return \"numbered_list_item\";\n return type;\n}\n\nblocks = blocks.map(b => ({\n ...b,\n type: mapType(b.type)\n}));\n\nconst maxSize = 1900;\nconst maxBlocksPerChunk = 6;\n\nlet results = [];\nlet currentBlocks = [];\nlet currentSize = 0;\n\nfunction pushChunk() {\n if (currentBlocks.length > 0) {\n results.push({ json: { chunk: currentBlocks } });\n currentBlocks = [];\n currentSize = 0;\n }\n}\n\nfor (const block of blocks) {\n const blockStr = JSON.stringify(block);\n\n if (blockStr.length > maxSize) {\n pushChunk();\n\n let start = 0;\n while (start < blockStr.length) {\n const end = Math.min(start + maxSize, blockStr.length);\n const slice = blockStr.slice(start, end);\n\n results.push({\n json: {\n chunk: [\n {\n type: block.type,\n fragment: slice\n }\n ]\n }\n });\n\n start = end;\n }\n continue;\n }\n\n const exceedsSize = currentSize + blockStr.length > maxSize;\n const exceedsCount = currentBlocks.length >= maxBlocksPerChunk;\n\n if (exceedsSize || exceedsCount) {\n pushChunk();\n }\n\n currentBlocks.push(block);\n currentSize += blockStr.length;\n}\n\npushChunk();\n\nreturn results;"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
8896,
224
],
"id": "abe7da49-f701-4136-ba45-9a29161d5d9b",
"name": "Code in JavaScript"
},
{
"parameters": {
"resource": "databasePage",
"databaseId": {
"__rl": true,
"value": "2173b1c6-ed75-8040-9fcc-c712c2b631d3",
"mode": "list",
"cachedResultName": "CRM",
"cachedResultUrl": "https://www.notion.so/2173b1c6ed7580409fccc712c2b631d3"
},
"title": "={{ $('Webhook').item.json.body[' name'] }}",
"propertiesUi": {
"propertyValues": [
{
"key": "Email|email",
"emailValue": "={{ $('Webhook').item.json.body.email }}"
},
{
"key": "LinkedIn|url",
"urlValue": "={{ $('Webhook').item.json.body.linkedin }}"
},
{
"key": "Event|date",
"date": "={{ $('Webhook').item.json.body['meet-start'] }}"
},
{
"key": "Reschedule|rich_text",
"richText": true,
"text": {
"text": [
{
"text": "={{ $('Webhook').item.json.body.reschedule }}",
"isLink": true,
"textLink": "={{ $('Webhook').item.json.body.reschedule }}",
"annotationUi": {}
}
]
}
},
{
"key": "Current income|number",
"numberValue": "={{ $('Webhook').item.json.body.income }}"
},
{
"key": "Why now?|rich_text",
"textContent": "={{ $('Webhook').item.json.body['why-now'] }}"
},
{
"key": "Problem|select",
"selectValue": "={{ $('Webhook').item.json.body.challenge }}"
},
{
"key": "How will this help?|rich_text",
"textContent": "={{ $('Webhook').item.json.body.future }}"
},
{
"key": "Employment status|rich_text",
"textContent": "={{ $('Webhook').item.json.body.status }}"
},
{
"key": "Target title|rich_text",
"textContent": "={{ $('Webhook').item.json.body.title }}"
},
{
"key": "Industry|rich_text",
"textContent": "={{ $('Webhook').item.json.body.industry }}"
},
{
"key": "Years of exp|number",
"numberValue": "={{ $('Webhook').item.json.body.exp }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.notion",
"typeVersion": 2.2,
"position": [
8320,
416
],
"id": "72ab9ca2-d987-4ee9-81d7-676017812813",
"name": "Create a database page",
"credentials": {
"notionApi": {
"id": "FK0SvXKRNwl0pAk9",
"name": "Notion account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "=https://api.notion.com/v1/blocks/{{ $('Update a database page').item.json.id }}/children",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer 158675060372fPKR5jMLVFBK9tc2aQWqF8gjCSs11gMcnj"
},
{
"name": "Notion-Version",
"value": "2022-06-28"
}
]
},
"sendBody": true,
"contentType": "raw",
"rawContentType": "text",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
9504,
256
],
"id": "1daacc30-987a-418d-b15f-76669518500e",
"name": "HTTP Request"
}
],
"pinData": {
"Webhook": [
{
"json": {
"headers": {
"host": "offeraccelerator.app.n8n.cloud",
"user-agent": "node-fetch/1.0 (+https://github.com/bitinn/node-fetch)",
"content-length": "799",
"accept": "application/json",
"accept-encoding": "gzip, br",
"baggage": "sentry-environment=production,sentry-public_key=fb9e5b294f68425eb7eb6b168b67dc8d,sentry-trace_id=52661cc1ba1849f9949397d1ea9d04b4",
"cdn-loop": "cloudflare; loops=1; subreqs=1",
"cf-connecting-ip": "74.220.48.248",
"cf-ew-via": "15",
"cf-ipcountry": "US",
"cf-ray": "9a3079c816915939-PDX",
"cf-visitor": "{\"scheme\":\"https\"}",
"cf-worker": "n8n.cloud",
"content-type": "application/json",
"sentry-trace": "52661cc1ba1849f9949397d1ea9d04b4-9e053b3d273a3e39",
"traceparent": "00-6922f61a00000000215c6e9bb464aa0d-5204f693d5722f53-00",
"tracestate": "dd=t.tid:6922f61a00000000;t.dm:-1;s:0;p:5204f693d5722f53",
"x-datadog-parent-id": "5910119725818589011",
"x-datadog-sampling-priority": "0",
"x-datadog-tags": "_dd.p.tid=6922f61a00000000",
"x-datadog-trace-id": "2403917916134484493",
"x-forwarded-for": "74.220.48.248, 104.23.160.133",
"x-forwarded-host": "offeraccelerator.app.n8n.cloud",
"x-forwarded-port": "443",
"x-forwarded-proto": "https",
"x-forwarded-server": "traefik-prod-users-gwc-97-56dd95847b-9j5cq",
"x-is-trusted": "yes",
"x-real-ip": "74.220.48.248"
},
"params": {},
"query": {},
"body": {
"exp": 4,
"industry": "finance",
"title": "analyst",
"status": "Employed part-time",
"apps": 900,
"int": 1,
"offers": 0,
"challenge": "Rejected at interviews",
"future": "no idea",
"why-now": "plz help ",
"income": 2111,
" name": "olitestksg",
"email": "[email protected]",
"linkedin": "https://www.linkedin.com/in/olivercordingley",
"meet-url": "https://meet.google.com/aqm-ejta-yex",
"meet-start": "2025-11-28T07:00:00.000Z",
"reschedule": "https://ourgen.fillout.com/event/55LeBPd8xZus?t=hVapSWFoU4uRMba1samtK8FXXbLjKbnr",
"cv": [
{
"url": "https://prod-fillout-oregon-s3.s3.us-west-2.amazonaws.com/orgid-210895/flowpublicid-55LeBPd8xZus/ba4bfc01-60c6-4679-8210-19c23b021511-vFW48YFkXTJMR37oR2Qz7RjtAmyf8w991kQzoI7yH8sLiMpEDEQ9PuivhSz42RJwJcUMdenlfqBy3bgDcTKvIbNhc0uLbL8o4nf/Jamie-Harvey-CV.pdf",
"filename": "Jamie-Harvey-CV.pdf"
}
]
},
"webhookUrl": "https://offeraccelerator.app.n8n.cloud/webhook/strategy",
"executionMode": "production"
}
}
]
},
"connections": {
"Webhook": {
"main": [
[
{
"node": "Get many database pages",
"type": "main",
"index": 0
}
]
]
},
"Get many database pages": {
"main": [
[
{
"node": "Update a database page",
"type": "main",
"index": 0
}
],
[
{
"node": "Create a database page",
"type": "main",
"index": 0
}
]
]
},
"Message a model": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Update a database page": {
"main": [
[
{
"node": "Message a model",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "a65aa5ee-b938-4cce-9918-004f7e4047ed",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "e8ac305d25816be31f62fbfe4dedb49039b82669b5fd1ec3a1916c70360aedfd"
},
"id": "xkyy9ZWYvF4R2FEM",
"tags": []
}