AutomationFlowsData & Sheets › Postgres → Google Sheets Lead Sync

Postgres → Google Sheets Lead Sync

Original n8n title: Sync New Data Between Two Apps

Byn8n Team @n8n-team on n8n.io

This template shows how to sync data from one service to another. Specifically, in this example we're saving a new qualified lead from a Postgres database to a Google Sheets file.

Event trigger★★★★☆ complexity9 nodesPostgres TriggerGoogle Sheets
Data & Sheets Trigger: Event Nodes: 9 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #1930 — we link there as the canonical source.

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
{
  "nodes": [
    {
      "id": "678e86bc-2755-4c79-97d6-fa4da1ed9ff9",
      "name": "Postgres Trigger",
      "type": "n8n-nodes-base.postgresTrigger",
      "disabled": true,
      "position": [
        500,
        480
      ],
      "parameters": {
        "schema": {
          "__rl": true,
          "mode": "list",
          "value": "computed",
          "cachedResultName": "computed"
        },
        "firesOn": "UPDATE",
        "tableName": {
          "__rl": true,
          "mode": "list",
          "value": "users",
          "cachedResultName": "users"
        },
        "additionalFields": {}
      },
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "accecdfc-283c-4119-9b23-4cf44bc5e68c",
      "name": "Filter",
      "type": "n8n-nodes-base.filter",
      "notes": "Filter out @n8n.io emails",
      "position": [
        980,
        540
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.email }}",
              "value2": "n8n.io",
              "operation": "notContains"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 1
    },
    {
      "id": "d16d7ae7-0c60-48f0-97fe-c7618cab73d3",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        380
      ],
      "parameters": {
        "width": 424,
        "height": 559,
        "content": "## \ud83d\udc4b How to use this template\nThis template shows how to sync data from one service to another. In this example we're saving a new qualified lead to a Google Sheets file. Here's how you can test the template:\n\n1. Duplicate our [Google Sheets](https://docs.google.com/spreadsheets/d/1gVfyernVtgYXD-oPboxOSJYQ-HEfAguEryZ7gTtK0V8/edit?usp=sharing) file\n2. Double click the `Google Sheets` node and create a credential by signing in.\n3. Select the correct Google Sheets document and sheet.\n4. Click the `Execute Workflow` button and double click the nodes to see the input and output data\n\n### To customize it to you needs, just do the following:\n1. Enable or exchange the `Postgres trigger` with any service that fits your use case.\n2. Change the `Filter` to fit your needs\n3. Adjust the Google Sheets node as described above\n4. Disable or remove the `On clicking \"Execute Node\"` and `Code` node\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8bc7439e-d814-4960-8b75-fc77805f74c7",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        460,
        380
      ],
      "parameters": {
        "width": 344,
        "height": 562,
        "content": "### 1. Trigger step listens for new events\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "63b2bc4c-8e33-4432-af4b-4595b2012ce1",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        840,
        460
      ],
      "parameters": {
        "width": 462,
        "height": 407,
        "content": "### 2. Filter and transform your data\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nIn this case, we only want to save qualified users that don't have `@n8n.io` in their email address.\n\nTo edit the filter, simply drag and drop input data into the fields or change the values directly. **Besides filters, n8n has other powerful transformation nodes like [Set](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link&utm_campaign=n8n-nodes-base.set), [ItemList](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.itemlists/?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link&utm_campaign=n8n-nodes-base.itemLists), [Code](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link&utm_campaign=n8n-nodes-base.code) and many more.**"
      },
      "typeVersion": 1
    },
    {
      "id": "448e2c49-aa75-405b-ba51-3acbce0fb758",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1340,
        460
      ],
      "parameters": {
        "width": 342.52886836027733,
        "height": 407.43618112665195,
        "content": "### 3. Save the user in a Google Sheet\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nFor simplicity, we're saving our qualified user in a Google Sheet.\n\n**You can replace this node with any service like [Excel](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.microsoftexcel/?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link&utm_campaign=n8n-nodes-base.microsoftExcel), [HubSpot](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.hubspot/?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link&utm_campaign=n8n-nodes-base.hubspot), [Pipedrive](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.pipedrive/?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link&utm_campaign=n8n-nodes-base.pipedrive), [Zendesk](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.zendesk/?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link&utm_campaign=n8n-nodes-base.zendesk) etc.**"
      },
      "typeVersion": 1
    },
    {
      "id": "c0ee182d-4c31-488b-a547-5f2d2ba8786e",
      "name": "On clicking \"Execute Node\"",
      "type": "n8n-nodes-base.manualTrigger",
      "notes": "For testing the workflow",
      "position": [
        500,
        680
      ],
      "parameters": {},
      "notesInFlow": true,
      "typeVersion": 1
    },
    {
      "id": "87f2a11e-f704-4c9e-ac8b-ee1f057cd347",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "notes": "Mock Data",
      "position": [
        680,
        680
      ],
      "parameters": {
        "jsCode": "return [\n  {\n    \"id\": 1,\n    \"username\": \"max_mustermann\",\n    \"email\": \"user@example.com\",\n    \"company_size\": \"500-999\",\n    \"role\": \"Sales\",\n    \"users\": 50\n  }\n]"
      },
      "notesInFlow": true,
      "typeVersion": 1
    },
    {
      "id": "0992077f-b6d3-47d2-94d2-c612dfbf5062",
      "name": "Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "Add to \"Users to contact\"",
      "position": [
        1400,
        540
      ],
      "parameters": {
        "columns": {
          "value": {
            "id": "={{ $json.id }}",
            "email": "={{ $json.email }}",
            "username": "={{ $json.username }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "username",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "username",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "contacted",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "contacted",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id"
          ]
        },
        "options": {
          "cellFormat": "USER_ENTERED"
        },
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1gVfyernVtgYXD-oPboxOSJYQ-HEfAguEryZ7gTtK0V8/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1gVfyernVtgYXD-oPboxOSJYQ-HEfAguEryZ7gTtK0V8",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1gVfyernVtgYXD-oPboxOSJYQ-HEfAguEryZ7gTtK0V8/edit?usp=drivesdk",
          "cachedResultName": "Qualified leads to contact"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4
    }
  ],
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter": {
      "main": [
        [
          {
            "node": "Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Postgres Trigger": {
      "main": [
        [
          {
            "node": "Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On clicking \"Execute Node\"": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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

This template shows how to sync data from one service to another. Specifically, in this example we're saving a new qualified lead from a Postgres database to a Google Sheets file.

Source: https://n8n.io/workflows/1930/ — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

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

Data & Sheets

Code Postgres. Uses postgresTrigger, stickyNote, manualTrigger, googleSheets. Event-driven trigger; 9 nodes.

Postgres Trigger, Google Sheets
Data & Sheets

1930. Uses postgresTrigger, googleSheets. Event-driven trigger; 9 nodes.

Postgres Trigger, Google Sheets
Data & Sheets

Workflow 1930. Uses postgresTrigger, googleSheets. Event-driven trigger; 9 nodes.

Postgres Trigger, Google Sheets
Data & Sheets

This workflow automatically detects completed orders in PostgreSQL and prepares them for AI-based post-purchase communication. It enriches each order with customer, product, and payment data, then gen

Postgres Trigger, Postgres, Agent +4
Data & Sheets

This workflow acts as a junior finance research analyst for a UK boutique M&A or corporate finance team. It listens for Slack messages, classifies the request, gathers company or market data, and prod

HTTP Request, Google Drive, Google Docs +5