{"name": "Ep13 - Quote Builder (setup fee + retainer)", "nodes": [{"parameters": {"formTitle": "Price This Job", "formDescription": "Five answers from the sales call. The setup fee and the retainer price themselves.", "formFields": {"values": [{"fieldLabel": "Business name", "requiredField": true}, {"fieldLabel": "Automation", "requiredField": true}, {"fieldLabel": "Hours a month it saves them", "fieldType": "number", "requiredField": true}, {"fieldLabel": "What an hour of their time costs ($)", "fieldType": "number", "requiredField": true}, {"fieldLabel": "Uses AI? (yes or no)", "requiredField": true}]}, "options": {}}, "id": "d1", "name": "Price This Job", "type": "n8n-nodes-base.formTrigger", "typeVersion": 2.2, "position": [0, 0], "webhookId": "ep13-price-this-job"}, {"parameters": {"jsCode": "// Setup = one month of the value. Retainer = 10% of it. Floors so you never sell cheap.\nconst f = $input.first().json;\nconst hours = Number(f['Hours a month it saves them']) || 0;\nconst rate = Number(f['What an hour of their time costs ($)']) || 0;\nconst ai = /^y/i.test(String(f['Uses AI? (yes or no)'] || '').trim());\nconst round = (n, step) => Math.round(n / step) * step;\n\nconst value = Math.round(hours * rate);                               // what the task costs them a month\nconst setup = Math.max(ai ? 1500 : 500, round(value, 50));            // floor: $500 plain, $1,500 AI\nconst retainer = Math.max(ai ? 150 : 75, round(value * 0.10, 25));    // floor: $75 plain, $150 AI\n\nconst paybackMonths = Math.round(setup / Math.max(1, value - retainer) * 10) / 10;\nconst clientYearOne = value * 12 - setup - retainer * 11;             // retainer starts month two\nconst youYearOne = setup + retainer * 11;\nconst aiNote = ai ? 'AI model costs billed monthly at cost, on top.' : 'No AI costs.';\nreturn [{ json: { business: f['Business name'], automation: f['Automation'], ai, value, setup, retainer, paybackMonths, clientYearOne, youYearOne, aiNote } }];"}, "id": "d2", "name": "Price It", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [260, 0]}, {"parameters": {"operation": "completion", "completionTitle": "={{ $json.business }}: ${{ $json.setup.toLocaleString('en-US') }} setup + ${{ $json.retainer }} a month", "completionMessage": "=It saves them ${{ $json.value.toLocaleString('en-US') }} a month. Pays for itself in {{ $json.paybackMonths }} months. They keep ${{ $json.clientYearOne.toLocaleString('en-US') }} in year one; you bill ${{ $json.youYearOne.toLocaleString('en-US') }}. {{ $json.aiNote }}", "options": {}}, "id": "d3", "name": "Quote", "type": "n8n-nodes-base.form", "typeVersion": 1, "position": [520, 0]}], "connections": {"Price This Job": {"main": [[{"node": "Price It", "type": "main", "index": 0}]]}, "Price It": {"main": [[{"node": "Quote", "type": "main", "index": 0}]]}}, "settings": {"executionOrder": "v1"}}