N
n8n Store
Workflow Market
Salesforce-Google Sheets Company Sync (Smart Duplicate Prevention)

Salesforce-Google Sheets Company Sync (Smart Duplicate Prevention)

by xaviertai0 views

描述

分类

🤖 AI & Machine Learning

使用的节点

n8n-nodes-base.ifn8n-nodes-base.setn8n-nodes-base.mergen8n-nodes-base.mergen8n-nodes-base.mergen8n-nodes-base.itemListsn8n-nodes-base.renameKeysn8n-nodes-base.salesforcen8n-nodes-base.salesforcen8n-nodes-base.salesforce
价格免费
浏览量0
最后更新11/28/2025
workflow.json
{
  "id": "ulMkyRjDpdND1gzn",
  "meta": {
    "instanceId": "f450cd0986d5bfb741d4d1b31068440b1642915c91f795fd72913ef923830e67",
    "templateId": "1792"
  },
  "name": "Salesforce-Google Sheets Company Sync (Smart Duplicate Prevention)",
  "tags": [
    {
      "id": "r7X6mNg8b6tE7HbJ",
      "name": "template",
      "createdAt": "2025-09-28T16:07:48.401Z",
      "updatedAt": "2025-09-28T16:07:48.401Z"
    }
  ],
  "nodes": [
    {
      "id": "29451054-fcd6-4054-b072-a87c716f6c67",
      "name": "On clicking 'execute'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -336,
        -320
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "2c1ed019-85f1-4b0f-bcf5-ce59ff13ea49",
      "name": "Search Salesforce accounts",
      "type": "n8n-nodes-base.salesforce",
      "position": [
        112,
        -384
      ],
      "parameters": {
        "query": "=SELECT id, Name FROM Account WHERE Name = '{{$json[\"Company Name\"].replace(/'/g, '\\\\\\'')}}'",
        "resource": "search"
      },
      "typeVersion": 1,
      "alwaysOutputData": false
    },
    {
      "id": "7da1de2f-2b37-4e33-b8d4-d1dc59e94bbe",
      "name": "Account found?",
      "type": "n8n-nodes-base.if",
      "position": [
        1152,
        0
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json[\"Id\"] }}",
              "operation": "isNotEmpty"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "80890a2a-f6d3-4efd-92b1-6465f98f512b",
      "name": "Remove duplicate companies",
      "type": "n8n-nodes-base.itemLists",
      "position": [
        1312,
        -448
      ],
      "parameters": {
        "compare": "selectedFields",
        "options": {},
        "operation": "removeDuplicates",
        "fieldsToCompare": {
          "fields": [
            {
              "fieldName": "Company Name"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ea9afa15-77be-4d7a-a287-35d4c1c6e6c1",
      "name": "Set Account ID for existing accounts",
      "type": "n8n-nodes-base.renameKeys",
      "position": [
        1520,
        -16
      ],
      "parameters": {
        "keys": {
          "key": [
            {
              "newKey": "Account ID",
              "currentKey": "Id"
            }
          ]
        },
        "additionalOptions": {}
      },
      "typeVersion": 1
    },
    {
      "id": "c10dea7c-96b0-4f3b-b859-af094ced51cc",
      "name": "Set new account name",
      "type": "n8n-nodes-base.set",
      "position": [
        1760,
        -448
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "id",
              "value": "={{ $json[\"id\"] }}"
            },
            {
              "name": "Name",
              "value": "={{ $node[\"Remove duplicate companies\"].json[\"Company Name\"] }}"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "id": "a4a2be2a-7bd9-4a70-b4d9-0df53834bdda",
      "name": "Create Salesforce account",
      "type": "n8n-nodes-base.salesforce",
      "position": [
        1536,
        -448
      ],
      "parameters": {
        "name": "={{ $json[\"Company Name\"] }}",
        "resource": "account",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "89f49e6f-62be-403f-9a4c-cd56e28141f3",
      "name": "Create Salesforce contact",
      "type": "n8n-nodes-base.salesforce",
      "position": [
        1840,
        -16
      ],
      "parameters": {
        "lastname": "={{ $json[\"Last Name\"] }}",
        "resource": "contact",
        "operation": "upsert",
        "externalId": "Email",
        "externalIdValue": "={{ $json[\"Email\"] }}",
        "additionalFields": {
          "email": "={{ $json[\"Email\"] }}",
          "firstName": "={{ $json[\"First Name\"] }}",
          "acconuntId": "={{ $json[\"Account ID\"] }}"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "da75088c-17de-4885-a557-ac2edc84a829",
      "name": "Get row(s) in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -112,
        -320
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "bNNrQVyG0f0LvHLl",
          "name": "xavtwl"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "c6af3549-df84-4dcc-9db8-306648e614fe",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -400,
        -816
      ],
      "parameters": {
        "color": 5,
        "width": 896,
        "height": 704,
        "content": "# 📊 Part 1: Data Input & Preparation\n\n## Extract company data from Google Sheets and prepare for Salesforce processing.\n\n### Modules:\n- Manual Trigger - Starts the workflow execution\n- Get row(s) in sheet - Reads company data from Google Sheets  \n- Search Salesforce accounts - Checks for existing companies\n- Merge existing account data - Combines sheet data with SF search results"
      },
      "typeVersion": 1
    },
    {
      "id": "9db710b0-ef7a-4263-8d5e-71c513951835",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        -816
      ],
      "parameters": {
        "color": 6,
        "width": 496,
        "height": 704,
        "content": "# 🔄 Part 2: Smart Routing & Duplicate Detection\n\n## Analyze search results and route companies to appropriate processing paths.\n\n### Logic Flow:\nCompanies are automatically sorted into two paths based on whether they already exist in Salesforce, preventing duplicates while ensuring complete \ndata capture."
      },
      "typeVersion": 1
    },
    {
      "id": "b9d12003-62b6-427e-8cad-15690eb5593c",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1024,
        -816
      ],
      "parameters": {
        "color": 4,
        "width": 1168,
        "height": 704,
        "content": "# 🆕 Part 3: New Company Processing\n\n## Create new Salesforce accounts for companies not found in the system.\n\n### Modules:\n- Keep new companies - Filters companies not in Salesforce\n- Remove duplicate companies - Eliminates internal duplicates  \n- Create Salesforce account - Creates new SF account records\n- Set new account name - Configures account naming\n- Retrieve new company contacts - Gets contact data for new accounts"
      },
      "typeVersion": 1
    },
    {
      "id": "5c83fdab-2720-4ec2-8b58-70573b61332d",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1024,
        -96
      ],
      "parameters": {
        "color": 2,
        "width": 1168,
        "height": 848,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# ✅ Part 4: Existing Company Processing\n\n## Handle companies that already exist in Salesforce by updating contact information.\n\n### Modules:\n- Account found? - Identifies companies already in Salesforce\n- Set Account ID for existing accounts - Maps existing account IDs\n- Create Salesforce contact - Adds/updates contacts under existing accounts"
      },
      "typeVersion": 1
    },
    {
      "id": "27f3269e-e2ff-4748-88fd-e2ff31fdece5",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -400,
        -96
      ],
      "parameters": {
        "color": 3,
        "width": 1408,
        "height": 848,
        "content": "# 🎯 Salesforce-Google Sheets Company Sync (Smart Duplicate Prevention)\n## Made by: Xavier Tai\n\n## This workflow automatically syncs company data from Google Sheets to Salesforce with intelligent duplicate prevention and comprehensive contact management.\n\n### ✅ What You'll Need\n☑️ Google Sheets with company data (Company Name, Email, Phone, Industry, etc.)\n☑️ Google Sheets API credentials (OAuth 2.0 authentication configured in n8n)\n☑️ Salesforce API access (Connected App with Account/Contact create/read permissions)\n☑️ Salesforce field mapping knowledge (understanding of required vs optional fields for Accounts/Contacts)\n☑️ n8n instance (cloud or self-hosted with HTTPS)\n\n### ⏱️ Estimated execution time: 15-45 seconds per company\n\n### 🔧 Security Best Practices\n- Use environment variables for API keys and tokens - never hardcode credentials\n- Limit workflow access to necessary team members only via n8n user permissions  \n- Test with small datasets (5-10 companies) before full deployment\n- Process in batches of 25-50 companies maximum to respect API limits\n- Backup existing Salesforce data before running bulk operations\n\n### 🚨 Troubleshooting Guide\n- \"Authentication failed\" → Refresh OAuth credentials in n8n connections\n- \"Required field missing\" → Check Salesforce Account/Contact required fields  \n- \"Duplicate account created\" → Verify company name exact matching in search logic\n- \"Rate limit exceeded\" → Reduce batch size or add delay nodes between API calls\n- \"Sheet not found\" → Verify Google Sheets file sharing permissions and sheet name\n\n### 🚀 Execute workflow\nClick the red \"Execute workflow\" button below to start processing your company data.\nMonitor progress in the execution panel and verify results in Salesforce."
      },
      "typeVersion": 1
    },
    {
      "id": "f5516431-c30a-4724-8304-655f718015ff",
      "name": "Merge existing account data1",
      "type": "n8n-nodes-base.merge",
      "position": [
        336,
        -320
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "advanced": true,
        "mergeByFields": {
          "values": [
            {
              "field1": "Company Name",
              "field2": "Name"
            }
          ]
        }
      },
      "typeVersion": 3.2
    },
    {
      "id": "877f4623-a915-4f7d-a5a9-22f2b595fb9d",
      "name": "Keep new companies",
      "type": "n8n-nodes-base.merge",
      "position": [
        1088,
        -448
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "advanced": true,
        "joinMode": "keepNonMatches",
        "mergeByFields": {
          "values": [
            {
              "field1": "Company Name",
              "field2": "Name"
            }
          ]
        },
        "outputDataFrom": "input1"
      },
      "typeVersion": 3.2
    },
    {
      "id": "9e0815e5-7bc5-4254-8030-c0527c665569",
      "name": "Retrieve new company contacts",
      "type": "n8n-nodes-base.merge",
      "position": [
        1984,
        -448
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "advanced": true,
        "mergeByFields": {
          "values": [
            {
              "field1": "Company Name",
              "field2": "Name"
            }
          ]
        }
      },
      "typeVersion": 3.2
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "9ee52df7-3400-445f-94a6-5b34de249b19",
  "connections": {
    "Account found?": {
      "main": [
        [
          {
            "node": "Set Account ID for existing accounts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Keep new companies": {
      "main": [
        [
          {
            "node": "Remove duplicate companies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet": {
      "main": [
        [
          {
            "node": "Search Salesforce accounts",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge existing account data1",
            "type": "main",
            "index": 0
          },
          {
            "node": "Account found?",
            "type": "main",
            "index": 0
          },
          {
            "node": "Keep new companies",
            "type": "main",
            "index": 0
          },
          {
            "node": "Remove duplicate companies",
            "type": "main",
            "index": 0
          },
          {
            "node": "Retrieve new company contacts",
            "type": "main",
            "index": 0
          },
          {
            "node": "Create Salesforce contact",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set new account name": {
      "main": [
        [
          {
            "node": "Retrieve new company contacts",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "On clicking 'execute'": {
      "main": [
        [
          {
            "node": "Get row(s) in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Salesforce account": {
      "main": [
        [
          {
            "node": "Set new account name",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove duplicate companies": {
      "main": [
        [
          {
            "node": "Create Salesforce account",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Salesforce accounts": {
      "main": [
        [
          {
            "node": "Merge existing account data1",
            "type": "main",
            "index": 1
          },
          {
            "node": "Keep new companies",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge existing account data1": {
      "main": [
        [
          {
            "node": "Account found?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve new company contacts": {
      "main": [
        [
          {
            "node": "Create Salesforce contact",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Account ID for existing accounts": {
      "main": [
        [
          {
            "node": "Create Salesforce contact",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

相关工作流