This workflow corresponds to n8n.io template #9758 — 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 →
{
"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
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Auto-like and repost latest tweets from accounts in Google Sheets Who’s it for
Source: https://n8n.io/workflows/9758/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Managing content for multiple social media platforms manually is time-consuming and error-prone. This workflow automates content creation, image generation, approval flows, and publishing for LinkedIn
AI Posts Content Machine. Uses agent, stickyNote, outputParserStructured, lmChatAnthropic. Scheduled trigger; 28 nodes.
This n8n workflow automates the process of promoting your latest YouTube videos on X (formerly Twitter). It ensures that posts are engaging, concise, and follow platform-specific requirements. Additio
How it works
Instead of manually writing, designing, and posting content, this workflow turns a single Google Sheet row into multi-platform posts plus a custom AI image that matches your message.