Zie619/n8n-workflows · error · Error

Invalid quantity

Error message

Invalid quantity: ${input["Quantity Received"]}

What it means

Thrown by 'Calculate Total Price' when the webhook field `Quantity Received` cannot be parsed to a number. The getNumber helper strips non-numeric characters, runs parseFloat, and returns null for undefined/null/empty/NaN - the throw then reports the raw value.

Solutions

  1. Make Quantity Received required and numeric at the form layer (input type=number, min>0).
  2. Check the exact field name in the arriving payload via the console.log of complete input data already present in the node.
  3. Trim units: extend the cleaner to also strip letters, or send machine-formatted values from the form.
  4. If zero-quantity submissions are invalid too, change the check to quantity === null || quantity <= 0.

Example fix

// before
const quantity = getNumber(input["Quantity Received"]);
if (quantity === null) throw new Error(`Invalid quantity: ${input["Quantity Received"]}`);

// after
const quantity = getNumber(input["Quantity Received"]);
if (quantity === null || quantity <= 0) {
  throw new Error(`Invalid quantity: ${JSON.stringify(input["Quantity Received"])} (field names present: ${Object.keys(input).join(', ')})`);
}
Defensive patterns

Strategy: validation

Validate before calling

const qtyRaw = input['Quantity Received'];
const qtyNum = Number(String(qtyRaw ?? '').replace(/[^\d.-]/g, ''));
if (!Number.isFinite(qtyNum) || qtyNum <= 0) {
  throw new Error(`Invalid quantity: ${JSON.stringify(qtyRaw)} (keys: ${Object.keys(input).join(', ')})`);
}

Type guard

const isValidQuantity = (v) => {
  if (v === undefined || v === null || v === '') return false;
  const n = parseFloat(String(v).replace(/[^\d.-]/g, ''));
  return Number.isFinite(n) && n > 0;
};

Prevention

When it happens

Trigger: Webhook form submitted with Quantity Received missing, empty string, or a value like 'abc' or ' pieces' that strips to nothing; field name mismatch (form sends 'quantity_received' or 'Qty Received'); value 0 is NOT rejected (parseFloat('0')=0 passes), so this specifically means unparseable input.

Common situations: Google Form / front-end form field renamed or made optional; respondents typing free text into a numeric field; leading/trailing currency or unit words in the value; webhook payload schema drift.

Related errors


AI-assisted analysis of Zie619/n8n-workflows@94007c1445 (2026-08-15). Data as JSON: /api/errors/e3a03c59041f43d0. Report an issue: GitHub.

Appendix: source

Thrown at workflows/Code/0926_Code_Webhook_Create_Webhook.json:800

          "mode": "list",
          "value": "1q0S6AVK7uxZG8sUQkpcZr01KToHPjOZ0gG3zKHLR6lw",
          "cachedResultUrl": "{{ $env.WEBHOOK_URL }}",
          "cachedResultName": "Plumbee Raw Material Delivery  (Responses)"
        }
      },
      "typeVersion": 4.5,
      "notes": "This googleSheets node performs automated tasks as part of the workflow."
    },
    {
      "id": "21c17077-9f9a-489a-b6a5-ea7a70a85cee",
      "name": "Calculate Total Price",
      "type": "n8n-nodes-base.code",
      "position": [
        6340,
        2040
      ],
      "parameters": {
        "jsCode": "// Get the input data\nconst input = $input.all()[0].json;\n\n// Debug: Log the entire input to see all available fields\nconsole.log(\"Complete Input Data:\", JSON.stringify(input, null, 2));\n\n// Improved number parser that handles different formats\nconst getNumber = (value) => {\n  if (value === undefined || value === null || value === \"\") return null;\n  \n  // Remove any currency symbols, commas, or extra spaces\n  const cleaned = String(value)\n    .replace(/[^\\d.-]/g, '')\n    .trim();\n    \n  const num = parseFloat(cleaned);\n  return isNaN(num) ? null : num;\n};\n\n// Use EXACT field names from your webhook payload\nconst quantity = getNumber(input[\"Quantity Received\"]);  // Not \"Quantity Received\"\nconst unitPrice = getNumber(input[\"Unit Price\"]);    // Not \"Unit Price\"\n\n// Validate\nif (quantity === null) throw new Error(`Invalid quantity: ${input[\"Quantity Received\"]}`);\nif (unitPrice === null) throw new Error(`Invalid price: ${input[\"Unit Price\"]}`);\n\n// Calculate total\nconst totalPrice = quantity * unitPrice;\n\n// Return results\n// Return clean output without debug info\nreturn {\n  json: {\n    \"Timestamp\": new Date().toISOString(),\n    \"Product ID\": input[\"Product ID\"],\n    \"Supplier Name\": input[\"Supplier Name\"],\n    \"Material Name\": input[\"Material Name\"],\n    \"Quantity Received\": quantity,\n    \"Description\": input[\"Description\"] || \"\",\n    \"Measurement Unit\": input[\"Measurement Unit\"],\n    \"Unit Price\": unitPrice,\n    \"Total Price\": totalPrice.toFixed(2),\n    \"Date of Delivery\": input[\"Date of Delivery\"],\n    \"Received By\": input[\"Received By\"],\n    \"Submission ID\": input[\"Submission ID\"]\n  }\n};"
      },
      "typeVersion": 2,
      "notes": "This code node performs automated tasks as part of the workflow."
    },
    {
      "id": "4ce817b0-2283-438f-82c7-6f4901fffdd3",
      "name": "Calculate Updated Current Stock",
      "type": "n8n-nodes-base.code",
      "position": [
        7640,
        1840
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const existingStock = parseFloat(\n$('Lookup Existing Stock').first().json['Current Stock']\n|| 0);\nconst newQuantity = parseFloat(\n  $('Validate Quantity Received').first().json['Quantity Received']);\nconst updatedStock = existingStock + newQuantity;\n\n\n  \nreturn {\n  json: {\n    ...$json,\n    \"Updated Current Stock\": updatedStock\n  }\n};"
      },
      "typeVersion": 2,
      "notes": "This code node performs automated tasks as part of the workflow."

View on GitHub (pinned to 94007c1445)