{
  "name": "Scheduled automation for X and Google Sheets services",
  "nodes": [
    {
      "id": "ef981efc-4d09-4e0d-9af4-a1db3cacc819",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        16,
        48
      ]
    },
    {
      "id": "6939ccfc-2490-4489-abdb-349d4e5da564",
      "name": "Read accounts from Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        240,
        48
      ]
    },
    {
      "id": "cc19735b-c69f-42ef-9fa9-73c97813960f",
      "name": "Get latest tweets",
      "type": "n8n-nodes-base.twitter",
      "position": [
        464,
        48
      ]
    },
    {
      "id": "d6e808b7-31de-409a-87ac-c6d3edbb1649",
      "name": "Like tweet",
      "type": "n8n-nodes-base.twitter",
      "position": [
        912,
        48
      ]
    },
    {
      "id": "9e46e0b5-4083-45b2-8cf1-20b172eac5f4",
      "name": "Repost tweet",
      "type": "n8n-nodes-base.twitter",
      "position": [
        1136,
        48
      ]
    },
    {
      "id": "a2f9de77-db50-4656-bd18-1025331adc97",
      "name": "Limit",
      "type": "n8n-nodes-base.limit",
      "position": [
        688,
        48
      ]
    },
    {
      "id": "43b4d64b-5fe4-4fcb-9d40-1b417d03e55f",
      "name": "🟨 Sticky: Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -688,
        -64
      ],
      "parameters": {
        "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’s latest tweets.\n\n### Requirements\n- X (Twitter) OAuth2 "
      }
    },
    {
      "id": "09cdabb3-e321-4059-b37b-d97cf09f7f0f",
      "name": "Sticky: Schedule Trigger",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -192,
        -240
      ],
      "parameters": {
        "width": 376,
        "height": 280,
        "content": "## Schedule Trigger — 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 content"
      }
    },
    {
      "id": "e11dfabc-240c-495b-ba51-69213644d793",
      "name": "Sticky: Google Sheets Read",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        208
      ],
      "parameters": {
        "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_p"
      }
    },
    {
      "id": "8597dec7-c6b8-4a3a-aff4-ea16042c59d2",
      "name": "Sticky: Get Latest Tweets",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        -240
      ],
      "parameters": {
        "width": 360,
        "height": 280,
        "content": "## Get latest tweets (Twitter)\n- Query example: `from:{{account_id}} -is:retweet -is:reply`\n- Results: 1–5 per run. Add `tweet.fields=created_at` to filter by freshness.\n- Mind rate limits; avoid proc"
      }
    },
    {
      "id": "43745622-5ba2-47ae-b179-4d14f3341228",
      "name": "Sticky: Limit",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        672,
        192
      ],
      "parameters": {
        "width": 360,
        "height": 280,
        "content": "## Limit (cap actions)\n- Production recommendation: 1–3 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"
      }
    },
    {
      "id": "77b8e848-670f-4683-bc96-a86ab5b2cfef",
      "name": "Sticky: Like Tweet",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        -240
      ],
      "parameters": {
        "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"
      }
    },
    {
      "id": "8ff534fd-3276-4360-9ba7-41809d0115c2",
      "name": "Sticky: Repost Tweet",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1136,
        192
      ],
      "parameters": {
        "width": 360,
        "height": 280,
        "content": "## Repost tweet (Twitter)\n- Repost the tweet you just liked.\n- Add a cooldown (seconds–minutes) or time-of-day gates as needed.\n- For brand safety, keep repost filters as strict as Like.\n"
      }
    }
  ],
  "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
          }
        ]
      ]
    }
  }
}