{
  "name": "Automate patent monitoring on Google Patents into Google Sheets",
  "nodes": [
    {
      "id": "d9a2b316-0001-4e01-9001-000000000001",
      "name": "Every Monday morning",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        520
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ],
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d9a2b316-0002-4e02-9002-000000000002",
      "name": "Set your patent watch list",
      "type": "n8n-nodes-base.set",
      "position": [
        260,
        520
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d9a2b316-0011-4e11-9011-+1234567890",
              "name": "watchTerms",
              "type": "array",
              "value": "[\"solid state battery\", \"sodium ion battery\"]"
            },
            {
              "id": "d9a2b316-0012-4e12-9012-+1234567890",
              "name": "assignee",
              "type": "string",
              "value": ""
            },
            {
              "id": "d9a2b316-0013-4e13-9013-+1234567890",
              "name": "country",
              "type": "string",
              "value": "US"
            },
            {
              "id": "d9a2b316-0014-4e14-9014-+1234567890",
              "name": "lookbackDays",
              "type": "number",
              "value": "90"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "d9a2b316-0003-4e03-9003-000000000003",
      "name": "One search per watch term",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        520,
        520
      ],
      "parameters": {
        "include": "allOtherFields",
        "options": {},
        "fieldToSplitOut": "watchTerms"
      },
      "typeVersion": 1
    },
    {
      "id": "d9a2b316-0004-4e04-9004-000000000004",
      "name": "Search Google Patents",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        780,
        520
      ],
      "parameters": {
        "memory": 1024,
        "actorId": "johnvc~google-patents-api",
        "resource": "Actors",
        "operation": "Run actor and get dataset",
        "customBody": "={{ JSON.stringify({ q: $json.watchTerms, assignee: $json.assignee || undefined, country: $json.country, after: 'publication:' + $now.minus({ days: $json.lookbackDays }).toFormat('yyyyMMdd'), num: 10, max_pages: 1, no_cache: true, include_ai_summary: false }) }}"
      },
      "typeVersion": 1
    },
    {
      "id": "d9a2b316-0005-4e05-9005-000000000005",
      "name": "Keep terms that returned patents",
      "type": "n8n-nodes-base.filter",
      "position": [
        1040,
        520
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "d9a2b316-0041-4e41-9041-+1234567890",
              "operator": {
                "type": "array",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.patents }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d9a2b316-0006-4e06-9006-000000000006",
      "name": "One row per patent",
      "type": "n8n-nodes-base.code",
      "position": [
        1300,
        520
      ],
      "parameters": {
        "jsCode": "// Expand each search into one row per patent, and flatten the fields that\n// arrive as arrays so a spreadsheet cell can hold them.\nconst weekOf = $now.toFormat('yyyy-MM-dd');\n\nconst list = (v) => (Array.isArray(v) ? v.filter(Boolean).join(', ') : String(v || ''));\nconst clip = (s, n) => {\n  const v = String(s || '').replace(/\\s+/g, ' ').trim();\n  return v.length > n ? v.slice(0, n - 3) + '...' : v;\n};\n\nconst rows = [];\nfor (const item of $input.all()) {\n  const term = (item.json.search_parameters || {}).q || '';\n  for (const p of item.json.patents || []) {\n    rows.push({\n      json: {\n        'Week of': weekOf,\n        'Watch term': term,\n        Title: clip(p.title, 200),\n        Assignee: list(p.assignee),\n        Inventor: list(p.inventor),\n        'Publication number': p.publication_number || '',\n        'Publication date': p.publication_date || '',\n        'Filing date': p.filing_date || '',\n        Summary: clip(p.snippet, 500),\n        'Patent link': p.patent_link || '',\n      },\n    });\n  }\n}\nreturn rows;\n"
      },
      "typeVersion": 2
    },
    {
      "id": "d9a2b316-0007-4e07-9007-000000000007",
      "name": "Append patents to sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1560,
        520
      ],
      "parameters": {
        "columns": {
          "value": {},
          "mappingMode": "autoMapInputData",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "d9a2b316-0090-4e90-9090-000000000090",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -620,
        40
      ],
      "parameters": {
        "width": 520,
        "height": 1240,
        "content": "## Automate patent monitoring on Google Patents into Google Sheets\n\nNo IP watch service and no per-seat subscription. Every week this searches Google Patents for the technologies you are watching and appends one row per patent to your sheet: title, assignee, inventor, publication and filing dates, the abstract, and a link to the patent itself.\n\nSet an assignee and it becomes a competitor watch instead: every patent a named company has published inside your date window, which is the closest thing there is to reading their R&D roadmap.\n\n**Who's it for**\nR&D teams tracking a field, IP counsel watching a competitor's filings, and founders who want to know whether the thing they are about to build is already patented.\n\n**How it works**\n1. A schedule trigger fires once a week\n2. One Set node holds your watch terms, an optional assignee, and the lookback window\n3. The Apify node runs one Google Patents search per term\n4. A Code node turns each search into one row per patent\n\n**Setup**\n1. Create a free Apify account and add your API token to the Apify credential\n2. Connect your Google account in the Sheets node and pick a spreadsheet\n3. Replace the example watch terms in the config node, and set an assignee if you want to follow one company\n\n**Good to know**\nAbout 4 cents per watch term per week, so three terms is roughly 12 cents a week.\nPatents publish about 18 months after filing, so this shows what is newly PUBLISHED, not newly invented.\nKeep the lookback at 90 days or more. Publication happens in batches and a narrow niche can go weeks with nothing, so a 30 or 60 day window often returns an empty sheet rather than a useful one.\nRows are appended every run, so de-duplicate on Publication number when you chart it.\nActor: https://apify.com/johnvc/google-patents-api?fpr=9n7kx3&fp_sid=n8n"
      },
      "typeVersion": 1
    },
    {
      "id": "d9a2b316-0091-4e91-9091-000000000091",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -40,
        60
      ],
      "parameters": {
        "color": 7,
        "width": 240,
        "height": 240,
        "content": "### 1. Schedule\nRuns every Monday morning. Change the cadence, or swap in a manual trigger while you test."
      },
      "typeVersion": 1
    },
    {
      "id": "d9a2b316-0092-4e92-9092-000000000092",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        220,
        60
      ],
      "parameters": {
        "color": 7,
        "width": 240,
        "height": 240,
        "content": "### 2. Your input\nWatch terms, an optional assignee, the country, and how far back to look. This is the only node you edit. Keep the lookback at 90 days or more."
      },
      "typeVersion": 1
    },
    {
      "id": "d9a2b316-0093-4e93-9093-000000000093",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        60
      ],
      "parameters": {
        "color": 7,
        "width": 240,
        "height": 240,
        "content": "### 3. Fan out\nTurns your watch list into one Google Patents search each."
      },
      "typeVersion": 1
    },
    {
      "id": "d9a2b316-0094-4e94-9094-000000000094",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        740,
        60
      ],
      "parameters": {
        "color": 7,
        "width": 240,
        "height": 240,
        "content": "### 4. Search\nRuns the Google Patents API actor for one term. Add your Apify credential here."
      },
      "typeVersion": 1
    },
    {
      "id": "d9a2b316-0095-4e95-9095-000000000095",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1000,
        60
      ],
      "parameters": {
        "color": 7,
        "width": 240,
        "height": 240,
        "content": "### 5. Clean\nSkips any term that returned no patents, so blank rows never reach the sheet."
      },
      "typeVersion": 1
    },
    {
      "id": "d9a2b316-0096-4e96-9096-000000000096",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1260,
        60
      ],
      "parameters": {
        "color": 7,
        "width": 240,
        "height": 240,
        "content": "### 6. Shape\nOne row per patent, with the assignee and inventor lists flattened for a spreadsheet."
      },
      "typeVersion": 1
    },
    {
      "id": "d9a2b316-0097-4e97-9097-000000000097",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1520,
        60
      ],
      "parameters": {
        "color": 7,
        "width": 240,
        "height": 240,
        "content": "### 7. Deliver\nPick your spreadsheet and tab. Columns map automatically."
      },
      "typeVersion": 1
    },
    {
      "id": "d9a2b316-0080-4e80-9080-000000000080",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        220,
        860
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 240,
        "content": "### Why not sort by newest?\nSorting Google Patents by newest returns the newest patents overall and quietly ignores your search term. This uses relevance plus a publication-date window instead, which is what actually gives you new AND on-topic results."
      },
      "typeVersion": 1
    },
    {
      "id": "d9a2b316-0081-4e81-9081-000000000081",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        660,
        860
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 240,
        "content": "### Self-hosting n8n?\nThere is also a dedicated community node for this actor: `n8n-nodes-google-patents-api` on npm."
      },
      "typeVersion": 1
    }
  ],
  "settings": {
    "executionOrder": "v1"
  },
  "connections": {
    "One row per patent": {
      "main": [
        [
          {
            "node": "Append patents to sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Every Monday morning": {
      "main": [
        [
          {
            "node": "Set your patent watch list",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Google Patents": {
      "main": [
        [
          {
            "node": "Keep terms that returned patents",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "One search per watch term": {
      "main": [
        [
          {
            "node": "Search Google Patents",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set your patent watch list": {
      "main": [
        [
          {
            "node": "One search per watch term",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Keep terms that returned patents": {
      "main": [
        [
          {
            "node": "One row per patent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}