{
  "id": "pPwYYgTXLQzH7fv4",
  "name": "Auto Like and Repost X Accounts from Google Sheet",
  "tags": [],
  "nodes": [
    {
      "id": "ef981efc-4d09-4e0d-9af4-a1db3cacc819",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "notes": "Role: Automatic start on a schedule (hourly/daily). Adjust to respect rate limits.",
      "position": [
        16,
        48
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 19
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "6939ccfc-2490-4489-abdb-349d4e5da564",
      "name": "Read accounts from Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "Role: Read target accounts from Google Sheets (column: account_id).",
      "position": [
        240,
        48
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "19pJoBuba1o2PaJlx0inaGnGi45PpxbfB79MMhwLFH4s"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "cc19735b-c69f-42ef-9fa9-73c97813960f",
      "name": "Get latest tweets",
      "type": "n8n-nodes-base.twitter",
      "notes": "Role: Search and fetch each account\u2019s latest tweets. Recommend excluding replies/retweets.",
      "position": [
        464,
        48
      ],
      "parameters": {
        "limit": 10,
        "operation": "search",
        "searchText": "=from:{{ $json['account_id'] }}",
        "additionalFields": {
          "tweetFieldsObject": []
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d6e808b7-31de-409a-87ac-c6d3edbb1649",
      "name": "Like tweet",
      "type": "n8n-nodes-base.twitter",
      "notes": "Role: Like the target tweet ID(s). Support a dry-run toggle for safety.",
      "position": [
        912,
        48
      ],
      "parameters": {
        "tweetId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "operation": "like"
      },
      "typeVersion": 2
    },
    {
      "id": "9e46e0b5-4083-45b2-8cf1-20b172eac5f4",
      "name": "Repost tweet",
      "type": "n8n-nodes-base.twitter",
      "notes": "Role: Repost tweets you just liked. Consider adding a cooldown.",
      "position": [
        1136,
        48
      ],
      "parameters": {
        "tweetId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "operation": "retweet"
      },
      "typeVersion": 2
    },
    {
      "id": "a2f9de77-db50-4656-bd18-1025331adc97",
      "name": "Limit",
      "type": "n8n-nodes-base.limit",
      "notes": "Role: Limit downstream Like/Repost actions. Recommend 1\u20133 in production.",
      "position": [
        688,
        48
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "43b4d64b-5fe4-4fcb-9d40-1b417d03e55f",
      "name": "\ud83d\udfe8 Sticky: Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -688,
        -64
      ],
      "parameters": {
        "color": "yellow",
        "width": 440,
        "height": 464,
        "content": "## Template Overview (Read Me First)\n**Purpose**: On a schedule, read a Google Sheet of accounts and automatically like and repost each account\u2019s latest tweets.\n\n### Requirements\n- X (Twitter) OAuth2 credentials\n- Google Sheets OAuth2 credentials\n\n### Flow\n1) Schedule \u2192 2) Read Google Sheet \u2192 3) Get latest tweets \u2192 4) Limit \u2192 5) Like \u2192 6) Repost\n\n### Tips / Security\n- Never hardcode tokens in nodes. Always use **Credentials**.\n- Respect API rate limits; avoid bursts. Use **Limit** and sensible schedules.\n- Test with a staging account first. Consider a **dry-run** mode.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "09cdabb3-e321-4059-b37b-d97cf09f7f0f",
      "name": "Sticky: Schedule Trigger",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -192,
        -240
      ],
      "parameters": {
        "color": "white",
        "width": 376,
        "height": 280,
        "content": "## Schedule Trigger \u2014 How to use\n- Cadence: hourly/daily. Consider load and rate limits.\n- During testing, you can manually **Execute Workflow**.\n- Running at off-peak hours can help avoid API contention.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e11dfabc-240c-495b-ba51-69213644d793",
      "name": "Sticky: Google Sheets Read",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        208
      ],
      "parameters": {
        "color": "white",
        "width": 360,
        "height": 280,
        "content": "## Read from Google Sheets (account list)\n- Required column: `account_id` (screen name without `@`).\n- Replace `documentId`/`sheetName` with your own sheet values.\n- Optional: `blocked_words`, `last_processed_at` (for future branching).\n- Check node options to match your header row settings.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8597dec7-c6b8-4a3a-aff4-ea16042c59d2",
      "name": "Sticky: Get Latest Tweets",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        -240
      ],
      "parameters": {
        "color": "white",
        "width": 360,
        "height": 280,
        "content": "## Get latest tweets (Twitter)\n- Query example: `from:{{account_id}} -is:retweet -is:reply`\n- Results: 1\u20135 per run. Add `tweet.fields=created_at` to filter by freshness.\n- Mind rate limits; avoid processing many accounts in a short time.\n- Future: add NG word/time filters using IF/Code nodes.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "43745622-5ba2-47ae-b179-4d14f3341228",
      "name": "Sticky: Limit",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        672,
        192
      ],
      "parameters": {
        "color": "white",
        "width": 360,
        "height": 280,
        "content": "## Limit (cap actions)\n- Production recommendation: 1\u20133 actions. Start low-risk.\n- Helps avoid spam flags and account restrictions.\n- Use IF nodes to vary caps by time/day if needed.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "77b8e848-670f-4683-bc96-a86ab5b2cfef",
      "name": "Sticky: Like Tweet",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        -240
      ],
      "parameters": {
        "color": "white",
        "width": 360,
        "height": 280,
        "content": "## Like tweet (Twitter)\n- Like the tweet ID from the previous node.\n- For testing, add a **dry-run** flag with Set + IF to skip actions.\n- Safety: filter by blocked words/language/freshness first.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8ff534fd-3276-4360-9ba7-41809d0115c2",
      "name": "Sticky: Repost Tweet",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1136,
        192
      ],
      "parameters": {
        "color": "white",
        "width": 360,
        "height": 280,
        "content": "## Repost tweet (Twitter)\n- Repost the tweet you just liked.\n- Add a cooldown (seconds\u2013minutes) or time-of-day gates as needed.\n- For brand safety, keep repost filters as strict as Like.\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "ee86cc7d-e83a-4bdb-9a86-667192155fca",
  "connections": {
    "Limit": {
      "main": [
        [
          {
            "node": "Like tweet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Like tweet": {
      "main": [
        [
          {
            "node": "Repost tweet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Read accounts from Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get latest tweets": {
      "main": [
        [
          {
            "node": "Limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read accounts from Google Sheets": {
      "main": [
        [
          {
            "node": "Get latest tweets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}