How the run works
An active group re-solves every night just after midnight, shop time, and writes the result to the platform. Saving the group's settings also produces a run immediately, so you see the effect before you walk away.
What happens on a run
- The group's exact settings and membership are frozen for that run, so an edit mid-run cannot corrupt it.
- The solver jointly chooses the split under your objective, constraint and distribution, inside whichever budget layers apply to that date. A group with no budget set also chooses its own total from the model's forecast.
- Budget cuts go out first. Increases are sent only once every cut has landed, so the applied vector never crosses your ceiling in the gap between the two writes.
- A campaign allocated less than the platform minimum is paused for the day rather than underfunded.
- Manual campaigns also receive a target ROAS derived from your constraint or the date's own setting.
- Small moves are skipped — under ฿1 of budget change, or under 0.05× of target-ROAS change, nothing is written. It saves a pointless platform call and a pointless audit row.
A campaign you have paused on the platform yourself is never overwritten — neither budgets nor targets move on it until you resume it. Its allocation shows as stranded in the allocation panel.
Reading a run
Every run carries two statuses, because solving and pushing are different jobs.
Solve — did the optimizer produce an allocation?
| Status | Meaning |
|---|---|
| Solved | An allocation was produced |
| Solving | Still running |
| Infeasible | No split satisfies the constraint. Loosen it, or raise the budget |
| Failed | The solve did not complete. The next run retries |
| Superseded | A newer run replaced this one before it finished |
Push — did it reach the platform?
| Status | Meaning |
|---|---|
| Applied | The whole allocation reached the platform |
| Partial | Some campaigns landed, some did not |
| Uncertain | The platform's answer never arrived. DataGlass checks before rewriting |
| Pending / Applying | Queued, or in flight |
| Failed | The write did not complete |
| Not pushed | A preview — computed, never sent |
The header above the tabs summarises the same thing in one line: "Last nightly run {time} — budgets written to Shopee. Runs again tonight just after midnight."
Run history
The Run history tab lists every attempt, newest day first, with its trigger, its solve status, its push status and the Group Daily Budget it worked to. Triggers are:
| Trigger | When |
|---|---|
| Scheduled | The nightly run |
| Saved | You saved the group's settings |
| Model ready | Training finished and the group re-solved against the fresh model |
| Preview | Computed for you to look at, never sent |
Select a run to see the allocation it produced, campaign by campaign: what each was on (Was), what the run set it to (Set to), and the expected orders and expected profit behind the decision.
Preview vs live
A paused group still computes an allocation — it just does not apply it. Use that to see what a setting change would do before committing. Only Auto Bid on makes runs actionable.
The allocation panel on Global settings does the same thing for an unsaved change: the bar is what the policy proposes, the ghost behind it is today's, and nothing reaches the platform until you save.
One month at a time
The optimizer solves a month, and the split within it a day at a time. So a date the month plans but that no solve has reached yet shows a planned amount with no per-campaign split — that arrives when a solve reaches the day.