Template id: threads/publisher · Requires: shopee/finder (only runs with Shopee on) · Trigger: Manual · Flow timeout: none (runs until you stop it)
Threads Auto Post: posts threads again and again from what people post now (the AI writes a hook and replies), or from a post set (as it is, or reworded). Shopee affiliate: off, or a product (the AI's pick, one of your keywords, or one of your links) with the link in the post, a reply, or a reply once the thread has enough views. Brand, persona, topic and media are options. Review: it approves by itself after the wait unless you set it to wait for you.
What you need
- A Dataset › Account with platform Threads.
- A Dataset › AI key.
- A Dataset › Account with platform SHOPEE, only with Shopee
moodorkeyword(thelistsource uses your own links). - Optional: a post set, a Files folder for media, your brand in Settings › Brand.
- To run it with other accounts or on a schedule, publish it and create a campaign.
What shows when
The campaign form shows a section, a group and an option only when your earlier choices need it:
| You choose | It shows | It hides |
|---|---|---|
Post from timeline | where to read, writing, media, Brand and Voice | the post set |
Post from set | the post set (posted as it is) | writing, media, Brand, Voice |
Post from rewrite | the post set, writing, Brand and Voice | media |
Promote mood / keyword | the Shopee account, what to promote (mood) or your keywords, how to promote, where the link goes | — |
Promote list | your product links, how to promote, where the link goes | the Shopee account |
Brand in this campaign none | Persona | every other brand option |
Brand in this campaign official | the link and focus (the post speaks as your brand) | Persona |
Brand in this campaign mention | when to mention it, at most, the link, focus, disclosure, Persona | — |
When nobody answers approve / reject | how long it waits for you | — |
Options
Set these in Settings › Options (or on each ), shown on the campaign form by section (its side nav) and group (a card). An option shows only while its section's, group's and own Shown when hold; a hidden one runs with its default. Every value may be a template, e.g. {{ random:20,40 }} (switches and account pickers stay fixed):
| Section › Group | Key | Kind | Default | What it is | Shown when |
|---|---|---|---|---|---|
| Accounts › Accounts | account.threads | account (THREADS) | — | Threads account: Posts as this account, in the campaign's browser. | |
| Accounts › Accounts | account.ai | AI key | — | AI key: Writes, picks and checks. | |
| Content › Source | content.source | choice: timeline, set, rewrite | timeline | Post from (timeline: The AI reads the timeline and writes its own post. · set: Posts from Dataset › Posts, word for word. · rewrite: Posts from Dataset › Posts, reworded a little.) | |
| Content › Source | timeline.source | choice: home, following, search, profile | home | Read from | content.source = timeline |
| Content › Source | timeline.query | list | — | Searches, lists, groups or profiles: One per row: a search, a List or group link, or @someone. | content.source = timeline; timeline.source = search / profile |
| Content › Source | timeline.language | text | — | Post language: e.g. id, en (empty: any). | content.source = timeline |
| Content › Source | timeline.max | number | 20 | Posts to read: How many it reads each time. | content.source = timeline |
| Content › Source | set.id | post set | — | Post set | content.source = set / rewrite |
| Content › Source | set.order | choice: shuffle, name.asc, name.desc, date.asc, date.desc | shuffle | Order | content.source = set / rewrite |
| Content › Source | set.repeat | choice: unique, rotate | unique | When all are posted |
The flow
flowchart LR
productSwitch["Which product?"] -- fallback --> noProduct["No product"]
productSwitch["Which product?"] -- mood --> keywordAi["The AI's keyword"]
productSwitch["Which product?"] -- keyword --> keywordList["One of your keywords"]
productSwitch["Which product?"] -- list --> pickList["One of your links"]
keywordAi["The AI's keyword"] -- next --> finder["Find on Shopee"]
keywordList["One of your keywords"] -- next --> finder["Find on Shopee"]
finder["Find on Shopee"] -- next --> found["Found a product?"]
finder["Find on Shopee"] -- error --> pause["Wait for the next post"]
found["Found a product?"] -- true --> productFound["The product"]
found["Found a product?"] -- false --> pause["Wait for the next post"]
productFound["The product"] -- next --> product["Product"]
pickList["One of your links"] -- next --> productList["The linked product"]
productList["The linked product"] -- next --> product["Product"]
noProduct["No product"] -- next --> product["Product"]
signin["Sign in"] -- next --> postWait["Wait for a post slot"]
postWait["Wait for a post slot"] -- next --> source["Post from?"]
source["Post from?"] -- timeline --> timeline["Open timeline"]
source["Post from?"] -- fallback --> next["Next post"]
timeline["Open timeline"] -- next --> trend["Read posts"]
trend["Read posts"] -- next --> like["Like a post"]
like["Like a post"] -- next --> fromFeed["From the timeline"]
fromFeed["From the timeline"] -- next --> brief["What it posts from"]
next["Next post"] -- next --> fromSet["From the post set"]
next["Next post"] -- empty --> usedUp["Every post went out"]
fromSet["From the post set"] -- next --> brief["What it posts from"]
brief["What it posts from"] -- next --> ideaIf["The AI picks it?"]
ideaIf["The AI picks it?"] -- true --> idea["Pick a product"]
ideaIf["The AI picks it?"] -- false --> productSwitch["Which product?"]
idea["Pick a product"] -- next --> productSwitch["Which product?"]
idea["Pick a product"] -- invalid --> pause["Wait for the next post"]
writeSwitch["Who writes it?"] -- timeline --> writeFeed["Write the post"]
writeSwitch["Who writes it?"] -- rewrite --> writeSet["Reword the post"]
writeSwitch["Who writes it?"] -- fallback --> linkIf["Link in the post?"]
writeFeed["Write the post"] -- next --> written["The AI's text"]
writeFeed["Write the post"] -- declined --> pause["Wait for the next post"]
writeFeed["Write the post"] -- invalid --> pause["Wait for the next post"]
writeSet["Reword the post"] -- next --> written["The AI's text"]
writeSet["Reword the post"] -- declined --> pause["Wait for the next post"]
writeSet["Reword the post"] -- invalid --> pause["Wait for the next post"]
written["The AI's text"] -- next --> guard["Check it"]
guard["Check it"] -- pass --> checked["The checked text"]
checked["The checked text"] -- next --> draft["The text"]
guard["Check it"] -- fail --> pause["Wait for the next post"]
linkIf["Link in the post?"] -- true --> asIsLink["The post with the link"]
linkIf["Link in the post?"] -- false --> asIs["The post as it is"]
asIsLink["The post with the link"] -- next --> draft["The text"]
asIs["The post as it is"] -- next --> draft["The text"]
draft["The text"] -- next --> mediaSwitch["Which media?"]
mediaSwitch["Which media?"] -- set --> mediaSet["The set's media"]
mediaSwitch["Which media?"] -- folder --> mediaNext["Next media"]
mediaSwitch["Which media?"] -- pick --> files["Files in the folder"]
mediaSwitch["Which media?"] -- fallback --> mediaNone["No media"]
mediaNext["Next media"] -- next --> mediaFolder["The folder's media"]
mediaNext["Next media"] -- empty --> mediaNone["No media"]
files["Files in the folder"] -- next --> mediaChoose["Pick the files"]
mediaChoose["Pick the files"] -- next --> mediaPick["The AI's files"]
mediaChoose["Pick the files"] -- none --> mediaNone["No media"]
mediaSet["The set's media"] -- next --> media["Media"]
mediaFolder["The folder's media"] -- next --> media["Media"]
mediaPick["The AI's files"] -- next --> media["Media"]
mediaNone["No media"] -- next --> media["Media"]
media["Media"] -- next --> compose["The post"]
compose["The post"] -- next --> approval["Approve post"]
approval["Approve post"] -- approve --> post["Post"]
approval["Approve post"] -- reject --> pause["Wait for the next post"]
post["Post"] -- duplicate --> pause["Wait for the next post"]
post["Post"] -- limited --> postWait["Wait for a post slot"]
pause["Wait for the next post"] -- next --> postWait["Wait for a post slot"]
post["Post"] -- next --> followup["Post held replies that are due"]
followup["Post held replies that are due"] -- next --> pause["Wait for the next post"]
followup["Post held replies that are due"] -- none --> pause["Wait for the next post"]
product["Product"] -- next --> brandGate["Brand this time?"]
brandGate["Brand this time?"] -- next --> brand["Brand"]
brandGate["Brand this time?"] -- limited --> brandOff["Not this time"]
brandOff["Not this time"] -- next --> brand["Brand"]
brand["Brand"] -- next --> writeSwitch["Who writes it?"]
manual["Manual"] -- next --> brandCheck["Brand set?"]
brandCheck["Brand set?"] -- true --> brandStop["No brand"]
brandCheck["Brand set?"] -- false --> signin["Sign in"]
Nodes
| Id | Node | Type | Key values |
|---|---|---|---|
manual | Manual | trigger/manual | |
signin | Sign in | threads/signin | account: {{ option.account.threads }}, on error ask a human |
postWait | Wait for a post slot | flow/wait | mode: limit, limit.key: threads/post:{{ option.account.threads }}, limit.mode: {{ option.pace.limit.mode }}, limit.window: {{ option.pace.limit.window }} |
source | Post from? | flow/switch | mode: rules, index: , isAll: false, fallback: dot, isIgnoreCase: false, isLoose: true |
timeline | Open timeline | threads/timeline | source: {{ option.timeline.source }}, query: {{ option.timeline.query }}, latest: true, on error ask a human |
trend | Read posts | threads/trend | account: {{ option.account.threads }}, max: {{ option.timeline.max }}, recent: 10 |
like | Like a post | threads/like | enabled: {{ option.like.timeline }}, target: timeline, chance: 30, max: 1 |
fromFeed | From the timeline | data/set | mode: field, include: none, isDot: true, isLenient: true, isFile: false |
next | Next post | data/post | source: set, set: {{ option.set.id }}, order: {{ option.set.order }}, repeat: {{ option.set.repeat }} |
usedUp | Every post went out | flow/stop | end: succeeded, message: , type: |
fromSet | From the post set | data/set | mode: field, include: none, isDot: true, isLenient: true, isFile: false |
FAQ
How do I post without Shopee?
Leave Promote off (the default). It posts about what people post now, or your post set, and asks for no Shopee account.
Can it post my own ready-made posts?
Yes. Put them in a and set Post from to set (as they are) or rewrite (reworded by the AI).
Where does the Shopee link go?
Where Where the link goes says: in the post, in a reply under it, or in a reply once the thread has enough views. Out of the post, the AI writes the post without any URL.
Can it use my brand?
Yes. Fill in Settings › Brand once (), then pick Brand in this campaign: official (the account is your brand and speaks as it) or mention (a persona brings it up where it fits or every time, at most as often as At most allows, with your disclosure). none leaves the brand out. A campaign that uses the brand while the workspace has none stops with “set it in Settings › Brand”.
Does it post during a test run?
No. Post, Like and the link comment are effect nodes: a test run logs what they would do and returns a simulated result.