Open a campaign from Operate › Campaigns. Every tab shares one live connection to the engine (the campaign socket), so what you see is what the runs are doing right now. If that connection drops, Reconnecting… shows next to the status until it's back (then it catches up on what it missed). The whole dashboard is built from what the flow's nodes declare (stages, stacks, tables, actions, metrics): a new node or script node that declares them shows up with no dashboard change.
Status
The badge by the name is the campaign's own status: Off (not on its schedule, nothing running), Idle (on its schedule, nothing running), Queued (waiting for its turn), Starting (its run is running but no browser is up yet), then Running, Paused and Needs you while a run goes, and Done, Failed or Stopped with the last run's result until the next one starts.
Tabs
| Tab | Shows |
|---|---|
| Overview | The flow's stages lit up live, the Now card, the browser it acts in, today's numbers, its stacks, the latest records |
| Browsers | Every browser its runs use, full size, one tab each, with the account whose own browser it is |
| Records | Rows its nodes wrote (replied posts, earnings), with labels and row actions |
| Charts | Each declared metric per day, runs and AI cost (Include test runs to count test runs) |
| Logs | Every log of its runs, live and saved, each with the account whose browser it happened in; filters by run, account, type, level and text |
| Runs | Its runs (real, test, called flows' own, row actions): how they ended and why, how long, AI cost or tokens |
| Options | The campaign form, and Delete |
Overview
Stages
Hover a stage for its details: status, how often it ran, when it last started, how long it took, the dot it left through, its error and its output. Only the nodes that matter: triggers, effect nodes (Reply), Run flow (Shopee finder), and nodes marked as stages (Collect posts). Colours follow Studio's: green done, the running one pulses, red failed, dashed skipped. A loop back (an endless flow returning to Collect posts) draws a dashed line from the last stage it repeats back round to the first, with a Lap badge on it; the stages wrap to the page width and the arrows turn the corner into the next row; each stage shows how often it ran (×14).
Pressing Stop clears it by itself once the run has ended. Clear (the ↺ button on the stages, or ⋯ › Clear… to also delete runs, records, test data or browsers; see , once the run has ended) starts the Overview fresh: stages, Now, stacks and You stepped in show only runs started after it. The tiles and the latest records count only what came after it (the full Records tab still lists everything), and the page refreshes at once. Clearing runs, records or test data also starts it fresh. Without those, nothing is deleted, and the next run lights the stages up again. It's kept on the campaign (state.clearedAt), so a reload stays cleared.
Now
What the current node does, in one sentence with its data, how long the step has been going, and Watch live (opens Browsers on the browser it acts in). A called flow's steps show here too. The data is one of five cards:
| Card | Example |
|---|---|
post | Reading the timeline: every post found so far, newest first, growing as it scrolls |
product | Searching Shopee for "standing desk": the products as they come in |
list | Choosing from 18 items, then the picks |
text | Affiliate link ready |
image | A screenshot |
Nodes send it with activity({ title, card, data }) ().
You stepped in
The interventions answered while the page is open: what you pressed and after how long (e.g. Sign in to Shopee: "Done" after 41s). Every one is also in Logs (type Intervention).
Up next (stacks)
A node can keep one of its output lists as a stack (stack in its definition). Up next shows only when the running flow has one, with one tab per stack, in the flow's order. For 𝕏 Auto Reply that's three:
| Tab | Node | Holds | You can |
|---|---|---|---|
| Collect posts | x/collect | The posts gathered this lap | Reorder and remove until AI pick reads them, then it's locked |
| Pick posts | ai/choose | The AI's picks, each with Why: | Nothing: read only (it's a decision) |
| Each post | flow/loop | The picks the loop works through | Reorder, remove, Done |
Each tab's line says what it is: the node's type, the lap, and how many are waiting, now, done, passed and removed (a read-only or locked stack: how many items), plus read only or already read by the next step.
States are kept by the engine, not by node code:
| State | Look | Meaning |
|---|---|---|
| Waiting | Normal | Not taken yet. In an editable stack: drag to reorder, Move to top, Remove, Done (never take it), tick several to remove together |
| Now | Highlighted | The item a loop handed out. Done ends it now: the run leaves the step it's on (an effect step, such as Reply, finishes first) and the loop takes the next |
| Done / Passed / Removed | Faded, labelled | Done: the loop came back for the next one, or you finished it · Passed: a new lap replaced it untaken · Removed: by you |
A card looks as its node declares (stack.view: title, text, link, time, note and meta fields). A view left empty takes the card of the stack the item came from, so a pick and a loop item show as the post, with the pick's Why:. Changes apply at once to what later nodes read. Two viewers at once: each change carries the stack's version and a stale one is refused (you get the current stack back). Remove on Collect posts also labels the post removed in the group, so no campaign of the group takes it later.
Accounts
One chip per account in its options, and for 𝕏 and Threads its replies in the last 24 hours (the Reply node's , key <platform>/reply:<account id>). Double-click its name to rename the account (Enter saves, Escape cancels).
Numbers
Today's value of each metric the flow's tables declare (Posts taken, Replies, Commission, Orders), and AI today (cost when the key has prices, else tokens). While the latest run is a test, they count that test's own rows (marked test); replies in a test are simulated, so they stay 0 there.
Waiting for you
Every run waiting for a human shows a banner at the top of every tab. Open shows a dialog with the intervention and, when it's a task done in the browser (a sign in, a captcha), that browser's live view (with control); an approval shows only the decision:
- its title, message, details and steps,
- the last automatic check and why it isn't done ("The QR code is still showing"),
- the node's own buttons (Done, Show QR again, Approve, Reject…),
- Continue anyway when a check failed (the step fails or asks again if it really wasn't done),
- Stop run.
The check runs by itself every few seconds, so the dialog usually closes on its own. Closing it keeps the run waiting; the banner stays until it's done, and the node's time limit applies its on-error setting if nobody answers.
Browsers
Each tab is a browser name (x, threads, shopee…) with the account whose own browser it is (x · Main 𝕏 account). It's that account's profile, signed in once and shared by every campaign and test using the account, so signing in here signs it in everywhere.
Under the tabs: when the account was last signed in (or Not signed in yet), and In use by <campaign> when another campaign or a Studio test holds its browser (this campaign's run waits for it). Double-click the account's name on a tab to rename it.
One tab per browser of the campaign (x, shopee… the names its flow acts in). Tick Live to see its browser: it starts if it isn't up, no run needed (sign in, look around). Take control gives mouse and keyboard. The strip above the view keeps the Now sentence in sight while the run acts in that browser.
When the run waits for you, its browser's tab opens live by itself. Watch live on the Now card opens this tab on the browser the run acts in.
Records and row actions
Each table a node of the flow declares with a view gets a tab: its rows written by this campaign, newest first, filtered by label. A row shows as its table's view says: title, time, the source text it answered (quote), counts (meta) and its own text. Labels in view.hide aren't listed: on 𝕏's posts table a post only shows up once something happened to it (replied, removed, failed), not while it's just claimed by a run. A replied post shows its author, when it was posted, the post's text, its views, likes, replies and reposts (when Collect posts read it), and your reply under it. The Authors tab shows each author replied to: when last, how many replies, the last reply's text and a link to the post it answered. A table can declare row actions. 𝕏's posts table has Delete reply on replied rows:
- You confirm.
- mooflair asks the campaign's engine for the action (
POST /campaign/:id/action). When the engine asks what the run needs, mooflair answers a one-node run (the table's action node:x/reply/delete,threads/reply/delete) with the row's columns as its fields and the row's account acting (the account it was written for, checked like any account pick; a row with none is refused), in that account's browser, as a priority run. - It runs in its own tab beside the campaign's run (the two never act at the same time: an effect step waits for the other's to finish).
- Success labels the row
deleted; a failure opens a dialog with why and the action's log lines (Open logs for the rest).
FAQ
Why is a tab empty?
Browsers needs a run going; Records needs nodes with tables (𝕏 and Shopee have them; your script nodes can declare their own).
Can someone with the dashboard's token see my other flows?
No. The dashboard's engine token is scoped to the campaign: its runs, logs, stats, socket and the browsers its runs use.
Does the dashboard need the page open for the campaign to run?
No. The scheduler and the engine run it; the dashboard only watches and sends your controls.
Are earnings exact?
They're what Shopee's conversion report shows when Earnings report last read it, per day and Sub ID. Shopee confirms commission days later, so recent days can still change.