{
  "name": "Puzzle #56 — Sync Primary (Airtable) → Secondary (Supabase) with Compare Datasets",
  "nodes": [
    {
      "parameters": {},
      "id": "56000000-0000-4000-8000-000000000001",
      "name": "When clicking ‘Execute workflow’",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [0, 240]
    },
    {
      "parameters": {
        "authentication": "airtableTokenApi",
        "resource": "record",
        "operation": "search",
        "base": { "__rl": true, "mode": "list", "value": "" },
        "table": { "__rl": true, "mode": "list", "value": "" },
        "filterByFormula": "",
        "returnAll": true,
        "options": {},
        "sort": {}
      },
      "id": "56000000-0000-4000-8000-000000000002",
      "name": "Primary DB",
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.2,
      "position": [260, 120],
      "notes": "Pick your base (Primary) and table (Table 1) from the lists after import. Airtable node v2.2 outputs { id, createdTime, fields: { Name, Email, Phone Number, Status } }."
    },
    {
      "parameters": {
        "resource": "row",
        "operation": "getAll",
        "tableId": "Secondary",
        "returnAll": true,
        "filterType": "none"
      },
      "id": "56000000-0000-4000-8000-000000000003",
      "name": "Secondary DB",
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [260, 360],
      "notes": "Return All must stay ON. The default limit is 50 rows; anything past row 50 would look missing and be inserted again as a duplicate."
    },
    {
      "parameters": {
        "mergeByFields": {
          "values": [
            { "field1": "fields.Name", "field2": "Name" },
            { "field1": "fields.Email", "field2": "Email" },
            { "field1": "fields.Phone Number", "field2": "Phone Number" },
            { "field1": "fields.Status", "field2": "Status" }
          ]
        },
        "resolve": "includeBoth",
        "options": {
          "skipFields": "id, createdTime, fields, created_at, Name, Email, Phone Number, Status"
        }
      },
      "id": "56000000-0000-4000-8000-000000000004",
      "name": "Compare Datasets",
      "type": "n8n-nodes-base.compareDatasets",
      "typeVersion": 2.3,
      "position": [520, 240],
      "notes": "All four business fields are match keys, so a changed record shows up as In A only (new version) plus In B only (old version), which becomes a replace. Skip Fields stops the different shapes (Airtable nested vs Supabase flat) from sending every matched pair to Different."
    },
    {
      "parameters": {
        "resource": "row",
        "operation": "create",
        "tableId": "Secondary",
        "dataToSend": "defineBelow",
        "fieldsUi": {
          "fieldValues": [
            { "fieldId": "Name", "fieldValue": "={{ $json.fields.Name }}" },
            { "fieldId": "Email", "fieldValue": "={{ $json.fields.Email }}" },
            { "fieldId": "Phone Number", "fieldValue": "={{ $json.fields['Phone Number'] }}" },
            { "fieldId": "Status", "fieldValue": "={{ $json.fields.Status }}" }
          ]
        }
      },
      "id": "56000000-0000-4000-8000-000000000005",
      "name": "Create/Replace Row - Secondary DB",
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [840, 100]
    },
    {
      "parameters": {
        "resource": "row",
        "operation": "delete",
        "tableId": "Secondary",
        "filterType": "manual",
        "matchType": "allFilters",
        "filters": {
          "conditions": [
            { "keyName": "id", "condition": "eq", "keyValue": "={{ $json.id }}" }
          ]
        }
      },
      "id": "56000000-0000-4000-8000-000000000006",
      "name": "Delete Row - Secondary DB",
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [840, 380]
    }
  ],
  "connections": {
    "When clicking ‘Execute workflow’": {
      "main": [
        [
          { "node": "Primary DB", "type": "main", "index": 0 },
          { "node": "Secondary DB", "type": "main", "index": 0 }
        ]
      ]
    },
    "Primary DB": {
      "main": [[{ "node": "Compare Datasets", "type": "main", "index": 0 }]]
    },
    "Secondary DB": {
      "main": [[{ "node": "Compare Datasets", "type": "main", "index": 1 }]]
    },
    "Compare Datasets": {
      "main": [
        [{ "node": "Create/Replace Row - Secondary DB", "type": "main", "index": 0 }],
        [],
        [],
        [{ "node": "Delete Row - Secondary DB", "type": "main", "index": 0 }]
      ]
    }
  },
  "pinData": {},
  "settings": { "executionOrder": "v1" },
  "active": false,
  "tags": []
}
