AutomationFlowsAI & RAG › Upwork AI Proposal Creator

Upwork AI Proposal Creator

Upwork AI Proposal Creator. Uses @apify/n8n-nodes-apify, memoryPostgresChat, agent, lmChatOpenRouter. Scheduled trigger; 21 nodes.

Cron / scheduled trigger★★★★☆ complexityAI-powered21 nodes@Apify/N8N Nodes ApifyMemory Postgres ChatAgentOpenRouter ChatChain LlmTelegramOllama Chat
AI & RAG Trigger: Cron / scheduled Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:
Upwork AI Proposal Creator — n8n workflow card showing @Apify/N8N Nodes Apify, Memory Postgres Chat, Agent integration

This workflow follows the Agent → Chainllm 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 →

Download .json
{
  "updatedAt": "2026-07-18T12:13:54.608Z",
  "createdAt": "2026-06-21T18:22:07.359Z",
  "id": "O8HhI5YHmotFVHpW",
  "name": "Upwork AI Proposal Creator",
  "description": null,
  "active": true,
  "isArchived": false,
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -896,
        800
      ],
      "id": "3f3a7a51-4cfa-4f6f-a2f3-7410bda41c2c",
      "name": "Schedule Trigger"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "b7ef61e3-d0cf-4095-82d6-86594af1e27c",
              "leftValue": "={{ $json.buyer.hireRate }}",
              "rightValue": 0.6,
              "operator": {
                "type": "number",
                "operation": "gte"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.3,
      "position": [
        -448,
        800
      ],
      "id": "43be7d85-96b8-49ad-b43a-634cbc40ff93",
      "name": "Filter"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "67515370-fe9c-4135-8a99-8d354b887c02",
              "name": "Hire Rate",
              "value": "={{ $json.buyer.hireRate }}",
              "type": "number"
            },
            {
              "id": "362a0f58-372b-48e5-b908-d4aa77115f98",
              "name": "Country",
              "value": "={{ $json.buyer.location.country }}",
              "type": "string"
            },
            {
              "id": "79f053aa-fb8e-471f-81c5-6d4f1417932a",
              "name": "Avg Hourly Jobs Rate Amount",
              "value": "={{ $json.buyer.avgHourlyJobsRate.amount }}",
              "type": "number"
            },
            {
              "id": "6b34761d-6445-4800-8e7d-ac63f742fce1",
              "name": "Total Charges Amount",
              "value": "={{ $json.buyer.stats.totalCharges.amount }}",
              "type": "number"
            },
            {
              "id": "f4cf3628-adb7-44d3-9621-dc9ffd1227d7",
              "name": "Feedback Count",
              "value": "={{ $json.buyer.stats.feedbackCount }}",
              "type": "number"
            },
            {
              "id": "cdc522c8-2165-4473-af5d-d5b20ed8c760",
              "name": "Feedback to Client",
              "value": "={{ ($json.workHistory || []).map(w => w?.feedbackToClient?.comment).filter(Boolean).slice(0, 10).map((c, i) => `${i + 1}. ${c}`).join(String.fromCharCode(10) + String.fromCharCode(10)) }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -224,
        800
      ],
      "id": "e19c7e66-50ab-4acc-b92b-bd8172dd3974",
      "name": "Client Info"
    },
    {
      "parameters": {
        "operation": "Run actor and get dataset",
        "actorId": {
          "__rl": true,
          "value": "gLI248Zq7Fja9xoMo",
          "mode": "list",
          "cachedResultName": "Upwork Extractor (jupri/upwork)",
          "cachedResultUrl": "https://console.apify.com/actors/gLI248Zq7Fja9xoMo/input"
        },
        "customBody": "{\n    \"age\":24,\n    \"age_unit\": \"hour\",\n    \"contract_to_hire\": false,\n    \"dev_dataset_clear\": false,\n    \"dev_no_strip\": false,\n    \"fixed\": false,\n    \"hourly\": false,\n    \"includes.attachments\": false,\n    \"includes.history\": true,\n    \"limit\": 50,\n    \"no_hires\": false,\n    \"operation\": \"job-search\",\n    \"payment_verified\": false,\n    \"previous_clients\": false,\n    \"query\": [\n        \"data analysis\",\n        \"power bi\",\n        \"sql\",\n        \"excel\",\n        \"dashboard\"\n    ],\n    \"sort\": \"newest\"\n}"
      },
      "type": "@apify/n8n-nodes-apify.apify",
      "typeVersion": 1,
      "position": [
        -672,
        800
      ],
      "id": "6150e1d4-aef0-46dc-ac5a-865ba1478e0b",
      "name": "Get Jobs",
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "8ef0919a-5bc6-4926-8ded-4adf435e95de",
              "name": "Title",
              "value": "={{ $('Get Jobs').item.json.title }}",
              "type": "string"
            },
            {
              "id": "289f92e8-8d5f-46bd-bf76-797d391efd71",
              "name": "Description",
              "value": "={{ $('Get Jobs').item.json.description }}",
              "type": "string"
            },
            {
              "id": "00c26c95-d1e7-4548-9567-91cc4dbba0bc",
              "name": "url",
              "value": "={{ $('Get Jobs').item.json.url }}",
              "type": "string"
            },
            {
              "id": "e1955d25-b4af-496e-893a-52eb7644a16e",
              "name": "Fixed Budget Amount",
              "value": "={{ $('Get Jobs').item.json.fixed.budget.amount}}",
              "type": "string"
            },
            {
              "id": "d2e58464-24e8-41e5-a423-725414c0d7cd",
              "name": "Hourly",
              "value": "={{ $('Get Jobs').item.json.hourly }}",
              "type": "object"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        0,
        672
      ],
      "id": "1d21d0dd-3fdd-4c94-8278-0c8580f32686",
      "name": "Job Data"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "d069582f-a7ff-4d07-80b5-3c3b7f41db7e",
              "name": "Invitations Sent",
              "value": "={{ $('Get Jobs').item.json.clientActivity.invitationsSent }}",
              "type": "number"
            },
            {
              "id": "0f4e05ec-5485-4599-bff9-ca20cc49270c",
              "name": "Total Applicants",
              "value": "={{ $('Get Jobs').item.json.clientActivity.totalApplicants }}",
              "type": "number"
            },
            {
              "id": "22b461b0-99a3-4ae9-b500-03aae45b16b2",
              "name": "Last Buyer Activity",
              "value": "={{ Math.floor(DateTime.now().diff($('Get Jobs').item.json.clientActivity.lastBuyerActivity.toDateTime(), 'minutes').minutes) + ' minutes ago' }}",
              "type": "string"
            },
            {
              "id": "0674b25c-bae8-406e-94ec-89a3b14d1e80",
              "name": "Total Hired",
              "value": "={{ $('Get Jobs').item.json.clientActivity.totalHired }}",
              "type": "number"
            },
            {
              "id": "bdfc94d1-d1f5-42db-9c8f-f4332f0cd635",
              "name": "Total Invited To Interview",
              "value": "={{ $('Get Jobs').item.json.clientActivity.totalInvitedToInterview }}",
              "type": "number"
            },
            {
              "id": "5a4c4005-8014-426c-937b-bf1eedc5d77a",
              "name": "Unanswered Invites",
              "value": "={{ $('Get Jobs').item.json.clientActivity.unansweredInvites }}",
              "type": "number"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        224,
        672
      ],
      "id": "192769ad-8470-4d22-b075-687feb82a35e",
      "name": "Client Activity"
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "=upwork"
      },
      "type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
      "typeVersion": 1.4,
      "position": [
        528,
        896
      ],
      "id": "da232804-a732-49ce-a29b-191bd5c053f6",
      "name": "Postgres Chat Memory",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=You are a Senior Solutions Architect evaluating freelance data contracts. Your task is to analyze the provided job description and extract actionable intelligence to feed into a proposal-generation engine. \n\nDo not write a standard summary. Deconstruct the job post into the specific technical and business requirements. \n\nMap the client's needs against this specific candidate profile: \nA Data Analyst and BI Developer specializing in end-to-end data pipelines. Key capabilities include star schema design, ETL/ELT pipelines, dimensional modeling, SQL Server, Power BI, Python (including Scikit-Learn for data cleaning), and workflow automation (n8n). \n\nAnalyze the following job title and description:\nTitle: {{ $('Job Data').item.json.Title }}\nDescription: {{ $('Job Data').item.json.Description }}\n\nReturn a valid JSON object strictly adhering to this structure:\n{\n  \"client_core_problem\": \"A 1-sentence definition of the fundamental business or technical problem the client is trying to solve.\",\n  \"explicit_technical_requirements\": [\"List of explicitly stated software, languages, or frameworks\"],\n  \"implicit_architectural_needs\": [\"List of underlying structural needs not explicitly stated, e.g., 'requires a dimensional model' or 'needs an automated ELT pipeline'\"],\n  \"candidate_match_points\": [\"List of 2 to 3 specific areas where the candidate's capabilities (e.g., Power BI, Python, automated data cleaning) directly solve the client's core problem.\"],\n  \"proposed_solution_angle\": \"A 2-sentence strategic angle the proposal should take to win the bid (e.g., focus on automated workflow, focus on dashboard usability, etc.).\"\n}",
        "options": {
          "systemMessage": "You are a deterministic, zero-fluff Data Extraction Engine. Your sole function is to ingest unstructured job descriptions and serialize them into strict, RFC 8259 compliant JSON.\n\nOPERATIONAL LAWS:\n1. OUTPUT FORMAT: You will output a raw JSON object and nothing else. You are strictly forbidden from pre-pending intro text, post-pending summary remarks, or wrapping the output in Markdown code blocks (e.g., do not use ```json ... ```).\n2. EPISTEMIC STRICTNESS: Base your extraction purely on the provided text. Do not project, extrapolate, or invent software stack requirements that are not logically necessitated by the prompt. If an implicit field cannot be safely deduced, return an empty array: [].\n3. CLINICAL TONE: Maintain the hyper-rational, detached perspective of a Principal Systems Architect. Do not use marketing buzzwords, enthusiastic filler, or sales rhetoric. \n4. THE POISON PILL: If the input text provided in the User Message is clearly a corrupted scrape, a login page, or a non-job listing, output the exact string {\"CRITICAL_PARSER_ERROR\": \"PAYLOAD_NOT_A_JOB\"} and cease generation."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        448,
        672
      ],
      "id": "0f25d6fe-6b64-4d65-a1d2-5743a76ea8e8",
      "name": "Summary Job Description",
      "retryOnFail": true
    },
    {
      "parameters": {
        "mode": "combine",
        "combineBy": "combineByPosition",
        "options": {}
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2,
      "position": [
        800,
        800
      ],
      "id": "3a94b326-fd46-4d47-ba22-b5059ad34a67",
      "name": "Merge"
    },
    {
      "parameters": {
        "jsCode": "return items.map(item => {\n  return {\n    json: {\n      text:\n        item.json[\"Feedback to Client\"] &&\n        item.json[\"Feedback to Client\"].trim() !== \"\"\n          ? item.json[\"Feedback to Client\"]\n          : \"NO_FEEDBACK_RECORDED\"\n    }\n  };\n});"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1024,
        800
      ],
      "id": "cf2920b4-f31b-4d16-a8f4-bf21649db3b3",
      "name": "Code in JavaScript"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "cf82b475-852d-48a9-9d6f-b4dec1ceb05f",
              "leftValue": "={{ $json.text }}",
              "rightValue": "NO_FEEDBACK_RECORDED",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        1248,
        800
      ],
      "id": "4fc20f24-7c83-4d05-a802-70fcd99c817f",
      "name": "If"
    },
    {
      "parameters": {
        "model": "openrouter/free",
        "options": {
          "responseFormat": "text"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "typeVersion": 1,
      "position": [
        1712,
        448
      ],
      "id": "c1ac3580-b0d1-400d-9432-cc4f1a05c74b",
      "name": "OpenRouter Chat Model",
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        1472,
        624
      ],
      "id": "4e6536fd-3e85-484a-92d3-c165a635ccef",
      "name": "Loop Over Items"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Extract the explicit personal name of the client/buyer from the text below. \nIf no human name is found, return the word null.\nDo not use markdown. Do not type ```json. Output ONLY a valid JSON object in this format: {\"client_name\": \"Name\"}\n\nText to analyze:\n{{ $('Code in JavaScript').item.json.text }}",
        "needsFallback": true,
        "batching": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.9,
      "position": [
        1696,
        224
      ],
      "id": "acf091bc-ac83-4de2-bfb7-3af4b7ba9bf9",
      "name": "Basic LLM Chain",
      "retryOnFail": true,
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "jsCode": "const rawResponse = $input.item.json.text || $input.item.json.output || \"\";\n\n// ASCII code 96 is the backtick (`). This builds the string \"```json|```\" \n// at runtime so your editor's markdown parser cannot break the line.\nconst bt = String.fromCharCode(96, 96, 96);\nconst markdownSanitizer = new RegExp(bt + \"json|\" + bt, \"gi\");\n\nconst clean = rawResponse.replace(markdownSanitizer, \"\").trim();\n\nlet extractedName = null;\ntry {\n    extractedName = JSON.parse(clean).client_name;\n} catch(e) {}\n\nconst currentJob = $('Loop Over Items').item.json;\n\nreturn {\n    json: {\n        ...currentJob,\n        client_name: extractedName\n    }\n};"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        2112,
        384
      ],
      "id": "297e2676-fe82-4671-ac37-60086b2caf64",
      "name": "Code in JavaScript1"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "dd1a7b44-fd6e-4e6b-9963-b8ba7e3cd023",
              "name": "Client Name",
              "value": "No Name",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1472,
        912
      ],
      "id": "81e52841-01a2-4da9-9aac-e7ea13fd6f8d",
      "name": "No Client Name"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "4b108b69-1967-4956-a074-534ae459e161",
              "name": "Title",
              "value": "={{ $('Job Data').item.json.Title }}",
              "type": "string"
            },
            {
              "id": "02171e55-d805-49cc-8a95-f775886af74b",
              "name": "Description",
              "value": "={{ $('Job Data').item.json.Description }}",
              "type": "string"
            },
            {
              "id": "9923a530-0c65-40fb-95ce-6d445cd42cc1",
              "name": "Client Name",
              "value": "={{ $('Code in JavaScript1').item.json.client_name }}",
              "type": "string"
            },
            {
              "id": "b29f1ca2-cd0a-4481-9950-e1de0106d3d8",
              "name": "url",
              "value": "={{ $('Job Data').item.json.url }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1760,
        624
      ],
      "id": "e240c84a-6552-4e92-b60e-8fc0b01f084b",
      "name": "Final Data"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Write the Upwork proposal for the job below. \n\nYour output MUST strictly follow this exact 3-part layout:\n\nHi {{ $json['Client Name'] }},\n[Paragraph 1: 2 sentences acknowledging their project goal in plain English]\n\n[Paragraph 2: 2 sentences explaining how your data/automation background solves it simply]\n\n[Paragraph 3: 1 closing sentence offering a low-pressure next step]\n\n\nDATA TO PROCESS:\nJob Title: {{ $json.Title }}\nJob Description:\n\"\"\"\n{{ $json.Description }}\n\"\"\"",
        "needsFallback": true,
        "options": {
          "systemMessage": "=You are an expert Data Analyst & BI Developer writing cold Upwork proposals. \n\nYour writing philosophy is \"Smart Casual\": you speak in clear, relaxed, highly professional plain English. You translate complex data work into simple business value.\n\nTHE 4 STRICT WRITING RULES:\n1. MAX LENGTH: The proposal must be under 125 words. Short, breezy, easy to read on a phone.\n2. THE \"10th GRADE\" RULE: Strip out all heavy academic data jargon. If you can say \"organize your spreadsheets\", do NOT say \"build a normalized dimensional star-schema\". Speak the client's language.\n3. PRAGMATIC VALUE: Explain how your background (SQL, Power BI, Python, or automation) fixes their specific mess in 2 simple sentences. \n4. THE CHILL CLOSE: End with a low-pressure offer to look at a sample of their data to see if you're a good fit. Never use sycophantic filler like \"I am thrilled to apply\" or \"esteemed job posting\"."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        2048,
        672
      ],
      "id": "f9b4269c-0447-4554-9333-9fd8bf8c5a38",
      "name": "AI Agent",
      "retryOnFail": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "0ff95b3d-426c-4fed-802f-af6d7cd14fd2",
              "name": "Proposal",
              "value": "={{ $json.output }}",
              "type": "string"
            },
            {
              "id": "d20133a3-1086-44fa-9919-9534be3e1ccf",
              "name": "Job url",
              "value": "={{ $('Final Data').item.json.url }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        2400,
        672
      ],
      "id": "815bd035-59c6-4339-9fcf-9d3e37f78eec",
      "name": "Proposal Detalis"
    },
    {
      "parameters": {
        "chatId": "1137181888",
        "text": "=*New Upwork Proposal Draft*\n\n{{ $json.Proposal }}\n\n\ud83d\udd17 *Job Link:*\n{{ $json['Job url'] }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        2624,
        672
      ],
      "id": "9854d036-405d-47bb-8750-afa3442a7a6c",
      "name": "Send a text message",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": "llama3.2:latest",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOllama",
      "typeVersion": 1,
      "position": [
        1840,
        448
      ],
      "id": "f2f858fc-9070-4699-935b-111f4e219a80",
      "name": "Ollama Chat Model",
      "credentials": {
        "ollamaApi": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get Jobs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter": {
      "main": [
        [
          {
            "node": "Client Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Jobs": {
      "main": [
        [
          {
            "node": "Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Client Info": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          },
          {
            "node": "Job Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Job Data": {
      "main": [
        [
          {
            "node": "Client Activity",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Client Activity": {
      "main": [
        [
          {
            "node": "Summary Job Description",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Postgres Chat Memory": {
      "ai_memory": [
        [
          {
            "node": "Summary Job Description",
            "type": "ai_memory",
            "index": 0
          },
          {
            "node": "AI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Summary Job Description": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Client Name",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Final Data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Basic LLM Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain": {
      "main": [
        [
          {
            "node": "Code in JavaScript1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript1": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "No Client Name": {
      "main": [
        [
          {
            "node": "Final Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Final Data": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Proposal Detalis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Proposal Detalis": {
      "main": [
        [
          {
            "node": "Send a text message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ollama Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Summary Job Description",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Basic LLM Chain",
            "type": "ai_languageModel",
            "index": 1
          },
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 1
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate",
    "availableInMCP": true,
    "timeSavedMode": "fixed",
    "timezone": "Africa/Cairo",
    "callerPolicy": "workflowsFromSameOwner"
  },
  "staticData": {
    "node:Schedule Trigger": {
      "recurrenceRules": []
    }
  },
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodeGroups": [],
  "versionId": "3e21287c-a797-4ceb-8ed9-a8997c6f08e3",
  "activeVersionId": "3e21287c-a797-4ceb-8ed9-a8997c6f08e3",
  "versionCounter": 662,
  "triggerCount": 1,
  "sourceWorkflowId": null,
  "tags": [
    {
      "updatedAt": "2026-07-16T16:03:29.217Z",
      "createdAt": "2026-07-16T16:03:29.217Z",
      "id": "08f43634238e406b",
      "name": "Agentic AI"
    },
    {
      "updatedAt": "2026-07-16T16:03:29.020Z",
      "createdAt": "2026-07-16T16:03:29.020Z",
      "id": "9a8d1d753df54ed1",
      "name": "Production Automation"
    },
    {
      "updatedAt": "2026-07-16T16:03:28.786Z",
      "createdAt": "2026-07-16T16:03:28.786Z",
      "id": "6e30f4ffb71d4b65",
      "name": "Data Pipeline"
    },
    {
      "updatedAt": "2026-07-16T16:03:28.540Z",
      "createdAt": "2026-07-16T16:03:28.540Z",
      "id": "90acb56ef2f84a89",
      "name": "Event-Driven"
    },
    {
      "updatedAt": "2026-07-16T16:03:28.284Z",
      "createdAt": "2026-07-16T16:03:28.284Z",
      "id": "e1c954be4bee474d",
      "name": "Data Transformation"
    }
  ],
  "shared": [
    {
      "updatedAt": "2026-06-21T18:22:07.359Z",
      "createdAt": "2026-06-21T18:22:07.359Z",
      "role": "workflow:owner",
      "workflowId": "O8HhI5YHmotFVHpW",
      "projectId": "7Kuw5RaGwePDWMtJ",
      "project": {
        "updatedAt": "2026-06-09T16:37:14.049Z",
        "createdAt": "2026-06-09T16:15:53.210Z",
        "id": "7Kuw5RaGwePDWMtJ",
        "name": "Sohila Abbas <sohila.k.data@gmail.com>",
        "type": "personal",
        "icon": null,
        "description": null,
        "customTelemetryTags": [],
        "creatorId": "ef255f89-7c87-4d14-8714-7469755d5486"
      }
    }
  ],
  "versionMetadata": {
    "name": "Version 3e21287c",
    "description": ""
  }
}

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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Upwork AI Proposal Creator. Uses @apify/n8n-nodes-apify, memoryPostgresChat, agent, lmChatOpenRouter. Scheduled trigger; 21 nodes.

Source: https://github.com/Sohila-Khaled-Abbas/n8n-workflow-upwork-ai-proposal-creator/blob/main/workflow.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow is for beauty salons who want consistent, high‑quality social media content without writing every post manually. It also suits agencies and automation builders who manage multiple beauty

Telegram, Google Sheets Trigger, Agent +26
AI & RAG

Who Is This For?

Telegram, Google Sheets Trigger, Lm Chat Mistral Cloud +17
AI & RAG

WF-00 agent_router. Uses postgres, httpRequest, agent, lmChatOpenRouter. Scheduled trigger; 23 nodes.

Postgres, HTTP Request, Agent +4
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Mailgun, OpenAI, OpenAI Chat +8
AI & RAG

Complete PostgreSQL-backed system: Keyword scoring → AI research → Multi-part content generation → fal.ai Nano Banana image generation → WordPress publishing

WordPress, OpenAI, Perplexity +8