ChatGPT Ads budgets, deposits and bids finally agree with each other, paused chats pick themselves back up after a top-up, pending approvals take the place of the input box, and automation emails tell you what actually happened
ChatGPT Ads: one set of rules for budgets, deposits and bids
- The minimum daily budget is now the same number everywhere — the campaign form, the deposit dialog, the media plan, the agent and review — with a default of $25. Previously different screens carried their own minimums and could contradict each other.
- A new deposit has to cover at least one day of the daily budget you plan to run, and the dialog tells you the exact minimum before you pay. Processing fees are not counted toward it. Before this, a deposit smaller than a single day's budget was accepted and the account could not actually start.
- Each ChatGPT Ads campaign now has exactly one ad group, and you set the maximum cost per click once, on that ad group; Soku keeps the campaign's bid in step with it. Previously the form promised a click-price cap that was not always sent. Creating an ad group without a bid no longer clears the bid already set on its campaign.
- Images you swap into a campaign are now published at a permanent address instead of a link that expired after 30 minutes, and the campaign list shows live review and delivery status from ChatGPT Ads rather than a day-old copy.
- The Results column and cost per result now count the exact conversion event the campaign is optimized for, and show as unavailable — not zero — when a day's conversion data is incomplete.
- If your plan does not include ChatGPT Ads, the card now says it needs Starter or above and what your current plan still covers, instead of a bare "Upgrade plan" button. The pricing page lists ChatGPT Ads on exactly the plans that include it.
Low-balance pauses that react in minutes, and stay your decision
- The ChatGPT Ads balance check now reads actual spend directly every five minutes and pauses your campaigns once the usable balance is at or below $5. It used to rely on synced spend figures that could be up to a day old, so a balance could run out before anything noticed.
- A pause is confirmed by reading the campaign's status back from ChatGPT Ads, which fixes a case where a successful pause was recorded as a failure.
- Soku no longer switches a campaign back on by itself after you top up. Once a campaign has been paused you may want it to stay paused, and nothing on the ChatGPT Ads side can tell us otherwise — so resuming is left to you.
Back to work after a top-up, and after onboarding
- When you run out of credits mid-task and then buy credits or upgrade, Soku now resumes your most recent interrupted chats automatically (up to five, from the last 72 hours) instead of leaving each one for you to find and click Continue. Automations that were refused before they started are not re-run.
- Automation run history now shows the opening of the run's actual result, says plainly when a run stopped for lack of credits, and puts Open chat on a visible button.
- Finishing onboarding once again lands you in a starter chat that is already working, with all three starter chats in your list — instead of an empty list you had to refresh tens of seconds later.
- Brand Voice analysis during onboarding had been failing for most sites because one imperfect quote threw away the whole profile. Each field is now checked on its own, so a single bad field no longer empties the rest.
- Slow or JavaScript-heavy websites now get scraped properly during onboarding; the retry for those sites had been sending settings the crawler always rejected, leaving an empty brand profile.
- A chat run that finished while its final hand-off failed no longer shows as still running for up to two hours; it is wrapped up straight away.
Approvals are harder to miss and easier to answer
- A pending approval now sits where the message box normally is, so the thing the agent is waiting on is right in front of you. Once you decide, the input comes back and the decision appears in the conversation as a receipt.
- When you decline a paid step, the agent is now told explicitly that it was declined and not run, confirms that in your language, and waits for your next instruction. A later, explicit request from you can start a fresh approval without being asked to reconfirm the earlier refusal.
- One data question no longer produces a string of separate query approvals: the agent drops redundant "does this event exist" pre-checks and submits the queries it already knows it needs as one batch. The approval buttons for SQL now say they cover that exact query, which is what they have always done.
Cleaner chats and deliverables you can trust
- The raw JSON snapshots Soku saves after each data query — kept only so a query does not have to be paid for twice — no longer appear in the chat, the artifacts panel, Settings → Artifacts or automation run results. Your real reports are no longer buried under them.
- The chat agent can no longer overwrite a finished file with an "[omitted]" placeholder, which previously could silently replace a complete deliverable.
- Videos embedded in competitor reports stay inside their column instead of covering the text beside them.
- When you ask for changes to a long image, the agent now keeps a list of every requested change across rounds, asks if a request is ambiguous, and checks each change on the rendered image before saying it is done.
- A run of "The agent stopped unexpectedly" errors after switching to the Lite model on a long conversation is now recovered automatically instead of failing the turn.
- GPT-6 Sol, GPT-6 Luna and Claude Opus 5.5 can now run in both of Soku's agents on Amazon Bedrock. This makes them available for model routing; it does not by itself change which model your chats use.
Research that stays within its evidence
- A PipiSpy request that was rejected but came back looking successful is now reported as a failure, not as "no ads found". An empty ad-library result is no longer treated as proof that a competitor runs no ads, and the agent checks coverage before expanding a paid search.
- Site audits no longer report PageSpeed scores from a failed measurement; failed audits show as unknown.
- When the agent finds that a name you mentioned belongs to a different company, it now points you to the brand switcher or the New brand page so you can move that work to its own workspace.
- The error for Meta music settings now suggests a fix that actually works, and the parameter descriptions in the API and CLI no longer contradict each other.
Notifications written for you, not for us
- Automation completion emails now lead with a one-line conclusion and a few key points distilled from the run, instead of the first 320 characters of the reply. Any figure in the summary is checked against the original report; if it cannot be traced, the email falls back to extracting the report text directly rather than risk an invented number.
- Failure emails no longer show internal error codes; they explain what happened and what to do next. Subject lines, amounts, balance emails and action-review emails were cleaned up the same way, and action-review emails now say what is waiting for approval.
Dashboards and data sync
- The dashboard's CPA and ROAS trend options now appear only when a conversion group is set up to produce them, instead of offering a chart that could only ever say "no data".
- Accounts whose data was already current were sometimes marked as having unknown freshness on the dashboard; that is fixed. First-time syncs that reused existing data no longer stall before completing.
- Meta accounts with very large ads now sync by shrinking each request down to a single ad when needed, and a shared Google account syncs correctly for every organization using it.
- Conversion-group suggestions no longer propose Meta's Initiate Checkout or Add Payment Info as "Payment Success" — the mistake that inflates Meta ROAS. Meta standard events are now placed by event type. Custom actions will be classified by a dedicated model once that is switched on; until then they use the previous name matching.
- Creative analysis no longer re-runs a paid analysis on an asset that failed permanently in the last week, and asking for creative insights on a platform that does not support them returns a clear error instead of an empty result.
Pricing, plans and account
- Monthly billing is now the default on the pricing page and in the in-app upgrade dialog. If you choose yearly, the amount charged today is shown under the button, rather than first appearing on the payment page. The "Limited-time offer" badge, which never had an end date, is gone; "Save 20%" on yearly stays.
- Organization admins can now create and revoke organization API keys in Settings. The secret is shown once and never stored in readable form. These keys are groundwork for server-to-server revenue reporting; nothing accepts them yet.
- The App Install Tracking guide in the SDK docs now separates web-landing-page flows from direct-to-store flows and shows the Adjust and AppsFlyer callback templates Soku actually supports.
- The Connect page no longer briefly shows an expired offer while your account is loading.
X Ads, still staging-only
- Reconnect on the X Ads card now starts a fresh connection, which is what X requires, instead of failing with "Connection failed". X Ads remains limited to staging and is not available to you yet.