Soku AI

Changelog

Product updates that matter to marketing teams using Soku.

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.

Paid calls can no longer add up past your approval, a provider error stops telling you to top up when it has no idea, approval cards show up even when the chat has moved on, and the X Ads engine starts reading its numbers back

Your approval means what it says

  • Small paid vendor calls in the Cloudflare chat could previously stack up one under the review threshold at a time until the total was well past what you had agreed to. Soku now counts everything already charged and everything still reserved on that conversation before it admits the next paid call, so the cap applies to the running total rather than to each call in isolation.
  • An invalid PipiSpy request used to reach you as a 2,000-credit approval card for work that could never have run correctly. Requests are now checked against the operation's own parameter rules first, and a malformed one is refused before it can ask you for credits.

Errors that say what is actually known

  • When a data provider returns a payment-required error, Soku no longer decides on its own that your balance is exhausted and tells you to top up. It reports what it actually observed, says plainly that a status code alone does not establish a quota or balance problem, and gives different recovery steps depending on whether the connection is one you own or one the platform manages.
  • Error banners, toasts and inline messages across chat, imports and OAuth, skills, automations, settings and Remix no longer leak raw backend exceptions, HTTP statuses or internal identifiers. Known problems keep their specific guidance; everything else gets readable wording, and the diagnostics stay in the logs where they belong.

Approvals you can still answer after the conversation moves

  • An approval card used to be drawn underneath the tool call that raised it, so if that call was no longer in your copy of the transcript — after a rewind, a branch switch or a cleared history — the card had nowhere to appear and the agent sat waiting for an answer you had no way to give. Any pending review that cannot be placed now appears at the end of the conversation with its decide buttons, the same way the sandbox chat has always handled it.

X Ads, still staging-only

  • The X Ads engine now reads its own writes back, names the campaign or ad group on the approval card instead of showing an opaque id, and only invalidates a stored token when X has actually proven it dead rather than on any failure.
  • X Ads entities, daily metrics and funding finance are now ingested, so once the platform is switched on the reporting is there rather than arriving later.
  • Reddit Ads and X Ads are turned on in staging so their connect flow and settings cards can be exercised against real accounts. Production is unchanged and neither platform is available to you yet — this is groundwork, not a launch.

The agent reads its own instructions properly

  • Skills that require a companion skill now return both together in one step instead of making the agent go and fetch the second one in a separate round trip — faster answers, and a budget rule that arrives before the spend rather than after it.
  • Long skill instructions are no longer cut through the middle. Forty-eight of the bundled skills are long enough that the agent had been following their opening and closing steps and improvising the part in between; the body now stays whole.
  • The guard that withholds prompt-injection attempts hidden inside automation results now matches plural phrasings and Chinese-language instruction-override and credential-disclosure phrasings, which is how these attempts are usually written.

Reddit Ads lands and the X Ads engine arrives behind a switch, Performance Max campaigns deploy with their extensions and tracking, the edge chat can finally read what you attach, and credit spend is itemised per chat

Two more ad platforms, and more ways to report on the ones you have

  • Reddit Ads is connected: Soku ingests your Reddit ad accounts, campaigns, daily metrics and account credit, built against Reddit's official API rather than a guess at it.
  • The X Ads engine has landed behind a master switch. The engine is in place; connecting accounts and pulling numbers is still being rolled out, so nothing changes for you until it is turned on.
  • Adjust reporting can now run through an Adjust API token, not only through MCP — so a workspace that cannot use MCP can still get mobile-measurement numbers.
  • Two more integration cards are live: the AIsa Tool Router and CloudX.

Performance Max campaigns ship complete instead of half-built

  • When Soku deploys a Performance Max campaign it now applies the sitelinks, callouts, structured snippets and ad schedule with it, and sets the tracking template and suffix — the pieces you previously had to go back into Google Ads and add by hand.
  • Performance Max creative generation produces two differently composed images per aspect ratio instead of one, and exports square and wide logo assets sized for the placement rather than leaving them to upload later.
  • Meta ad videos are fetched through the Batch API, replacing a call Meta had deprecated.
  • Campaign geo-target snapshots are checked before they are saved, so a malformed target cannot land in a campaign.

The edge chat can actually read what you attach

  • Attachments are now evidence you can search rather than a wall of flattened text: documents can be inspected page by page with real coordinates back to the source, and PowerPoint, TSV, XML and YAML, common code files, bounded text archives, audio and video are all readable.
  • The model is told where your file actually sits in its sandbox, so it can run a command across a spreadsheet instead of reading it one page at a time.
  • Attachment previews, the reason an upload was refused, and the entry a refusal points at now look the same on every chat surface — and a file whose type is spelled unusually is no longer rejected for it.

Replies that used to disappear, stop disappearing

  • A long research turn no longer ends silently with nothing to show for it.
  • Reopening a conversation no longer blanks out a reply that had finished — the reply was always saved, it just was not being shown.
  • The chat connection survives its own credential refresh, so a turn still running is no longer drawn as finished for a few seconds while you could send another message into it.
  • A sandbox command that times out is stopped instead of blocking everything else in your brand, and a conversation can no longer be locked permanently by where its cache checkpoint fell.
  • If you run out of credits mid-turn, the work is kept and the chat picks up where it stopped once you top up.

Canvas video editing and export

  • You can edit a video on the Canvas, preview it, and export it as an MP4.
  • Canvas cards no longer stack on top of one another in the chat side panel.

You can see, and control, what you are spending

  • Billing breaks credit spend down by chat and by question, and spend from the edge chat is attributed to the chat that actually spent it.
  • Topping up returns you to the task you were interrupted on instead of dropping you in billing settings.
  • A spend approval now applies only to the call it was raised for and counts against that route's cumulative budget, and asynchronous receipts are waited for so a paid operation is not run twice.
  • Outstanding credit debt survives a subscription refresh, depleted balances on legacy ad accounts are monitored, and a refusal explains which limit you hit instead of a bare error.

Account and workspace

  • You can change your own sign-in email: the code goes to the new address, every session is revoked when it is confirmed, and the old address is told it happened.
  • Community skills can be sold, with creator earnings tracked separately from credits.
  • Automations belonging to paying customers who have gone idle are paused — after the owner has been warned and told the date.
  • Automation attaches the files it generated before it writes the summary about them, and a report that never rendered is no longer delivered as though it had.

The edge chat asks before it spends your money, attachments behave like they do everywhere else, ad writes have to prove they landed, and a reconnect prompt instead of a dead Google export

Nothing third-party gets bought without you saying yes

  • When the edge chat is about to call a paid third-party service or generate on the Canvas, it now stops and asks first — and it asks whenever the spend crosses the confirmation threshold or cannot be priced up front, rather than only when it happens to know the number.
  • What you approve is what runs. Approving 20 records no longer executes 80, and someone else in your brand can no longer approve spend on behalf of the person who started the run.
  • Each approval, the supplier call it authorized, and how it settled are recorded separately, so a charge can be traced back to the click that allowed it.

Attachments in the edge chat behave the way they do in every other chat

  • A file is read at the moment you confirm the upload, so a file the model cannot read is marked as an error on its own row instead of taking the whole turn down with it.
  • Files you attached earlier in a conversation stay visible to the model later in it.
  • Which upload types you get is decided by the runtime of the chat you are in, not by your brand's current setting — so a conversation you already have open does not change shape underneath you when a rollout moves.

Ad changes have to show their work

  • A write to an ad platform now has to read the target back and produce pacing evidence before it reports success, so a change that silently failed to apply is no longer reported as done.
  • Dashboard reporting snapshots stay fresh across a laptop sleeping and waking, instead of serving a stale snapshot or erroring once the tab came back.

Fewer dead ends

  • A Google permission error now tells you to reconnect the integration, and hands you a downloadable file as a fallback, instead of surfacing a raw scope failure.
  • Onboarding retries the transient failures it used to treat as permanent, so a first run that hit a blip no longer leaves the account stuck.
  • More headroom for settling free-tier metrics, which is what was behind some accounts seeing usage take a while to reconcile.
  • The notifications dialog has a real width and a minimum height, so it no longer opens as a sliver.

Files in the edge chat, three more data connections plus forty Connect source pages, reconnecting an integration stops erroring, and a run of ad-account numbers that were quietly wrong

The edge chat takes your files now — and can go and find things

  • You can attach files in the chat composer and the models actually read them, instead of the attachment being accepted and then ignored. Upload, linking and serving are one path now, so a file you attach early in a conversation is still there later in it.
  • The same chat gained web search, social scraping and automations, so a question that needs something from outside your connected accounts no longer dead-ends.
  • Creatives can be published straight from the Context Hub, and an artifact opens fullscreen instead of being read through a preview pane.
  • Conversations get titles written by the model rather than the first line of your message, and a new conversation now nudges you toward asking what Soku can do — which is a better first question than most people's first question.
  • Every installed skill is listed, a skill's description survives being loaded instead of being dropped on the way in, and a turn that is still running stays visible while the composer is released back to you.

Three more data sources you can connect with your own account

  • ThinkingData, for customer-hosted product analytics, connects with your own credentials and stays on your instance.
  • Sensor Tower market intelligence connects with your own token, so competitive and market data arrives under your own entitlement rather than a shared one.
  • AppGrowing is available again after a period of being unavailable.
  • AppMagic and CloudX are registered with their cards not yet switched on, so they appear when they are actually usable rather than appearing and failing.
  • All of these are bring-your-own-key: the data is read under your account, and revoking the credential ends the access.

Forty new Connect pages, and an A–Z index

  • Every data source Soku can connect to now has a page explaining what it is, what Soku reads from it, and what you need before connecting — five ad platforms, fifteen account sources, and twenty vendors Soku supplies itself.
  • There is an A–Z index across all of them, so you can check whether something is supported without opening Settings.
  • The integrations navigation was reorganised into a single taxonomy, so the same source is not filed under two different names depending on where you arrived from.

Reconnecting an integration used to fail with a server error. It does not now.

  • Reconnecting PostHog, Google or Stripe could return a server error instead of reconnecting. The cause was the same in all three: the credential was inserted before checking whether one already existed. It now looks first.
  • An OAuth failure caused by having no account on the other side is reported as that, rather than as an opaque trace ID.
  • The Composio catalog no longer lists toolkits that duplicate a first-party connection, so there is one obvious card per source instead of two that behave differently.
  • New Google Tag Manager connections are paused pending OAuth approval, rather than letting you connect into something that would not have worked.

Numbers that were wrong, and are not any more

  • ChatGPT Ads funding is debited by the spend Soku actually synced rather than by the upstream billing figure, so the balance you see matches the spend you can see.
  • The ChatGPT Ads campaign list is served from the campaign table itself, so a campaign that exists shows up.
  • The dashboard stopped reporting a cache mismatch after a 30-day sync when nothing was actually mismatched.
  • Supplier balance polling works again — a Foreplay parsing bug and unretried rate limits had stalled it — and when a vendor balance check does fail, the card names which vendor and lets you flag its owner directly instead of failing as one undifferentiated block.
  • Saving a campaign no longer blocks on conversion events you did not change, shared sync claims recover instead of stranding, and Reddit campaign edits are read back and named on the approval card so you can see what you are approving.
  • When the agent parks because it is out of credit, the top-up link is shown every time rather than sometimes.

Reports and reading

  • HTML reports are produced by a dedicated delivery step, which makes a long report less likely to be cut short by whatever else the agent was doing.
  • Reports went back to the editorial default after briefly rendering with the wrong one, and they no longer pull fonts from a CDN — so a report looks the same offline, in an email client, and six months from now.
  • In chat: a single line break renders as a line break, citations open when you click them, and when two brands could match what you asked, Soku asks which one you meant instead of picking one.

Two publisher-side revenue integrations, Reddit Ads arrives in Settings, the assistant stops guessing what Soku can do, creator tracking links, and a long list of ad-account fixes that were quietly returning the wrong number

AdMob and AppLovin MAX: the money coming in, next to the money going out

  • Soku has always read the ad accounts you spend from. It now also reads the two big publisher-side networks you earn from, so monetization and acquisition can be looked at in the same place instead of in two different tabs.
  • Google AdMob connects with your Google account — pick the apps you want to share and Soku can answer questions about inventory setup, mediation, and daily monetization and campaign reporting. You choose apps one at a time, and reporting stays inside exactly the apps you granted; connecting a publisher account does not hand over everything under it.
  • AppLovin MAX connects with a Report Key and answers revenue questions across accounts and apps. It is deliberately a separate connection from advertiser-side AppLovin, because the two keys are not interchangeable and pretending otherwise would fail in confusing ways.
  • Both are read-only. Neither can change a campaign, a bid, or an ad unit.

Reddit Ads: connect card, account selection, and plan counting

  • Reddit Ads now has a connect card in Settings → Integrations with the same account-selection hand-off as the other ad platforms, so a Reddit connection spanning several businesses lets you pick which ad accounts each brand actually gets.
  • Reddit ad accounts count toward your plan's ad-account limit the same way every other platform does, so the number on your plan page matches what you have actually connected.

The assistant now knows what Soku can do — and can be measured on it

  • Ask the assistant whether Soku can do something and the answer used to be inferred from whichever tools happened to be in reach. That produced confident wrong answers: quoting an external model for an edit the Creatives canvas already does, calling social data unavailable because no social account was connected, or telling you to connect ChatGPT Ads, which has no connect flow.
  • There is now one published capability map covering every surface, which asks route to which surface, and what each one needs first — a connection, an opened account, a paid plan, or a Labs opt-in. The assistant reads from that map instead of guessing, and there is now a test that checks the answers rather than trusting them.

Chat and the canvas are the same assistant now, and asking you something no longer eats your draft

  • Chat and the Creatives canvas ran on separate runtimes that drifted apart. They now share one, so the canvas gets the same reasoning model as chat and behaves the same way on long-running work.
  • When the assistant needs a decision from you it replaces the input box with a question card — multiple questions, a recommended option where there is one, your own answer if none fit, and skip or go back. Whatever you had half-typed is still there when you are done.
  • Chat no longer drops into a reconnect loop or a skeleton screen when its session ticket refreshes, and a conversation you were reading stays on screen while it recovers.

Creator tracking links at soku.ai/c/{slug}

  • Creators can publish a short soku.ai/c/ link in a video description or comment, and the traffic it brings arrives tagged to that creator — so one creator's results can be told apart from another's instead of landing in one undifferentiated bucket.
  • The whole set is managed from the admin console.

Ad-account reporting: several numbers that were quietly wrong

  • Meta conversion distribution no longer backfills a legitimate zero from an engagement event into the headline figure, which had the effect of understating conversions on accounts that run engagement campaigns.
  • Google acquisition claims are now bounded by day rather than spilling across days, and safe Google delivery diagnostics are retained instead of being dropped, so a delivery problem keeps its explanation.
  • Managed campaigns that had gone missing from the campaign list come back, conversion event values persist rather than resetting, and Meta interest targeting accepts ISO country codes and validates interests by id — so a valid audience stops being rejected.
  • Meta creative patches no longer fail their read-back when Meta returns its own platform defaults, and an ad account's access health is tracked on its own rather than being dragged down by an unrelated account on the same connection.

Recovery and guidance fixes

  • A Brand Voice analysis that failed can be recovered instead of being stuck, an automation run blocked by a disconnected integration now points at Integrations and the pause options rather than failing silently, and a starter interrupted mid-run is picked back up by the scheduler.
  • A file that ships without an attachment now links to the Files surface so you can still get to it, and subscription cancellation guidance points at the Stripe billing portal, which is the thing that actually cancels.
  • A metrics locking order was unified to fix a sync deadlock introduced in 3.17.0 — accounts affected by it were not receiving fresh data.

A workspace for how AI assistants see your brand, a community skill catalog, ChatGPT Ads campaigns on managed launch with a real balance answer, stalled ad accounts that finally say so, and GPT Image 2.5 on the canvas

SEO & GEO is now a workspace you come back to, not a one-off answer in chat

  • Asking how AI assistants describe your brand used to be a question you asked the assistant once and then lost. There is now a dedicated SEO & GEO workspace, opened from a new Ads / SEO & GEO switcher in the sidebar, available as a Labs opt-in.
  • A Visibility dashboard tracks how often your brand comes up for the prompts you care about, fed by sampling that runs on a schedule rather than only when you ask. A Citations view shows which sources those answers lean on.
  • Reports are durable, and a candidate prompt you find interesting in a report can be promoted into ongoing monitoring instead of being re-run by hand.
  • SEO Hosting has moved up to a first-level Sites entry rather than sitting inside another page.

Publish a skill your team wrote, and install one someone else wrote

  • Until now a skill you built lived only in the brand that created it, and the only way to share one was to get it into the official catalog. You can now publish a private skill to a community catalog that every brand can browse.
  • Before installing anything you get the full SKILL.md expanded by default, plus a clear community-provided, unreviewed marker — community skills are not vetted by us, and the page says so rather than implying otherwise.
  • Authors can take their own skill down, and official and community skills sit in the same grid with an author line so you always know which is which. Attribution shows the publishing organization, not an individual.

ChatGPT Ads: campaigns go through managed launch, and the balance question has a real answer

  • ChatGPT Ads campaigns created in chat now run through the same campaign draft and managed launch lifecycle as the dashboard, so a campaign you started in conversation is the same object you can open, review, and version in the dashboard.
  • Asking the assistant how much is left in a ChatGPT Ads account now returns your actual available funding and funding status, drawn from the same ledger as the Finance overview on the Integrations page — rather than the previous answer, which was that no such figure was available.
  • The assistant can also now explain the balance monitoring that was already running: a background check every 30 minutes that pauses campaigns when the balance runs out, resumes them when it is topped up, and warns before it gets there. Previously it would tell you no such monitoring existed, which was simply wrong.
  • Campaign destinations for live ChatGPT Ads campaigns are documented in the in-product help.

An ad account that has quietly stopped syncing now tells you, and tells you what to do

  • Ad accounts can be held back by the metrics pipeline while still showing as connected with valid credentials — which meant an account could go weeks without new data while the dashboard showed a green, synced state. The only hint was two sentences buried in a dialog on the Integrations page.
  • That hold is now surfaced in the four places you already look: the dashboard account selector, the sync-needs-attention panel in the header, the platform card on Integrations, and the manage dialog.
  • Each reason gets the action that actually fixes it: a Meta permission gap offers a reconnect, a Google permission gap sends you to grant access in Google Ads (where reconnecting does not help), and a deactivated Google account tells you to wait for the automatic re-check rather than offering a button that would do nothing.

The creatives canvas gets live links you can see, and GPT Image 2.5

  • When an agent was working on your canvas through a live link, you saw things move with no explanation and no way to ask who else could see it. The canvas header now shows a presence indicator — how many links are open, where they came from, and a way to revoke them.
  • You can also issue a live link yourself from the existing share dialog, rather than needing a connected agent to do it.
  • GPT Image 2.5 is available on image and composition nodes. It is the cheapest OpenAI route on the canvas: the same 1024x1024 high-quality output costs about a quarter of GPT Image 2, taking a composition from 236 credits down to 57.
  • The default model has deliberately not changed — GPT Image 2.5 has no aspect-ratio field and half the reference-image limit, so switching the default would change output shape and cost for existing canvases.

Connections, consent, and platform APIs

  • The MCP consent screen now uses Soku's own sign-in chrome instead of looking like a different product mid-flow.
  • Connect consent and Live Surface user flows have been repaired, and the older Connect scope authorization mechanism has been removed in favour of the current one.
  • Meta integrations have moved to Graph API v26 with the migration verified by reading the data back, and Meta targeting is now validated against API compatibility before a campaign write.
  • TikTok account statuses are mapped correctly, and suspended accounts are admitted to sync rather than being dropped — so a suspended account shows its real state instead of disappearing.
  • A Google Ads recommendation was reading an invalid impact field; it now selects the correct one.

Correctness and reliability fixes you would have noticed

  • Ad edits are preserved and budgets are currency-correct rather than being reinterpreted in the wrong denomination.
  • A spend card that had been used up no longer retires its route for the rest of the session, and you can now end the spend questions for one vendor within a single chat instead of being asked repeatedly.
  • Campaign ID filters are chunked below the CDN request-line limit, so large accounts no longer fail a request purely on URL length.
  • Reports respect the format and custom HTML design you chose, and report links use the https Soku URL with the confidentiality notice pointing at the right place.
  • Free-preview marking survives a reload of tool history, buyers upgrading for Seedance return to the page they upgraded from, and onboarding emails no longer duplicate across brand and channel.
  • Chat and internal messaging reliability gaps are closed, integration navigation and Vendor Finance are simplified, and Vendor Finance tabs handle discovery failures instead of breaking the page.
  • Agent prompts and product copy now say Files rather than Context Hub, matching what the interface actually calls it.

The assistant no longer quotes a ChatGPT Ads balance that is not your balance

Asking the assistant about your ChatGPT Ads balance now gets an honest answer

  • If you asked the assistant how much was left in your ChatGPT Ads account, it could reply with a figure taken from the upstream ad provider's own credit field. That number is not your account balance, and it could disagree with what you had actually funded and spent.
  • The assistant no longer receives that field at all, so it can no longer quote it. Your funding and spend records remain the single source of truth for what a ChatGPT Ads account has available.
  • Spend observation and the checks that confirm an account is ready to run ads are unchanged — this narrows what the assistant can say about balances, and nothing else.

Spend approvals now hold the exact call they priced, paid work survives a stopped or credit-exhausted run, creative insights open to all paid plans, AppSumo licences activate themselves, and the sidebar Setup group collapses

Spend approvals and credits behave the way the card says they do

  • When the agent asks you to approve a paid call, the approval is now bound to that specific call. Previously an approval could be consumed by a different request than the one you were shown, and the price you agreed to was not guaranteed to be the price charged. The approved call is now priced exactly as the card priced it.
  • Stopping a run that had already produced paid work no longer discards it. If a run exhausts its credits or you stop it part-way, the work you have already paid for stays yours instead of disappearing with the cancelled turn.
  • Paid artifacts stay reachable even when the turn that produced them has nothing else to display. Some completed paid work used to become unreachable in the conversation simply because the agent had no accompanying message to show it with.
  • Queued billing holds are protected while they wait, and a spend approval that was consumed is now correctly scoped and restored rather than left in an ambiguous state.
  • The hold-release endpoint is reachable through the auth middleware again, so releases that previously failed silently now complete.

Plans, licences and balances

  • Creative insights are now open to every paid plan rather than being restricted to a subset.
  • AppSumo lifetime licences activate through AppSumo's Licensing OAuth and webhooks, so a code redeemed on AppSumo provisions the account without anyone handling it by hand.
  • Historical ChatGPT Ads balances and account ownership have been reconciled, so spend and funding recorded before the current pipeline now attribute to the right organisation.
  • The integration bonus banner now only claims the bonus for the platforms that actually grant it, instead of showing the same copy everywhere.

Creatives, remix and Ad Library

  • Ad Library references you stage for a remix now reach image generation, so a reference you selected is actually used rather than quietly dropped.
  • Creative Winners is scoped to the right ad account, and Ad Library metadata bounds are preserved rather than being truncated on the way through.
  • The remix agent now runs in the US and on Sonnet 5, which shortens the round trip and improves the quality of remix output.

Navigation and surfaces

  • The Setup group in the left rail is now a proper collapsible sidebar item with a real button, so it behaves like the rest of the navigation and can be keyboard-operated.
  • The approval panel on the live surface hides itself when there is nothing waiting, instead of occupying space with an empty state.
  • Strategy Generation and Dashboard Diagnose, two surfaces that could not be reached, have been removed rather than left as dead entries.
  • The Skills page no longer lists generated provider adapters, which were internal plumbing rather than skills anyone would install.
  • Visitors who open a private resource link they cannot access are now guided somewhere useful instead of hitting a bare error.

Reporting, skills and reliability

  • Customer report skills are published, and a new render-long-image skill produces tall image exports at a measured height rather than guessing.
  • The daily ads sync and its recovery path are complete again, so reporting data continues to fill in without manual re-triggering.
  • The CLI gitlink is updated and `soku live` is now named consistently in the places that had promised it.

Ad-account metrics that stalled mid-sync now recover on their own — six fixes to the pipeline that keeps your reporting current

Metrics sync no longer gets stuck part-way through

  • A long-running metrics sync used to be declared lost if it took more than five minutes to finish its work, even though it was still running. The job now renews its own lease while it computes, so a large account finishes instead of being abandoned and retried.
  • When a sync was interrupted and then resumed, a partially-covered date range could be re-requested in fragments, which left the repair permanently stuck asking for dates it already had. Repairs now reacquire the full original window in one piece.
  • A duplicate delivery of an already-successful sync message no longer marks the healthy sync as failed. Previously a redelivered message would re-request data from the ad platform and flag the original — successful — run as broken.
  • Accounts that had already been fixed by hand could stay blocked behind a stale diagnostic. Those older diagnostics are now cleared when a replayed sync confirms the account is healthy.
  • In production, some accounts due for recovery sat beyond the point the recovery scan reached and could never be picked up. Recovery now finds the specific account it was asked about rather than scanning only the front of the queue.

What you should notice

  • Reporting for large ad accounts should stay current without anyone re-triggering a sync, and an account that has been repaired should stop showing a stale warning after its next successful refresh.
  • No data was lost in any of these cases and nothing needs correcting by hand — the affected syncs were delayed or repeated, not dropped.

Historic CLI and Connect spend reappears in your budget and usage views, the Creatives page gets a canvas publish path and remixable Winners, ChatGPT Ads geo targeting goes live end to end and off-platform funding is recognised, and every video tool now defaults to 9:16

Historic CLI and Connect spend was missing from budgets, and is now back

  • Usage records now identify the caller in two dedicated columns rather than by reading a prefix off the session string. That is the durable fix, but the migration that introduced it defaulted every existing row to "unknown", so the backfill meant to derive the real caller matched nothing and every historic row stayed unattributed.
  • Because budget and usage views filter on that caller column, the effect you would have seen is your past Soku CLI and Connect consumption disappearing from budgets and usage reporting. It is derived back from the session string on deploy — no data was lost and nothing needs correcting by hand.
  • A second gap is closed too: during a rolling deploy, pods still running the previous image kept writing rows in the old shape, so spend recorded inside the deploy window would have gone missing again. Those rows are now filled in as they are written.
  • Quotes published for approval are now guaranteed to be an upper bound. A quote with no known ceiling is treated as unbounded rather than reported at its lower estimate, so an approval gate cannot be passed by a number that later settles higher.
  • Tool runs keep your draft while billing authorisation completes, instead of losing what you typed at the moment you are asked to authorise.

Creatives, the canvas and Remix

  • The Creatives page now works across your whole workspace rather than one brand at a time, winning creatives can be sent straight to Remix, and there is a publish entry point directly from the canvas.
  • The canvas assistant can now read your brand's uploaded files and previously generated artifacts, so a request can refer to assets you already have instead of describing them again.
  • Remix gains reference-image slots and routes each hop to the right provider, so a chain of edits keeps the reference rather than drifting away from it.
  • An upload to the generation provider that stalls is now reported as stalled and retried. Previously a stuck upload looked identical to one still working, with no progress and no error.
  • The Creatives list leads with work in progress rather than templates, quick tools sit above the template gallery, and four templates that rendered with visible defects were taken down after a visual QA pass rather than left live.

ChatGPT Ads

  • Geographic targeting for ChatGPT Ads now reads live from the platform instead of a bundled list, and the same targeting is exposed as an action over Connect, so an agent can set it as well as the console.
  • Advertisers who funded their ChatGPT Ads account by bank transfer rather than through the product are now recognised as funded. They were previously read as unfunded and blocked from launching.
  • A newly created campaign is now linked to the Dashboard, so it appears in reporting without a manual association step.

Onboarding, sign-in and page furniture

  • Sign-up and sign-in no longer run a Turnstile challenge.
  • Empty states across the product are now consistent, the migration to the Connect path is complete, and the audit card has been rebuilt.
  • An expired Google profile picture is refreshed rather than left broken.
  • During initial setup, a token whose identity does not match the account being set up is now rejected instead of quietly accepted — an identity drift in that window used to go unnoticed.
  • Skill cards now match the Integrations styling, and the Dashboard, Files and Ad Library page headers use the same serif treatment as the rest of the product.

Video tools and model configuration

  • Every video tool now defaults to 9:16, and the published API schema reports the same default, so an API caller and the UI agree on what they will get.
  • The model available on each plan tier now comes from one configuration source. Two independent definitions previously existed and could drift apart.
  • When a model provider rejects a request, the provider's own reason is now shown instead of being replaced by a generic local message.

Capabilities, docs and reliability

  • The binding between a capability card and the request it produces is now one implementation shared by Connect and MCP, the Soku CLI and generated agent adapters. Adding a new capability is one change rather than three.
  • Documentation for Google campaign types now covers the full set rather than Search only.
  • Account risk summaries are sent on a six-hour cadence, brand sync configuration no longer overflows when a workspace has many brands, and brand jobs are bound to the sandbox they belong to.

A production fix stops one person's session showing up in another's, the Dashboard gets a Creative tab with ad-level video metrics from all three platforms, activation emails start sending after months of silently not, public tools stop charging the wrong workspace, and disconnecting GA4 actually stops the syncs

A cross-account fix, shipped straight to production

  • A signed-in visitor could see another person's email address on a marketing page and get logged out in a loop. The cause was that publicly cached HTML carried whoever requested it first; those pages no longer embed any identity, and the cache rule now covers the case-variant URLs (/Pricing as well as /pricing) that were slipping past it.
  • Tool pages no longer create a workspace the moment you open them. A workspace is created when you press Generate, which is the point at which you have actually asked for something. Opening a tool and leaving used to leave an empty workspace behind under your name.
  • Onboarding could fail with a brand limit reached error because of one of those empty placeholder brands. Finishing onboarding now adopts your own empty placeholder instead of refusing to create anything, and finishing Connect setup with an empty profile succeeds instead of returning an error.
  • Anything the browser had remembered — form contents, history, pending uploads, remix drafts, the signup-flow cookie — is now tagged with who wrote it and cleared at every identity boundary. A draft written by one account can no longer surface for another, and signing out clears the lot.
  • Because this was a live incident it went to production directly rather than waiting for the normal promotion, so it has been live since 1 September.

The Dashboard gets a Creative tab, and video metrics from every platform

  • Ad-level video metrics from Meta, Google and TikTok are now stored and readable. Previously only five Meta fields existed and the dashboard discarded them on the way out, so video engagement was effectively invisible no matter which platform the spend was on.
  • A new Creative tab analyses your creative offline and surfaces the result in the Dashboard rather than requiring a trip into the canvas.
  • Winning creatives now have their own section, and a winner can be opened directly on the remix canvas — so the path from "this one worked" to "make more like it" is one click rather than a manual hunt for the asset.
  • A canvas node can be exported straight to your ad platforms or into the Context Hub, which closes the other end of that loop.
  • The template gallery ships 20 self-produced UGC ads in place of the previous set, one ad per template with more format variety, and hover previews can now be unmuted.

Activation emails were never actually being sent

  • Since 1 July, 3,253 activation lifecycle emails were reserved for sending and 0 were sent — with no errors recorded, which is why nobody noticed. A reservation was reading its own database id before the row existed, always got nothing back, and every caller read that as "someone else already claimed this one" and dropped the message. They now send.
  • Email notifications are on by default for newly created notification preferences. Existing preferences are left as they are rather than switched on behind your back.

Billing and workspace selection on the public tools

  • If you have more than one workspace and none of them is active, a tool run no longer picks one and charges it. It asks which workspace to use. The previous behaviour could quietly deduct credits from a paid workspace you were not working in.
  • Agency onboarding now requires both the agency name and a first client profile, instead of letting an empty client through.
  • The language you chose during onboarding now carries into the starter chat, the Creatives shortcut rail and the tool detail pages, which had all stayed in English regardless.
  • The upgrade button stays clickable when the generation form is incomplete, so you can find out what a plan costs before you have finished filling in a prompt.
  • A ChatGPT Ads balance the provider has never synced is now stated as unknown rather than shown as a number, and a stuck payment intent no longer reads as though payment was received. Setting up tracking is now an optional onboarding step rather than a blocker.

Reporting accuracy

  • Meta breakdown requests now only ask for metrics that are valid for the dimension combination in question. Requesting reach or video metrics at hourly granularity used to fail outright; combinations the vendor definitively excludes are now recorded as not applicable rather than as failures, and the dimensions the Dashboard offers reflect what the selected account can actually return.
  • Conversion events recorded on the server now carry their advertising attribution. 289 signups had been recorded with no ad source at all, which made every campaign readback understate paid performance.
  • The cookie consent banner now appears only in the EEA, the UK and Switzerland; elsewhere, no stated preference is treated as consent. The previous global opt-in meant 239 ad clicks left only 129 identifiable sessions.
  • Being blocked by a plan limit is no longer recorded as an upgrade click. 71 people who were refused by a paywall had been counted as 71 people who wanted to buy.
  • The sign-in wall on the tool landing pages moved from choosing a file to pressing Generate. Of 133 visitors, 62 hit the sign-in box at the file picker and only 5 reached the generate button.

Reliability

  • Disconnecting GA4 now cancels any sync that is still running or queued, in the same step, rather than leaving work in flight against a credential that no longer exists. Reconnecting later starts a clean generation, so finished history from a previous connection cannot be mistaken for the current one.
  • Automations no longer serialise behind each other per identity, so two of your automations can run at the same time.
  • Idle pause is now ordered correctly against billing history, an account's finance records are identified by brand, and the assistant's action discovery and detail refresh use one code path instead of two that could disagree.
  • The Soku CLI closes a set of usability gaps, and presigned uploads that were failing now work.

ChatGPT Ads can now be funded by bank transfer and the claim goes through a real queue, Pixel setup becomes a per-event checklist instead of a single green light, the canvas generates a batch at once and tells you how long it will take, and a conversation past 126 messages opens again

Funding ChatGPT Ads no longer has to go through a card

  • Ad spend can now be funded by bank transfer. You see the receiving account details, wire the money, and the payment is credited on our side — previously Stripe was the only way in, which is not how most advertisers above a certain spend actually move money.
  • That has since become a path you can complete yourself rather than a set of details to copy down. You enter the amount you are sending, attach a screenshot of the transfer, and submit a claim; we match it against the incoming payment and either confirm it or come back with a reason. You can withdraw a claim you have not sent yet, and only one claim can be in flight per brand at a time so the same wire cannot be counted twice.
  • The amount is no longer locked to fifteen days of daily budget. It still defaults there, because that is the number most people want, but you can change it.
  • Your available balance is now computed from our own ledger rather than read back from the ad platform, so the funding screen, the finance overview and the balance monitor all quote the same number. They previously did not always agree.
  • The balance check that pauses campaigns when you run out of money now runs every thirty minutes and confirms each pause actually took. It had been failing on every account on every run since 19 August — the zero-balance protection existed but had never once evaluated a live account.

Pixel setup tells you which events are actually landing

  • Verifying a Pixel install is now a checklist, event by event, split by whether the signal arrived from the browser or from the server. Previously the check was whether any event had ever been received, which meant a correctly instrumented purchase and a mis-tagged add-to-cart looked identical.
  • The "server-side events enabled" badge now reflects whether server events have genuinely been received. It previously reflected only that an API key had been issued, which happens automatically at account setup and was therefore true for everybody.
  • The checklist accumulates from the moment it ships and cannot look backwards, so an existing install shows an empty list until new traffic arrives. That is expected, not a broken tag.

The canvas generates in batches and shows the wait

  • One instruction can now produce several variations at once instead of making you click the same button repeatedly. The credits for the whole batch are reserved together, so a batch that cannot be afforded is refused up front rather than half-appearing and vanishing.
  • A card that is generating now estimates how long it will take, based on how long comparable jobs have actually taken. Only successfully delivered runs count toward that estimate — failures finish fast and would make everything look quicker than it is. Until there is enough history the card shows elapsed time instead of a countdown, and "taking longer than usual" is judged against the slow end of the range rather than the middle.

Reliability

  • Conversations longer than about 126 messages open again. Any read of a longer thread returned an error every time, which meant the chats people had invested the most in were the ones that stopped working. One conversation produced 505 consecutive failures in a ninety-minute window before this was found.
  • A model provider returning an ambiguous failure no longer locks an entire organisation out of model calls. That outcome is now contained to the single call it happened on, you are not charged for it, and the fallback within the same turn stays available instead of being switched off.
  • Brand setup can no longer report success without having written your brand profile. Every path that completes onboarding — including the retry and repair paths — now checks the profile is actually attached, and fails loudly if it is not, rather than sending a "setup complete" notification for work that did not happen.
  • TikTok metrics stop generating two guaranteed daily failures per account. The pipeline was requesting a breakdown combination TikTok does not offer, which inflated the failure count and dirtied coverage reporting; a fifth breakdown dimension was added at the same time.
  • Integration bonus credits that failed to be granted can be recovered again. The daily safety net that finds and re-grants them had been crashing on every run for over a week.
  • A production traffic switch no longer briefly takes the app offline. The previous rollout sequence could leave a short window in which the app, the API and the admin console were all unreachable while the load balancer caught up.
  • Signing up now adds you to our mailing list through the same queued, retrying pipeline as every other analytics destination, so a third-party outage cannot fail a signup. The terms and privacy links missing under the sign-up button are back.

Elsewhere

  • Creative template cards play the finished ad when you hover them, and describe the things a media buyer actually checks — duration and aspect ratio — rather than a generic blurb. Creating a canvas no longer asks you to name it first.
  • The creative audit assistant had five separate faults in how it read Meta and Google data, including a wrong status filter and a mis-detection of video versus still ads. It was producing confident conclusions from wrong numbers; it no longer does.
  • The Similarweb entry in Connect was corrected against what the provider actually returns, following the catalogue expansion in the previous release.

The canvas assistant can now ask you a question and wait for your approval before publishing to Meta, templates and reference ads become one gallery, Connect stops hiding two thirds of the Similarweb catalogue, and a vendor running out of API keys no longer stops your work

The canvas assistant asks before it acts

  • The assistant can now publish a finished video from a canvas node straight into a Meta ad account's asset library — and every one of those calls stops and waits for you on an approval card in the chat. This is the first assistant capability whose output leaves your workspace, which is exactly why the gate is in the conversation instead of in a separate review queue: the decision is made where the context is.
  • When the assistant needs to pick between enumerable options — which model, which plan, which node — it now shows a tappable card instead of asking in prose and making you retype the answer.
  • Both cards live in the transcript, so they survive a reload and can be answered from any tab you have the conversation open in. The dock lifts its height cap while a card is waiting, because buttons hidden behind a scrollbar are hidden exactly when they need pressing, and the status dot turns a pulsing blue for "your move" so it reads differently from the amber "thinking".

One gallery for templates and reference ads

  • Reference ads are no longer a separate place to browse. They are a tag inside the template gallery, so you look in one place for something to start from. Watching an ad comes first; Remix this ad remains the only action that writes anything.
  • The gallery's tags are now the four things you might actually want to do — remix, edit, creators, generate — plus winning ads, replacing the old ad-type tags that described the ad rather than your intent.
  • Template preview keeps a hint bar on screen with Use this template in it, instead of making you find the way back out of the preview.
  • Four new templates ship: cutdown, cta-factory, testimonial-factory and product-hero. Speech trimming no longer pads a hook with dead air, so a template's opening seconds are the hook rather than silence.

Connect shows what it actually has

  • The Similarweb page advertised 7 capabilities while its provider published 19. The missing 12 are now listed. The check that was supposed to catch this only verified that everything advertised was real — which is true of a page showing seven of nineteen — so it now requires the two sets to match exactly and cannot under-report again.
  • The Connect data pages were rendering inside the app sidebar, wrapping product chrome around a marketing page. Worse, that shell clips its own content, so those pages had no scroll path at all and most of what was on them could not be reached. They now render on their own.
  • The Built-in half of the Setup → Connect supply banner has somewhere to go. It previously offered only a billing link, which meant the half you cannot act on — and are therefore most likely to be curious about — was the half with no way to learn more.

Reliability

  • A vendor can now hold several API keys, and a key that comes back rate-limited or out of credit is put on cooldown while your request moves to the next one automatically. Previously one exhausted key stopped that vendor for everybody until someone noticed.
  • The three tool pages that read a URL you paste now pin the connection to the addresses that were checked, so a hostile DNS answer cannot pass the safety check and then send the fetch somewhere else, and the response body is capped as it arrives rather than after it has been read.
  • A single conversation turn is now locked to one model route for its whole life. Changing model configuration while a turn is in flight can no longer split that turn across two different setups halfway through.
  • Meta persona breakdowns recover on their own when Meta returns the intermittent server error that used to blank them. The last known good data is kept rather than discarded, and the exact combination that was deferred is carried through so the gap is visible instead of silent.
  • When the assistant notices it has the wrong brand context, it now offers a way to correct it or step out, rather than only asking a clarifying question you have to answer before anything can proceed.

Your own cookie choice decides your tracking again, conversion and metrics reporting stops stalling on stuck runs, and a revoked Meta Business Manager no longer lingers in your account

Cookie consent now follows the visitor, not the cache

  • Your consent choice is read from your own browser rather than from the page HTML our CDN had already cached. Because marketing pages are cached at the edge and the cached copy does not vary by cookie, the consent state baked into that HTML belonged to whoever loaded the page first — so a later visitor could inherit a stranger's answer. Consent is now evaluated client-side, which is the only place it can be correct.
  • Analytics events fired immediately before a navigation now actually leave the page, so an action you took really is the action that gets recorded. This was measured against production rather than assumed: the queue-bypass transports that look like the obvious fix deliver nothing at all, and shortening the flush interval is what works.

Meta reconnection tells you the truth about what it needs

  • Reconnecting Meta without the business-management permission no longer leaves stale Business Manager entries attached to your account. Those businesses were already unreachable with the new token, but they kept flowing into account discovery and failing there repeatedly, which read as a broken integration rather than a permission you had declined.
  • The error message shown when a Meta connection is refused now names the permission that was actually missing — ad access — instead of asking you to grant everything. The previous copy contradicted the change that made the other seven permissions optional, so people were being told to approve scopes we had just stopped requiring.

Reporting pipelines stop getting stuck

  • Scheduled metrics work no longer creates a second overlapping run when an equivalent healthy one is already in flight, and days with no data are retired as a single batch instead of one job per date. Duplicate and empty work was the main reason a refresh could sit unfinished while nothing was actually wrong.
  • Conversion runs that a newer run has fully replaced are now settled instead of sitting in the backlog forever. A superseded run is finished work; leaving it open made genuine problems harder to see.
  • GA4 settlement was timing out on validation rather than on real work: one aggregation measured 21 seconds in production and ran twice per settlement, almost entirely on repeated checks of the same objects. That duplication is gone, with no change to the guarantee that every object is still verified against real storage.

Connect gets its own console and hostname, ChatGPT Ads onboarding becomes self-serve through Stripe, a paid generation fal refuses is now refunded automatically, and 16 tool pages become findable

Connect is now its own product surface

  • Connect has moved out of the main app and onto its own console and hostname. It was previously something you reached through Soku; it is now a place you can go directly, which matters because the people wiring up an integration are often not the people running campaigns in the product.
  • Endpoint capabilities are now discoverable by what they do rather than by which vendor provides them. You ask for the kind of data you want and get the endpoints that can supply it, instead of needing to already know which vendor sits behind it — the whole point of the layer is that the vendor is an implementation detail.
  • The Soku CLI can now reach the vendors Soku pays for through a single consistent path, so a paid capability behaves the same way from the CLI as it does inside Connect.

ChatGPT Ads onboarding no longer needs us in the loop

  • Setting up a ChatGPT Ads account is now self-serve end to end through Stripe. Previously onboarding involved a manual step on our side, which meant a new advertiser waited on a human before they could spend anything. That step is gone.

You get your credits back when a provider refuses the job

  • A paid generation that fal accepts and then refuses is now refunded automatically. Until this change the credits were deducted at submit time and stayed deducted, so a provider-side refusal cost you money for an asset you never received. This is the single most user-affecting fix in this batch.
  • The cap on source length is now actually enforced rather than advertised, and every redirect hop is validated before a paid source is fetched — so a request cannot be quietly redirected into fetching something you did not ask to pay for.

Remix and creative workflows

  • Ad remix now waits on the generations it depends on instead of racing them, understands which slot an edge is feeding, and renders at the size of the clip rather than at a fixed one. In practice that means fewer half-built remixes and fewer renders you have to redo because the output dimensions were wrong.
  • Creative skills now ask for missing context before generating rather than guessing at it. Being asked one question up front is cheaper than discovering after the fact that the model invented a brand detail.

Automation tells you why it did not run

  • An automation blocked by insufficient credits now says so explicitly. It previously just did not run, which was indistinguishable from a bug and generated most of the support questions in this area.
  • Automation admission is more reliable, and notification counts that had drifted from the underlying records are reconciled, so the badge you see matches what is actually waiting for you.
  • A paid 30-day recovery workflow is now available for accounts that lapse, so an interrupted subscription does not mean starting over.

Marketing site

  • 16 tool pages that existed but were effectively unreachable are now discoverable, and three others were retargeted at the queries they were already ranking for rather than the ones they were written for.
  • Tool and model pages moved to the dark ground used across the rest of the site, the handoff from a tool page into the creative canvas was fixed, media workflow tools were polished, and the ad resizer gallery now shows four real reframed ads instead of illustrative ones.
  • Billing correctness: plans redeemed by code are no longer offered again in the upgrade dialog.

Meta video metrics land in reporting with hook and hold rate, soku.ai becomes readable and callable by AI agents, and Connect ships its first task that spans your own data and ours

Video creative reporting gets hook and hold rate

  • Meta video metrics are now stored and queryable, and two derived rates are exposed alongside them: hook rate and hold rate. Click-through and return on ad spend only tell you whether a video lived or died. Most creative is neither — it works for a few seconds and then loses people, and that is exactly the group worth editing rather than replacing.
  • The practical difference is that "high CTR but weak conversion" can now be separated from "nobody stayed past the opening". Those two look identical in a standard report and call for opposite fixes, so they were the most commonly misread case in video reporting.

soku.ai is now readable and callable by AI agents

  • The capabilities Soku already had — an OAuth device grant, a published CLI, a typed API — are now discoverable at the URLs an AI agent actually checks, rather than existing only inside the product. Marketing pages serve a Markdown representation to clients that ask for one, so an agent reading soku.ai gets clean structured content instead of scraped page furniture.
  • This matters as more buying research starts inside an assistant rather than a search box. It changes how Soku is discovered and cited, not how the product behaves for people using it directly.

Connect spans your own connections and paid Soku data in one task

  • Connect gained its first reproducible task that crosses both kinds of supply: read declining pages from a customer's own Google Analytics 4 property, then fetch current search-results evidence for them.
  • It is deliberately built as a recipe the agent follows using ordinary tools, rather than as a single combined tool. A combined tool would have to quote one opaque price covering both a free connection you already own and paid Soku data, and would report a single access mode and a single provenance for a result that genuinely has two. Keeping the two calls separate keeps the receipt honest about which part cost you anything.

Reliability

  • Data-import runs that had actually finished could previously stay stuck in a settling state after the underlying job completed. Those runs are now recovered automatically, so a completed import reports as completed instead of appearing to hang.
  • Brand template syncing now consistently applies the most recent request across release triggers. Superseded work is stopped before newer work reconciles, so a rapid sequence of releases settles on the latest brand state rather than whichever finished last.

Connect starts returning real data instead of placeholders, the first paid Soku Data capability goes live at 2 credits a lookup, and three billing races that could double-charge or double-call a provider are closed

Connect returns your actual data

  • A Connect grant is now bound to a real workspace rather than a stand-in, so the first thing you see after connecting is your own account data instead of a placeholder. Account ownership and the observation window are read from what the connected integration actually declares it can do, which also means an empty result is now reported honestly as empty rather than as a failure.
  • Connecting no longer occasionally binds you to a workspace you were never shown. A race between slug conflict resolution and rollback could pick a different workspace than the one on screen; the flow now retries against the suggested slug within bounds, re-locks the organisation and re-checks the signed grant before committing.

The first Soku Data capability is live and priced

  • Google organic SERP lookups via DataForSEO are now available as a paid capability. A real vendor call runs through the existing pricing module and settles at 2 credits per lookup against a $0.002 provider cost, so the charge is visible in the same credit ledger as everything else rather than hidden in a plan.
  • The input and response contract for that capability is deliberately tight, and the paid action is isolated from the four ordinary CLI entry points — calling it directly outside Connect returns a 404 rather than quietly billing you.

Billing correctness under concurrency

  • Two Connect requests on the same grant can no longer jointly exceed a budget. Budget checks and settlement are now serialised on a pinned database connection with a non-blocking lock, so the second request waits for the first to release rather than reading a stale balance.
  • A supplied key is now claimed durably before the provider is called, so a process crash or a settlement failure mid-request cannot result in the provider being called twice for one request.
  • An approved action that was paused and then hit a worker timeout is no longer mis-settled as a handler failure. The remainder is kept as durable pending work and picked up automatically, which matters when the action in question is a change to a live campaign.

Ads write governance and other fixes

  • Seven correctness gaps across Connect, action review and guardrails are closed, covering signed grant subjects, request fingerprinting, budget naming, and the fences that decide when a recovery is allowed to proceed.
  • Publishing a brand template through the Actions API no longer breaks on a read-only authorisation. The API now requests the permission the Sync Brand Template action actually needs, so the brand template publishing chain completes instead of stalling partway.
  • Data processing, data loss prevention and incident response policies are now published, with the remaining gaps documented explicitly rather than left implied.

Paid creative jobs now finish even if you close the tab, approval cards stop hiding what you are approving, Google One Tap arrives on the free tools, and long conversations stop silently outgrowing their context

A paid generation no longer depends on your browser staying open

  • Completion and refund for paid creative jobs moved from browser polling to a worker that claims the job server-side. Previously, closing the tab on a running generation could leave you with neither the output nor your credits back — the job finished somewhere, but nothing was listening. Now the worker mirrors the finished asset or refunds exactly once, whether or not you are still on the page.
  • The Creatives canvas gained four shortcut tool tracks, so the generators you reach for most are one click from the canvas instead of a navigation away.

Approval cards show you the whole thing you are approving

  • Human-in-the-loop approval cards used to truncate, flatten or hide the parameters of the action awaiting your sign-off — which meant approving a write without being able to read what would be written. Cards now guarantee the full payload is reachable: long values expand, every item is shown in full, nested structures stay nested, and a view-raw fallback covers anything unusual.
  • Expanding a large payload scrolls inside the card rather than pushing the approve and deny buttons off the screen.

Sign in without leaving the page you are on

  • Google One Tap now appears on the free tool pages, the model pages, the free ads audit and the free competitor analysis. Because the credential is handled in place rather than through an OAuth redirect, whatever you had already typed into a tool survives signing in — previously a sign-in mid-task discarded your prompt.
  • The home page deliberately does not show One Tap, since signing in there routes new accounts into onboarding and would pull you out of whatever you were reading.

Reliability and correctness

  • Long conversations now compact when they actually need to. The previous trigger estimated context from character count, which badly under-counted Chinese and mixed Chinese-English threads — so a conversation could sit near a full context window without ever crossing the threshold. It now measures real usage reported by the model provider.
  • Stripe checkout, subscription changes, annual credit grants and refunds are now idempotent and order-safe, so a retried webhook can no longer grant credits twice or drop a charge.
  • Permission and credential changes take effect on the next turn. The agent previously reused cached capability lookups across turns, which could mean a revoked grant or a rotated credential stayed live longer than it should have.
  • Finishing Brand Voice setup on an existing brand no longer stalls. Onboarding re-reads starter tasks for your current brand instead of reusing a stale draft, which was producing a task that could never complete.
  • The assistant now points you to Dashboard → Campaigns to browse your ad campaigns, instead of incorrectly claiming they could only be inspected in conversation.

New campaigns can no longer go live without you reviewing them first, the canvas assistant can actually generate and render, a $19 Creator plan arrives, and two billing defects that charged the wrong amount are fixed

Creating a campaign is now review-then-launch, never launch-by-accident

  • Starting a campaign used to be able to activate immediately. It now always follows the same path: the campaign is created paused, you get the complete saved hierarchy — campaign, ad groups and ads — laid out for review, and then you choose Save draft or Launch. Nothing that can spend money goes live without that explicit step.
  • If a step fails partway through, the system reconciles rather than leaving a half-built campaign behind: launch runs in order — ad groups, then ads, then the campaign — reads back each step, and retries at most three times. Refreshing the page mid-flow recovers where you were instead of starting over.
  • Creating an ad group or an ad on its own, and renaming a campaign, work exactly as before.

The Creatives assistant can now do the things the canvas is for

  • The assistant on the Creatives canvas could read your work and edit text, but could not generate, re-roll, choose between takes, or render — it could only tell you where to click. It can now do all of those, through exactly the same endpoints your browser uses, so it cannot reach anything you could not.
  • It quotes before it spends. Video models differ by as much as 8x in price for the same clip, so the assistant reads the live priced catalogue and tells you the cost before starting a job. Asking for 'the same thing again' re-rolls with the model, ratio and duration that produced the original, so a repeat costs what the first one cost.
  • Generation and rendering return as soon as the job is accepted rather than holding the conversation open for minutes; the canvas updates itself when the job settles.
  • Refusals now say why. Every generation refusal previously arrived as a bare 'HTTP 402' with the reason stripped out — which is the part that tells you whether to top up, wait, or pick a cheaper model.
  • Media generated on a /tools page and handed into the canvas is now adopted correctly when you remix it.

A $19 Creator plan, and two billing numbers that were wrong

  • Creator is a new $19 entry tier that includes fal video generation. That inclusion is deliberate rather than incidental: every free tool page on the site is a video or image generation, so a creative-tier plan that could not generate video would have been sold precisely to the people who came for it. It differs from Starter on volume and workspace shape, not on what it can do.
  • Annual pricing was displayed wrong on both pricing surfaces. They calculated the yearly figure themselves instead of reading the stored price, so Starter advertised $468 a year while Stripe charged $470.40. Both now read the same stored number, and a test holds them together.
  • Changing plan no longer sends an existing subscriber back through Checkout. That path could create a second live Stripe subscription — billing the customer twice while provisioning nothing. Upgrades now modify the existing subscription in place, invoice only the prorated difference, and top credits up to the new allowance rather than granting a second full amount. Downgrades take effect at the end of the period.
  • Generated output is permanent. Results previously lived only in the browser tab and on the provider's expiring CDN, so a 2,550-credit clip could become unreachable within hours — including after it had been handed into the canvas. Every generation is now stored in our own bucket and served from our own path.
  • Logged-out visitors no longer get a permanent spinner where a tool should be, the free tier's generation limits are stated before you write the prompt rather than after, and 48 pages stopped promising 'free to start' for something they could not deliver.

Integrations: reorganised around what you are trying to do

  • Settings → Integrations previously listed around a thousand connectable apps in one flat grid, with the first-party cards filed under nine categories that described how a vendor is built rather than what you want from it. There are now four — intelligence, search, creative and data — and a left-hand nav with live counts that re-weight as you search. Connected sits pinned at the top.
  • TikHub, which was a single card, is now twelve platform cards — TikTok, Instagram, Xiaohongshu, Douyin, Reddit, Weibo, Bilibili, Kuaishou, Threads, YouTube, X and LinkedIn — each crediting the vendor behind it, plus eight newly available platforms.
  • That audit turned up two billing defects and fixed both: three LinkedIn calls had been repriced by the vendor to eight to ten times what we were still charging for them, and two routes the vendor had retired were still billable.

Reliability and correctness

  • ChatGPT Ads campaigns are now protected when an account balance runs out, rather than continuing to attempt spend against a depleted balance.
  • Device targeting values for Gravity campaigns are aligned with what the platform actually accepts, and Meta object IDs that arrive as numbers rather than strings are now accepted instead of erroring.
  • Chat replies in the language of your most recent message rather than an earlier one in the thread, message actions are improved, and organization focus keeps its minimum selection rather than clearing it.
  • Ad dimension estimates are now sized from the cache that actually answers the query, which removes a class of spurious size failures. The onboarding starter prompt no longer shows its internal preamble, and internal CLI login instructions no longer reach users or agents.

Every free tool on the site now actually runs, the homepage shows the real product, first-time setup drops from five screens to three, your first onboarding message is always free, and Shopify is connectable again

The free tools on this site are real tools now

  • All 35 of the /tools pages used to be demonstrations. You could type a prompt, but the button sent you to a signup form and your input was thrown away. That was a poor trade for your time and we have rebuilt it: the tools now generate on the page. You sign up in place, a workspace is created for you, credits are checked and charged, the job runs, and the result can be handed straight into the Creatives canvas.
  • Each tool's endpoint, accepted inputs, price, and how its output is read are now fixed by a server-side specification rather than assembled per page, so what a page offers is what the engine behind it actually supports.
  • One billing defect went with it. If a generation job failed after being queued, or completed without producing a file, credits had already been deducted and were never returned. Refunds now happen on both of those paths, and the refund is idempotent under a database lock so a retry cannot double-refund.

The homepage shows the product instead of describing it

  • The hero now renders an interactive shell of the actual application — chat, dashboard, files, creatives, automations, and the full catalogue of 25 integrations and 56 marketplace skills — traced screen by screen from the product code rather than mocked up. The two example conversations in it are real, desensitised sessions.
  • This is a marketing-site change only. No API, data, or product behaviour was touched.

Setting up for the first time got considerably shorter

  • First-organization onboarding went from five screens and 15 required fields to three: basics, connect tools, brand voice. The profile screen and the Recommended Setup step are gone. Starter tasks already read the capabilities of the integrations you actually connected rather than the platforms you told us about, so the questions were not earning their place.
  • Onboarding also no longer creates recurring automations on your behalf. If you want something running on a schedule you will set it up deliberately.
  • Your first message in each of the three onboarding starter chats is now always free, and is no longer drawn against the credit budget. This was a real problem rather than a nicety: over the preceding week, 101 of 148 new organizations — 68% — had at least one of those first messages charged for, at an average of 3,750 credits against a 2,000-credit signup grant. The exemption is now one message rather than an amount. Third-party calls made on your behalf are never exempt, and the exemption does not repeat across brands for the same user.

Integrations: Shopify returns, TikTok gets unstuck

  • Shopify is connectable again. The public app was rejected from Shopify's App Store because it would have been required to use Shopify Billing, so the integration now works as a merchant-created Custom App — you create and install the app in your own store and Soku exchanges credentials for a 24-hour token. The Shopify card has moved from Coming soon to available. Switching a store between the old OAuth path and a Custom App updates the same credential rather than creating a duplicate.
  • A TikTok credential that stopped at the confirmation step had no way forward. The interface projected that state as a disabled 'Syncing…' and asked you to wait for a background job that would never run, and the entry point for importing accounts was restricted to a hardcoded list that excluded TikTok. In production one credential had authorized 156 advertisers, imported none, and sat stuck for four days. There is now an explicit account-selection path, offered per credential based on what the backend will actually accept.
  • The integration catalogue is now visible and searchable to every member of an organization, not just administrators. Connecting, reconnecting, assigning, and disconnecting remain admin-only.

Reporting and dashboard fixes

  • A customer on a LinkedIn ad account had been timing out on every reporting window since 14 August. The cause was a single parameter that was accepted and then not passed on, which made an internal read scan the entire table instead of one account's slice. That is fixed, along with a related correctness bug where two accounts sharing an ID across different platforms inside one organization could be merged and trigger a spurious 'result too large' failure.
  • Performance Max creative thumbnails and downloads were returning permission errors because unsigned private storage URLs were being handed to the browser. Those URLs are now signed server-side.
  • Sync status used to be derived independently in several places, so the top bar could say an account needed attention while the floating indicator said everything was synced. Both now read the same state and cannot disagree.
  • The Meta connection flow now explains, before you are redirected, that Meta's business-portfolio authorization screen is not a requirement to have a Business Manager. The permissions requested did not change. Separately, GA4 pivot configuration now lists dimensions belonging to other themes in grey with their theme named, instead of omitting them and implying they are unsupported.

Agent correctness and security

  • Tool discovery and tool execution are now separately authorized in the agent. Previously the ranking step could effectively authorize a data operation, which produced a reproducible error in production where asking to list an organization's connected integration accounts selected and ran an unrelated page-listing operation. Execution now re-resolves the exact operation against the current brand and session every time.
  • An internal control endpoint inside the agent sandbox accepted writes without authentication. It set the context used to decide video generation limits and billable concurrency, which meant code running in the sandbox could have relaxed its own spending policy. It now requires a per-sandbox token, checked before the request body is read. Verified by running the exploit against real build artifacts before and after: the unauthorized write went from succeeding to rejected, and the replayed request it enabled went from allowed to blocked.
  • Conversations you delete are now retained for administrative review with a Deleted badge, while remaining hidden from normal reads, writes, and sending. Tenant isolation is unchanged.

Product compositing starts working again and bills at the right price, reporting stops dying on database deadlocks, Max CPC returns at the ad group level, canvases can be shared as read-only links, and ad creative specs get real limits

Product compositing works again — and charges what it should

  • If generating a composed product image had been failing for you, that is fixed. The generation path was pointing at a model namespace that no longer resolved, so the feature had been broken for roughly three days before this release. It is working again.
  • The same fix corrects the price. Composed image edits were being metered at the plain text-to-image rate rather than the edit rate, which meant the credit cost shown did not match the work being done. Edits now bill at their own rate. To be straightforward about the boundary: this corrects charges from this release onward, and already-completed generations are not retroactively adjusted.

Reporting stops falling over, and stops crying wolf

  • Three separate defects were quietly costing you reporting data. The largest: a refresh task could raise its own retry ceiling in a way that persisted for the entire life of the worker process, so a task that should have stopped after three attempts kept being redelivered — and each extra delivery crashed against work that had already been finalised. In production this was destroying roughly 59 executions a day. Retries are now capped the way they were always meant to be, with a check in the build that prevents the pattern coming back.
  • The second was a database deadlock. The job that refreshes cached ad-account spend was updating every account in one long transaction, holding write locks for as much as 55 minutes and acquiring them in an unpredictable order. Over a single day that produced 61 deadlocks, all piled up behind the same query. It now works through accounts in short, per-organization transactions in a consistent order, so the pile-up cannot form.
  • The third was noise rather than breakage: the most common error in our logs was a metrics sync failure, and about three quarters of those were not failures at all — they were intermediate states that were about to be retried successfully. They are now logged according to what they actually are, which means the remaining errors are real ones. This does not change what you see in the product, but it is why the next genuine outage gets noticed faster.
  • Google ad accounts that lose authorization now get treated according to the cause. Previously an account deactivated by Google and an account whose credentials had simply lost access were treated identically and retried indefinitely with no escalation — in one case a customer had 31 accounts spinning for six weeks with nobody alerted. Those two situations are now distinguished, because one of them is something you can fix and the other is not.
  • Pixel permission alerts also stop lingering. If you re-authorize in Meta Business, the alert now clears on its own within a sync cycle rather than waiting for someone to intervene.

Sync Health pages load instead of hanging

  • The account view could sit on a loading skeleton indefinitely. A freshness query was scanning far more data than it needed to because it was not filtered to the account dimension, and in production it was timing out at 180 seconds. With the filter in place the same query measured 16.6 seconds against production data. Coverage lookups are now bounded and duplicate requests removed as well.
  • Where something does go wrong, the page now shows an explicit degraded or error state rather than failing silently — which matters more than the speed, because a slow page you can trust beats a fast page that lies.

Campaign controls: Max CPC returns, creative specs get real limits

  • Max CPC is back at the ad group level, with validation and a visible diff before you commit. Leaving it empty genuinely means fully automated bidding rather than sending an empty value upstream, and clearing a previously-set cap explicitly removes it. This closes a gap where the interface could appear to show a bid cap that upstream did not actually have.
  • Ad creative fields now carry the real specification: headlines are guided to 16–24 characters with a hard limit of 50, descriptions to 32–48 with a limit of 100. The separately editable ad name is gone — every creation path now derives the submitted name from the headline, so two things that had to agree can no longer disagree. Image uploads and brand logo prefills are standardised on square PNG or JPG between 256 and 1200 pixels, keeping the existing 5 MB ceiling. Historical ads with over-length headlines continue to work.
  • Importing ad accounts gets a search box that works by name or account ID, with hyphens ignored on the ID side, shared across every platform. It comes with a control to narrow the import selection to your search results — necessary because the page selects all importable accounts by default, and clearing the selection only affects what is currently found.

Canvases can be shared as read-only links

  • A canvas can now be shared with someone who does not have an account. They see a structurally read-only view — not a normal view with the buttons hidden — and any media is served through a token-scoped proxy with lifetime checks, response size limits and cross-brand key validation. Revoked, expired, password-protected, over-limit, foreign and unreferenced access attempts are all refused.
  • Shared canvases now also show a preview frame before a video begins playing, instead of an empty rectangle.

Agent quality and transparency

  • Two defects reported by customers had the same shape: the agent handed you something it should have caught itself. The LinkedIn research skill was still routing through a vendor endpoint that returns 404 on every path, burning two calls on it before reporting that engagement data was unavailable — without ever trying the source that does return that data. The same run also described one of our own budget limits as though it were a missing vendor capability. Both are corrected.
  • Ad creative quality checks gained a fifth dimension that specifically evaluates subject structure. Without it, an image with a visibly distorted human torso could pass every other check and be delivered.
  • The agent also now confirms before starting large ambiguous tasks, stops broadening narrow questions on its own, acknowledges long-running work immediately, names files consistently, and produces HTML reports for scheduled runs.
  • In chat, the tool-call trace now distinguishes skill invocations from ordinary tool calls — skill rows carry a named badge and expand to show what the skill does — and commands hitting recognised external vendor domains display which vendor they reached.
  • Automations whose owner no longer has valid membership in the organization now stop rather than continuing to run.

Reporting data catches up: the metrics backlog that was leaving dashboards stale has been cleared, and the pipeline no longer rebuilds the same numbers twice

Dashboards stop lagging behind your ad accounts

  • If your reporting numbers have been arriving late — a dashboard still showing yesterday's figures long after the platform had today's — this is the fix. The pipeline that adopts new ad-account data into our reporting tables had built up a backlog of overdue work, and that backlog is what you were seeing as staleness. It now drains through the reconciler instead of accumulating.
  • The root cause was two separate problems compounding. Multiple identical refresh requests for the same underlying data were each doing the full rebuild independently, so the system spent its capacity recomputing numbers it had already computed. Those duplicate refreshes now coalesce: one physical refresh serves every request for the same exact data, and the rest wait for it rather than racing it.
  • The second problem was database deadlocks. Different parts of the pipeline were taking the same set of locks in different orders — the planners, provider callbacks, settlement and reconcile, account deletion, and grant revocation each had their own sequence — which meant that under load they would periodically block each other and a batch of reporting work would die. All of those paths now acquire locks in one canonical order, so the compositions that used to deadlock simply do not any more.

Interrupted refreshes now recover instead of stalling

  • Each unit of reporting work now records durable ownership of its own attempt. Previously, if the worker processing a refresh disappeared mid-flight — a deploy, a node eviction, a crash — the work could be left in a state where nothing picked it back up, and that row stayed overdue until someone noticed. Ownership is now recorded in a way that survives the worker, so a lost attempt is detected and retried rather than silently abandoned.
  • The settlement worker also gets its own deployment strategy: it fully drains the old pod before the new ones start, rather than running old and new side by side during a rollout. That matters because two versions of this particular worker overlapping is exactly the condition that produced orphaned work. Shared cache workers keep the normal rolling update, so this change does not slow down other deploys.

ChatGPT Ads campaigns can be built and managed inside the brand dashboard, the app shell becomes a dark plate with the content inset as a card, Autopilot returns behind an org-level opt-in, chats can be renamed straight from the sidebar without dragging them to the top of Today, and LinkedIn Ads metrics start landing at all

ChatGPT Ads: a real campaign manager on the brand dashboard

  • ChatGPT Ads stops being something you only read about in reports and becomes something you operate. A Campaigns tab appears on the brand dashboard with a list view, a three-pane campaign builder, record dialogs, bulk operations, CSV export and column visibility controls — the full surface, not a summary widget. The tab renders only when the brand actually has a granted ChatGPT Ads account, and falls back to Overview the moment that grant is revoked, so it never shows up as an empty promise.
  • Two design decisions are worth stating because they change what you can trust. Every write returns an honest outcome — success, partial failure, or unknown — rather than reporting optimistically and letting you discover the truth in the platform later; "unknown" means the request left us and we genuinely cannot confirm what happened upstream, which is a different thing from failure. And every mutation carries an idempotency key, so a retry after a flaky connection resolves to the same operation instead of creating a second campaign.
  • Campaigns are created paused, always. That is enforced in the operations layer rather than in the form, so there is no path — bulk, CSV or otherwise — that quietly launches spend before you have looked at it.
  • Metrics stay deliberately separate from live entities. Performance numbers are aggregated from our own daily tables and stamped with an explicit as-of timestamp in UTC, with the platform's America/New_York reporting day made explicit rather than assumed. A campaign you edited thirty seconds ago will show its new settings immediately and its old numbers honestly, instead of blending the two into a figure that is true of neither.

The app shell is one dark plate, with your content inset as a card

  • The navigation rail and the gutter around the content are now a single dark surface, with the main content sitting on top as a rounded, inset card. The rail runs on a genuinely dark palette rather than a handful of overridden tokens — several rows relied on generic muted-foreground colours that would have been unreadable otherwise — and it narrows slightly, from 224px to 200px. Dropdowns that portal out of the rail stay light, as they should. The overscroll gap at the edges of the shell is painted dark too, so bouncing a scroll on a trackpad no longer flashes a white strip where the frame should be.
  • The rail also stops re-skinning itself when you navigate to Autopilot. Chrome is how you move around the product; changing its appearance per destination made a page change read as a mode switch, which it was not.

Autopilot is back in the navigation, behind two gates

  • The Autopilot entry was removed from the navigation a while ago as an IA simplification — the routes, components and API were all kept and never stopped working, but there was no longer a way to click to them. It now sits next to Automations, which is where it belongs: both are "the agent works without me", with Autopilot at the always-on end of that range.
  • It appears only when two independent conditions hold. An org admin opts the organization in under Settings → Labs, and Nex has made Autopilot visible to that brand. The first is chrome only — it decides whether you can see the entry. The second is the real access control, enforced on every Autopilot endpoint, so the opt-in switch cannot grant an organization access the API is withholding.

Rename a chat without opening it — and without moving it

  • The chat-history row menu gains a Rename entry between Share and Archive. Picking it swaps the row for an input in place, so a conversation can be retitled from the sidebar without opening it. Enter or clicking away commits, Escape cancels.
  • The more useful half of this fix is invisible until you notice it missing. The sidebar orders and buckets chats by when they were last updated, and renaming used to count as activity — so retitling a chat from last week yanked it out of Earlier and dropped it at the top of Today, which is precisely the opposite of what tidying up your history is for. A title-only edit now leaves that timestamp alone. Actually using the chat still bumps it.

Creative remix templates and localized copy

  • Six new creative remix templates are synced into the product, along with refreshed canvas seeds and updated template taxonomy copy in both English and Chinese.
  • Three Settings and Automations surfaces were rendering hardcoded English no matter which language you had selected, and they are now properly localized: the recommended-automation starter cards, the integration cards, and the 966-app Composio catalogue grid. For the automation starters, the seeded prompt is translated too — that prompt is what the agent actually runs, so a Chinese-language user wants it in Chinese, not just the card blurb around it.
  • The Composio catalogue needed a different approach, because those descriptions are upstream data re-synced daily and are far too large to ship to the browser as translations. They get a locale overlay instead, and each translated entry records a fingerprint of the English text it came from. When the upstream description is rewritten, the fingerprint stops matching and the card falls back to English rather than confidently serving a translation of copy that no longer exists.

Integrations: commerce and delivery groundwork

  • DoorDash arrives as a read-only integration. You claim the business you have already authorized to Soku on DoorDash's side, confirm your stores, grant them to a brand, and the agent gains eight read-only actions across orders, sales summaries, transactions, refunds and cancellations, payouts, and — where your account has them — Sponsored Listings and Promotions performance. The read-only posture is structural rather than a policy we are asking you to take on faith: the client exposes only report creation and retrieval, has no general-purpose request escape hatch, and no write verbs at all. DoorDash's write-side Ads and Promotion Management APIs are not touched.
  • One honest note on DoorDash: platform approval is still in progress, so until credentials are provisioned the integration reports a clear not-configured state rather than pretending to connect.
  • SHOPLINE and Uber Eats land as groundwork rather than as things you can switch on today. SHOPLINE's App Store install and attribution funnel is complete but ships dark pending app-store review. Uber Eats is deliberately not visible in the interface at all — not even as a "coming soon" card — because Uber's platform approval has not come through and a card would advertise a partnership that does not yet exist. Both will appear here again when they are genuinely usable.

Reliability

  • LinkedIn Ads metrics could not land. At all. An audit that went past the previously-reported "sync stuck forever" symptom found six further defects, none of them on the OAuth handshake that earlier fixes had repaired — the headline one caused an exception during job setup that killed bootstrap, scheduled and catch-up syncs before any call to LinkedIn was ever made. A LinkedIn-only brand also saw an empty ads namespace, and the agent would claim LinkedIn served breakdown dimensions it never ingests. All six are fixed, and the release includes a recovery migration, because a code-only fix would have left every already-damaged credential broken until each customer manually reconnected.
  • Automation runs triggered against an unusable internal-send configuration used to stay in a running state indefinitely — retrying every sixty seconds, forever, never failing and never succeeding. Errors that are decided before any request leaves the process are now permanent failures, so a misconfigured run tells you it is broken instead of pretending to still be working.
  • Bootstrap recovery is unblocked and a class of deep background jobs no longer runs out of memory, and the demo organization's seeded dashboard metrics are now properly isolated so live provider syncs cannot overwrite them.

Marketing site

  • Six new pages shipped on soku.ai from the daily content run, alongside changelog and sitemap updates.

Creatives arrives as a full canvas for taking apart a winning ad and rebuilding it, the navigation rail becomes a labeled sidebar, org admins get an all-chats view across every brand, Toast POS connects with your own API credentials, and ads queries can finally read reach and ad-level frequency

Creatives: take a winning ad apart, rebuild it, render the result

  • Creatives is a new brand-scoped canvas for the thing every performance team does by hand — take the video that is working, break it into its narrative beats, and reassemble those beats into something new. You drop a source video onto the canvas, split it into segments, rearrange and swap them, and render a finished cut without leaving the page. It ships as a list view of your projects plus a full-screen canvas, and it is in the sidebar now.
  • Generation nodes ship with it rather than following later: image, video, audio and copy generation are available as nodes on the same canvas, so a gap in a reassembled cut can be filled in place instead of exported to another tool and brought back.
  • Two honest limits. Decomposition — the automatic split into segments — is currently available for source videos from the curated library rather than for anything you upload, and it is a lookup rather than a model call, so it is instant and it is also bounded by what has been prepared. And there is no conversational agent inside the canvas yet: this release is the canvas and the generation layer, not a chat sidebar attached to them.

The navigation rail is now a labeled sidebar

  • The icon-only rail has been rebuilt as a sidebar with actual labels, and the entry points that had accumulated around its edges — Files, Skills, CLI, notifications, the setup checklist and billing — are reorganised rather than merely relabeled. If you had a route bookmarked under one of the renamed paths, it still works: the old URLs redirect permanently rather than 404ing.

All chats: who is using AI, and where

  • Organization Workspace gains an All chats page for org admins — every conversation across every brand, including org-level conversations and ones belonging to brands that have since been removed. It has filters for brand, member and source, sortable columns, and a daily-creation chart. Usage already told you how much was spent and Activity told you what happened; this answers the third question, which is who is actually using the product and in which parts of the organisation.
  • Rows that point at an archived or deleted brand render as a badge rather than a dead link, so the list stays honest about what you can still open.

Integrations

  • Toast POS can now be connected with your own Standard API client ID and secret, and the agent gets six read-only actions over the connected restaurants: locations, orders, checks, payments and refunds. One deliberate design note — Toast's partner endpoint that would let us enumerate which restaurants a credential reaches is closed to Standard API accounts, so you supply the restaurant GUIDs and we verify every one of them. If a single GUID is unreachable the whole connection fails and nothing is saved, because the alternative is showing you a location as connected while every agent action against it silently returns nothing.
  • LinkedIn Ads OAuth is fixed. Callbacks that discovered your ad accounts correctly were skipping the account-selection step entirely and never completing the confirmation, which left the credential stuck in a pending state — connected-looking, but not usable. LinkedIn now runs through the same account-selection and import lifecycle as every other platform, with guidance copy specific to it.

Reporting and measurement

  • Ads queries can now read reach, and a new derived frequency metric at the ad level. Reach was already being collected from Meta and TikTok and was already reaching our data layer — there was simply no name for it in the query layer, so it could not be asked for. Frequency could not be derived at all on that path.
  • This matters for one specific decision. Cumulative frequency at the ad level is the first check on whether a creative still has incremental reach left: below roughly 1.5 it is still finding new people, and above about 2 the incremental reach is drying up while reported ROAS can still look healthy — which is exactly the point at which adding budget buys repeat impressions rather than new customers. That call was not possible on Soku data before this. Both metrics are Meta and TikTok only, because Google Ads has no reach field; Google accounts return zero rather than an error, and that zero means "not available here", not "nobody was reached".
  • The agent can also now answer whether a brand is ready to send settled in-store orders as offline conversions into your own Google Ads conversion action or Meta pixel, and tell you precisely what is still missing. It is a read-only readiness check — no upload path is introduced — and it separates "Soku does not request this Google scope yet" from "your token predates it and needs reconnecting", because collapsing those two produces a reconnect instruction you cannot act on.

ChatGPT Ads

  • Historical Ad Group metrics now resolve correctly for archived ad groups. Both the entity and metrics reads ask for archived records explicitly, so a metric row from an ad group you archived months ago resolves to its real ID and name instead of going unmatched.
  • Deploying a ChatGPT Ads campaign now validates parameters against the live API before it runs, and media-plan suggestions are grounded in actual use cases rather than generated freely.

Marketing site

  • A technical SEO pass across soku.ai fixed four template-level defects that had been compounding at roughly five new pages a day: 408 pages were shipping with no social card image at all, 311 titles ran over length, 93 carried a doubled brand suffix, and 358 meta descriptions were over length. All four are now zero. The listing pages for use cases and skills also stopped shifting under readers as they loaded — one of them was measuring well over three times the acceptable layout-shift threshold on mobile.

New chats get their title in about two seconds instead of at the end of the turn, every completed turn now settles its full provider cost exactly once, two chats running side by side stop borrowing each other's third-party API context, and Shoplazza is visible to everyone rather than switched on org by org

Your new chat gets a name while you are still reading the answer

  • Conversation titles used to be generated inside the path that closes out a turn, which meant the title only appeared once the whole turn had finished — and on a long research or video turn that could be a minute of staring at an untitled conversation in the sidebar. Naming is now its own background job, published as soon as your first message is safely stored rather than waiting on the reply. On a turn that took 47.9 seconds to complete end to end, the title landed at 2.4 seconds. Those are measured numbers from the change itself, not an estimate.
  • The old behaviour also had a failure mode worth naming, because it is the kind of thing you would have noticed without knowing why: if a turn ended in a way the API never saw, the conversation simply never got a title at all. There is now a second, later trigger that catches exactly that case, so an untitled conversation gets named on the way out even when the first attempt did not happen.

Billing settles once, completely, per turn

  • Every completed turn now settles against all of the provider calls it actually made, priced at the rates frozen when those calls happened. The point of the rework is that the awkward orderings all converge on the same single charge: a provider call that lands after the turn has already closed, a duplicate arriving from a retry, a call recorded before the turn is finished, and a turn that spans a rolling deploy all end up at one cumulative amount rather than a partial charge or a double one. Turns that fail or that you cancel remain free, exactly as before.
  • Two smaller guarantees come with it. Charging no longer depends on cloud cost data arriving, so settlement is not waiting on a third party to reconcile. And a provider call can only ever be billed to the organisation that owns its turn — calls whose turn is missing, or belongs to someone else, are rejected outright instead of being attributed somewhere plausible.
  • Daily usage reconciliation was also reporting more alarm than it had evidence for. It now builds each day's checks from the providers that genuinely had traffic, keeps "we have no reference to compare against", "the provider is unreachable right now" and "the numbers disagree" as three separate states rather than collapsing them into duplicate alerts, and isolates each provider behind its own timeout so one slow or broken provider cannot abort the whole run.

Two chats at once stay properly separate

  • When a workspace ran more than one chat at the same time against the same sandbox, the record of which conversation a third-party API call belonged to was held in a single shared slot. In a narrow overlap that could attribute one chat's outbound call — and the usage that goes with it — to the other, and it meant per-provider policy was being decided from whichever chat had written to that slot most recently. That identity is now bound to the individual network connection and carried through the whole tool chain, including shell commands and browser automation the agent runs. Concurrency is no longer something the attribution has to get lucky about, and the fix ships with a regression test that runs two real chats at once rather than simulating them.

Integrations and reliability

  • Shoplazza now appears as a standing card in the integrations catalogue for every workspace, with a direct outbound link to get connected. Previously the card was hidden by default and only revealed for organisations that had already been switched on individually, which meant the integration was effectively invisible to anyone who had not been told it existed.
  • Two background-worker faults are fixed. Ads funding notifications were crashing on their own logging — four log lines used a reserved field name, so the act of recording that a notification had been sent could take the task down with it. Separately, the shared queue client could be handed to a second thread in the brief window after it was created but before it was configured, which left that thread using default settings instead of ours; it is now published only once it is fully set up.

BigQuery becomes a first-class integration you can connect with your own service account, the API stops freezing under slow third-party calls, signed-in pages no longer flash a skeleton before they know who you are, long video turns finally finish, and ChatGPT Ads targeting picks up Brazil and Mexico

BigQuery is now its own integration, with two ways to connect

  • BigQuery used to sit in the long tail of the managed connector catalogue, which meant one connection style and no real control over what it reached. It is now a first-class integration card with two connection modes: paste your own Google service account JSON, or keep using hosted OAuth. The service account route is the one to pick if your data team wants the access scoped and auditable on their side — you decide what the account can see before Soku ever touches it, and the connection is validated against BigQuery before it is saved.
  • The agent side is deliberately boring: there is one set of BigQuery actions regardless of how you connected, so the agent never needs to know which route you chose, and neither do you when you switch. Where the two genuinely differ, the interface says so rather than papering over it — an OAuth connection is shown as covering all projects and grouped under whole-account access, instead of being dressed up as a single project it does not actually limit itself to.
  • Running SQL against your warehouse still goes through review before it executes, exactly as it did before. That was not relaxed to make the new integration feel faster, and BigQuery is excluded from unattended Autopilot runs.

Reliability

  • The API had been going fully unavailable, repeatedly, for the last few days. The cause was that a handful of calls out to storage, billing and connector services were made in a way that blocked the server's main loop — one slow response from any of them froze everything else for close to a minute, which was long enough for the health checks to conclude the server was dead and take replicas out of rotation until nothing was left to serve traffic. Every one of those calls on a reachable path has been moved off that loop, health checks now tolerate a brief stall instead of escalating it, and an automated check blocks the same mistake from being reintroduced.
  • Long video analysis turns could hang without ever settling. They now report progress while they work, honour Stop and their own time limit through a single shared cancellation path, and clean up the media processes they started rather than leaving them running — so a long turn either finishes or ends, and a retry after that is safe.
  • Brand Skill synchronisation is substantially faster on workspaces that are already up to date, because it now compares content fingerprints instead of downloading and scanning every file body on each run. Skills you have edited yourself are still protected and left alone, and sync summaries now report accurate per-Brand counts and how long the run actually took.

Interface

  • Signed-in pages stop flashing. The server already knew who you were when it rendered the page, but the part of the interface that tracks login state ignored that and waited for a round trip before it would admit you were signed in — so a cold load showed a skeleton first and the real page second. That identity is now handed straight to the page, which removes the placeholder from six places at once, including the full-page skeleton on the brand chat screen, the marketing header briefly offering Get Started to people who are already signed in, and the member and Agent Email settings pages briefly misreading admin permissions. One honest limit: if you have been idle for more than fifteen minutes, opening a page still goes through the separate recovery screen — that path is unchanged.
  • In the Finances table, the 30-day spend figure, the status badge and the Fund account button could overlap each other and become unreadable at some window widths. The row now reserves proper space for each, keeps large figures contained, and reveals a value in full only when it is genuinely cut off — reachable by mouse, keyboard and touch.

ChatGPT Ads

  • Campaign targeting in the ChatGPT Ads intake now covers the nine markets in OpenAI's public availability table — the US, Canada, Australia, New Zealand, the UK, Japan, Korea, Brazil and Mexico. Markets outside that table remain unavailable until OpenAI lists them as Available. Worth being precise about what this list is: it is where a campaign can target, not where an advertiser account can be registered. Those two are not the same, and the docs now say so explicitly rather than leaving you to find out the hard way.

A single Meta outage no longer fails a whole account sync, conversion reporting stops burning itself on work that was already redone, Shoplazza joins the e-commerce integrations, and broken images on two public pages are fixed

Your ad data keeps syncing through platform blips

  • Meta returns two completely different failures under the same error code, and both arrive as an HTTP 500. One of them is Meta's own documented temporary fault, which recovers by itself — but Soku was treating it as a permanent error, so a single Meta blip could fail an entire account's sync with no retry at all. Those faults are now recognised and retried, after the existing window-shrinking has been tried first, so a transient wobble on Meta's side no longer costs you a day of reporting data. The same fault is now also retried on the older per-dimension sync path, where it had been quietly recorded as a partial success.
  • Conversion reporting stopped fighting itself. When two syncs covered the same account and day, the older one could never finish — and it would rebuild the same data set up to nine times before giving up, crowding out the newer refresh that was going to supersede it anyway. Being superseded is now treated as a normal, successful outcome: the older refresh stops after one attempt and steps aside. Genuinely corrupt state still fails loudly, as before.
  • The combined-breakdown cache could get two large Google accounts stuck in a loop that made no progress at all — each run timed out just before it saved its position, so the next run started from exactly the same place. Batches now stop while there is still time to save their progress, and if a run is cut short anyway, the work that did finish is recorded instead of discarded.
  • Background jobs now get their own isolated connections rather than reusing ones cached from an earlier, already-finished job. That reuse could silently drop approval callbacks and review notifications on later jobs in the same worker — so an action you approved could look approved and never notify anyone.
  • Sync failures are now labelled correctly as retryable or permanent, so a deterministic platform rejection is no longer reported as something that will fix itself on the next attempt.

Integrations

  • Shoplazza is now a documented integration, with a full page covering the connection workflow, use cases, plan-by-plan pricing and how it compares to the alternatives — and it appears in the e-commerce group on the homepage. Pricing on that page is taken from Shoplazza's own pricing page rather than estimated.

Marketing site

  • Images on the agencies page and the free competitor analysis page were returning errors instead of rendering. When image binaries moved to the CDN in July, two directory paths kept pointing at the app's own origin, which meant nine logos and avatars silently broke on two public pages. They now load from the CDN, and a build-time check makes it impossible to reintroduce the same class of broken path.
  • New guides published on cross-channel marketing attribution, comparing multi-touch attribution models, and UTM naming conventions for paid media, plus a Pika AI tool page and a Descript integration page.

Shared conversations can now be replayed like a recording, Sprout Social joins the read-only integrations, Brand access gets explicit per-person exclusions, ad changes are validated before they reach an approval queue — plus a cookie banner that actually gates the tags and a plain-English data-use page

Shared conversations, replayed

  • A public share link can now be watched instead of just read. Hit Replay on a shared conversation and it plays back like a recording — text reveals as it was written, tool calls run and then resolve, thinking beats land in order — which is a much better way to show a prospect or a colleague how the work actually happened than a wall of finished transcript. The static view is still the default, so every link you have already sent behaves exactly as before; add `?replay=1` to a share URL if you want it to autoplay on open.
  • One honest note on this: the pacing is reconstructed, not recorded. We only ever persisted the finished order of a conversation, so replay re-times it rather than replaying the original keystroke timing. Every existing share link gained replay with no migration and no re-sharing.
  • Artifact links inside a shared conversation open properly again. An external link with no explicit target used to hijack the sandboxed preview frame and land on an "Application Error" white screen — clicking "Open Soku" from a share was the common way to hit it. Those links now open in a new tab, and the fix is applied at render time, so every previously shared artifact benefits without being re-published.

Integrations

  • Sprout Social is available as a read-only integration. Paste an API token on the Integrations page (Sprout Settings → Global Features → API; it needs an Advanced plan with API permissions), Soku verifies it, discovers the customers it can reach, and stores it encrypted. Once a customer is authorized for a Brand, Soku can pull Sprout analytics into its own analysis. The token never enters the agent sandbox.
  • Because Sprout does not publish rate-limit headers, Soku applies its own ceiling per credential rather than discovering the limit by getting throttled. And when Sprout silently drops a metric it does not recognize, the response now tells you which metrics came back empty instead of quietly returning a shorter answer.
  • Shopify is temporarily off. Its card on Settings → Integrations stays visible but now shows "Coming soon" rather than a Connect button, so nobody starts a connection that cannot complete.

Who can see which Brands

  • Brand access moved to explicit exclusions. Members can reach the Brands in their organization by default, and an admin removes access per person, per Brand — rather than the previous model where each Brand had to be granted before anyone could use it. Nothing an existing member could do goes away unless a Brand is explicitly excluded for them.
  • The exclusion is enforced at the next admission everywhere a person can arrive — web, API, CLI, device login, invite landing, share links, onboarding and notifications — not just where the UI hides a link. An excluded Brand returns a plain not-found rather than a permission error, so the exclusion itself is not advertised.
  • Share links are re-checked every time the sharing dialog is opened, so a scope that was valid when a link was created stops being listed once the underlying access is gone.

Ad changes are checked before they reach you

  • Deterministic contract failures in a Google, Meta, TikTok or ChatGPT Ads payload are now caught before an approval record is written. Previously a malformed change could sit in your approval queue looking legitimate and only fail at the platform. Now it fails at submission with a clear reason, and nothing lands in the queue for you to approve.
  • The same path was hardened against malformed input more generally — wrong types and out-of-range values return a specific validation error instead of a generic server failure. New campaigns are still created paused by default.
  • ChatGPT Ads upstream failures now produce structured diagnostics we can actually act on, with no provider-supplied text, advertiser PII or credential material carried into logs or agent-visible errors.

Privacy and data use

  • The cookie banner now does what it says. Optional analytics and advertising tags are held until you accept them, rather than firing on load with a notice shown afterwards. Declining keeps them off, and your choice persists.
  • There is a plain-English data-use and security page at /data-use-security, and the legal pages and product claims across the marketing site were reconciled against it — so what the site promises about how your ad and analytics data is handled matches what the product actually does.

Reliability

  • Connecting a new organization to an ad account it shares with an existing one is dramatically faster. Verified ad-metrics history is now a reusable asset keyed by platform, account and date range instead of being rebuilt per organization, so a new workspace validates its own credentials and then syncs only the genuine gaps. Unlinking and reconnecting still isolates organizations from each other.
  • A blank assistant reply is now an error you can retry. Turns that finished with no visible output used to persist as completed, leaving an empty bubble with no explanation and no way forward; they are now marked as failed with a retry action, and existing blank messages already in your history render the same way.
  • A production incident on the night of 08-05 left ad-platform work queued behind dispatches that could never settle — the queue head retried forever and starved everything behind it. Those non-terminal dispatches are now settled when their retry fence clears, and three separate provider rate-limit gaps that contributed were closed.
  • Re-pasting a token for an integration that covers multiple accounts is now refused if the new token cannot reach every account already imported under it — with the missing accounts listed — instead of being written first and discovered broken later. Reconnecting updates the credential you actually clicked rather than creating a second row.
  • Skills you created, uploaded or edited yourself are no longer touched by template reconciliation. Only Skills with positive template provenance can be updated or pruned; everything else is explicitly skipped.
  • The new-chat screen got its top spacing back, scaled to the viewport rather than pinned to a fixed value.

Chat now shows you the plan it is working through, long conversations stop melting the browser tab, organization chat gets the full composer back, and two new research integrations land — plus ChatGPT Ads gets a proper CLI

Chat shows its work

  • When Soku is working through a multi-step job, the plan is now visible by default. The checklist renders as its own card in the transcript with a done-of-total count, instead of being folded away inside a collapsed "used N tools" group you would never think to open. Below the composer, a persistent progress bar carries the current step and the same count for as long as the plan is unfinished, and expands to the full checklist when you want it.
  • The spinner label stopped saying "Generating…" through everything. It now reports what is actually happening — preparing the workspace, running a specific tool, or whatever status the agent has published for the step it is on.
  • Streaming replies scroll smoothly instead of jumping a step at a time, and scrolling up now interrupts the auto-follow immediately rather than fighting you back to the bottom. The composer was restyled to match: a soft shadow instead of a hard border, a plain-text model selector, a round stop button, and compact file-attachment cards with a type icon, filename and size.
  • Historical plan cards stopped lying. A checklist you scroll back to shows the state it was in when that message was written — finished items no longer spin forever, and stale in-progress steps render as a dashed circle rather than an animated arc that suggests work is still happening.

Long conversations stop breaking the tab

  • A long chat used to mount every message at once — one very large conversation was enough to push a browser tab past 11 GiB and kill it. The transcript is now virtualized, so only the messages near your viewport are actually rendered, while the rules that need to see the whole conversation (follow-up suppression, review and batch cards, deduplication) run in a data layer before anything is drawn.
  • The API can now return a window of a conversation — the last N messages, a page from a cursor, or the region around a specific message — instead of the entire tree every time you open a thread. Requests that ask for no window are byte-for-byte identical to before, so nothing changes for anything already relying on the old response.
  • Previews got a memory budget. Chat pages now hold an LRU-accounted byte budget across artifact previews, thumbnail fetches wait until the tile is actually on screen, and heavy viewers compete for a limited number of slots. Anything that does not get a slot degrades to a clickable tile you can still open in full.
  • With that budget in place, HTML artifact thumbnails are back — you can see what a report looks like from the transcript again, rather than a generic "open to preview" tile. Reopening a preview immediately after closing it no longer shows a blank frame.
  • Two hard caps landed underneath all of this: HTML artifacts over 25 MiB are rejected at upload with an explanation the agent can act on and retry, instead of being stored in a size no viewer could ever render; and tool result text is capped at 64 KiB on the wire and in storage, so one runaway command cannot inflate the live stream, the saved message, and the share snapshot at the same time. The model still sees full tool output — this only bounds the copy that travels to your browser.
  • Report images are no longer inlined into report HTML as multi-megabyte base64 blobs. They are uploaded and referenced as ordinary hosted URLs, which is what made the reports heavy in the first place.

Organization chat

  • Organization chat now uses the same composer as brand chat. Model tier selection, file attachments, slash commands and @-mentions of resources all work there — previously it was a reduced input that quietly dropped them. Brand selection stays as the one organization-specific control, and the brand picker is searchable and scrollable, which matters once a portfolio runs to dozens of accounts.
  • The brand focus you choose when starting an organization conversation is now frozen for that conversation rather than silently shifting later, so a thread keeps answering about the same set of accounts you opened it for.

Integrations

  • SerpAPI is available as a built-in integration for live search results, billed through your Soku balance with no separate key to manage. Usage shows up in vendor credits and costs alongside every other provider.
  • Jina Reader is available to the agent for turning a public URL into clean, readable content — useful when you ask Soku to look at a competitor page, a policy document, or a landing page. Requests run through managed egress with the credential injected server-side, and token usage is billed and visible.

ChatGPT Ads

  • The Soku CLI now has a proper ChatGPT Ads command tree — 17 subcommands across account, campaign, ad group and ad — matching what Google and Meta already had. Every mutation requires an explicit account id and a change summary, so scripted changes stay reviewable. The bundled skill was rewritten around the current campaign → ad group → ad model instead of the deprecated ad-unit flow.

Reporting

  • Chinese, Japanese and Korean text in reports now renders correctly everywhere. Latin type still uses Soku's own faces, with a self-hosted Noto family filling only the CJK glyphs, and the same stylesheet is used for the live preview, historical shares and the PDF export — so a report no longer looks like three different documents depending on where you open it. PDF export fails loudly if a required font is missing rather than silently substituting a system fallback and shipping tofu boxes.

Reliability

  • Account bootstrap — the first heavy data pull when a brand is connected — now runs as an on-demand job that is created for the work and removed afterwards, instead of a pool of always-on workers. It brings its own recovery, capacity limits and rollback, so a failed bootstrap resumes from its checkpoints instead of restarting from zero.
  • Chat status text expires instead of getting stuck. Raw identifiers pasted where an ID was expected now return a clear error rather than a 500. Agent artifacts are served under the correct per-brand path. Pressing Enter to commit an IME candidate no longer sends the message mid-word when typing Chinese, Japanese or Korean. The empty composer no longer shows a stray scrollbar.

Organization chat gets its actual screen, platform automation now proves what it changed on Google, Meta, TikTok and ChatGPT Ads, one Slack connection covers every brand in your organization — plus two chat annoyances fixed

Organization chat

  • The organization-level conversation we described last week now has a screen to hold it. There is a proper landing page, thread view and history panel at the organization level, plus a focus selector that lets you narrow a single turn to a subset of brands instead of always asking across the whole portfolio — useful when the answer you want is about three accounts rather than thirty.
  • Organization chat also stops hiding inside your bill. Its usage was previously lumped into Unattributed; it now has its own bucket on the overview, in the usage table, and as a drill-down, so cross-brand questions are separated from brand work rather than showing up as an unexplained total.

Automation you can audit

  • Platform AI automation controls and drift auditing now cover all four ad platforms — Google, Meta, TikTok and ChatGPT Ads. The important part is what counts as done: after Soku writes a change, it reads the state back from the platform before treating that state as authoritative. If the read-back does not confirm the write, you get a partial-success result with an explicit recovery path instead of an echo of the request dressed up as a platform-approved change.
  • Approved settings are re-checked on a schedule — a 48-hour sweep plus a weekly full audit of current state — so a change made outside Soku surfaces as drift rather than sitting undetected until the next time someone opens the account. Accounts that were disconnected, revoked or soft-deleted are deliberately kept in that history instead of vanishing from the record.
  • The Automations home screen now carries a permanent entry point for this. You can see real coverage, confirm it explicitly, and switch on the two protected agent automations from the page itself, rather than having to know the right thing to say in chat.

Integrations

  • Slack now works across an organization. Any active brand can use a live Slack connection owned by the same organization, so connecting Slack once no longer means reconnecting it brand by brand. The permission stays scoped to Slack and still enforces tenant, source and availability checks — it does not quietly widen access to other integrations.

ChatGPT Ads

  • Every ad Soku authors on ChatGPT Ads now has to carry a real, stable name, and that name has to be confirmed by reading the ad group back from the platform before the write is accepted. Campaign activation is held behind a matching check: Soku will not flip a campaign live unless a direct read from the provider proves it is the OpenAI-network campaign it expects. Accounts with existing unnamed ads get a repair path that plans before it touches anything and never activates or submits for review on your behalf.

Chat fixes

  • Up and Down arrow chat switching works from an empty composer. Because the composer takes focus when a chat opens, the shortcut was unreachable in exactly the moment you would use it — you had to click away from the input first. It now works while the composer is empty and hands the arrows back to normal caret movement as soon as there is text. IME composition is left alone, so typing in Chinese, Japanese or Korean is never interrupted mid-word.
  • The new-chat screen no longer has a large blank band above the greeting. A hard-coded offset left several hundred pixels of empty space you could scroll up into, and on shorter windows it pushed the greeting off the top with no way to scroll back. Centring is now handled by the layout itself, so the greeting sits where it should at any window height.

Reliability

  • Brand template sync tolerates files you own. A stable, customer-protected item could previously fail an entire sync shard; those items are now recognised and reported as protected instead of taking the whole batch down with them, while genuine races, conflicts and errors still fail closed and retry.

Ask a question across every brand at once with organization chat, see the actual creative before you approve it, agencies can put their own brand on Soku, usage pages now answer where the credits went — plus a public Shopify App Store listing

Organization chat

  • You can now hold a conversation at the organization level instead of inside one brand. The agent runs in its own organization sandbox and can read every brand's workspace, so questions that span your whole portfolio — which brands are overspending, where the same creative is being reused, how last month compared across accounts — can finally be asked in one place. Every brand is mounted read-only and the organization agent never holds a credential that can write to a brand, so the reach is deliberately one-directional.
  • A related gap is closed along the way: a session without a brand used to be shown the full catalogue of capabilities while every one of them refused to run. What is listed and what is callable are now decided by the same rule, so the tool list you see is the tool list that works.

Approvals and ad creative

  • Approval cards now show you the ad. Previously every action awaiting your approval was rendered as the same key-and-value table, so approving a new ad creative meant approving an opaque image reference — you could not see the thing about to go live. Creative approvals now render as a feed mock-up with the real asset, page name, body copy, landing domain, headline, description and call to action, covering all six of Meta's mutually exclusive creative variants including carousels. 109 gated ad-writing actions were mapped to purpose-built layouts; anything unmapped renders exactly as it did before.

For agencies and partners

  • Partners can now put their own brand on Soku. A partner gets its own signup page at /partner/{slug}, users who arrive through it are attributed to that partner, and once they are in the product the partner's logo, favicon and browser title replace Soku's. Ending a partnership genuinely reverses this: old links, live sessions and stale cookies all stop honouring a deactivated partner rather than leaving co-branding stranded in someone's tab.
  • Self-serve upgrade prompts are hidden for partner-managed accounts, since billing runs through the partner, and the partner's operator is granted admin access automatically when the partnership starts and has it revoked when it ends.
  • Admins can sign in to the Admin Console with Google, and an account that was pre-provisioned by email is claimed on first login rather than needing to be created twice.

Usage and billing

  • The organization usage, per-brand drill-down and billing pages were rebuilt to answer a different question. They used to be an audit log of events; they now attribute cost, so you can see which brand, which conversation and which automation actually consumed the credits without reading a ledger line by line.
  • Turn counts and token counts were removed from these views entirely rather than just hidden, and replaced with a credits-by-kind split. The two numbers were being read as if they tracked each other and they do not: over a 30-day sample, 67% of credits came from third-party API calls that carry no tokens at all, 88% of tokens were cached reads priced at roughly a tenth of normal input, and two days in the same month differed by 60× in credits-per-token. Showing them side by side invited a comparison that was never valid.

Integrations

  • Soku is now installable from the Shopify App Store as a public app, alongside the existing connect-from-Settings flow. The install lifecycle is hardened so a delayed or out-of-order callback cannot overwrite or remove a newer installation, offline tokens rotate before they expire, and uninstalling triggers full historical redaction for that shop.
  • ChatGPT Ads campaigns are now restricted to OpenAI as the delivery platform, so a campaign cannot be created against a platform that cannot serve it.
  • TikTok is now a first-class branch in the ad deployment and reporting skills rather than a Meta-and-Google-shaped path with TikTok bolted on.
  • Connected Composio toolkits are discoverable from how you describe a task rather than only by their catalogue name, Google Ads field names survive round-trips unchanged, and the integrations contact link points at the right address.

Chat and onboarding

  • A first-time SEO or GEO request now routes into a complete SEO Hosting draft rather than a generic answer, and the first generated page is grounded in your actual site: if the page capture comes back blank, Soku retries with a real browser before falling back to imagery from the official page. The draft is visible in Settings before anything is published. Brand names written only in Chinese are accepted, and URL detection stops at Chinese punctuation instead of swallowing it.
  • Onboarding asks which language your brand voice should use, the model picker explains what each tier is for instead of listing names, and the chat history panel can be dragged to the width you want.
  • Markdown documents export to Google Docs again, artifact previews distinguish a network failure from a missing file and offer a retry, and sidebar navigation shows skeleton states instead of a blank pane while a section loads.

Reliability

  • Three ways a conversation could get stuck are fixed: agent events are retried after a response read timeout, turns are preserved when an acknowledgement arrives slowly, and a queued turn no longer expires waiting behind a long-running one. Ownership acknowledgements for running executions recover instead of stranding the run.
  • The conversion distribution selector stays visible instead of disappearing at certain data states, combo recovery remains available after a failed attempt rather than locking out, and report templates are visible by default with the reveal no longer dependent on JavaScript. Settings conversion guidance no longer leaves gaps where no advice was shown at all.

Marketing site

  • A new visual story on the consultant operating system — how an independent consultant runs acquisition, delivery and reporting as one loop rather than three disconnected tools.
  • The consultancy affiliate calculator now states plainly what its earnings figures assume, so the projection reads as a model rather than a promise.

An agency workspace for people who run several brands — usage and cost per brand, a cross-source activity log you can export, and billing moved up to the organization — plus a public ad creative library, chat reports exported to Google Docs and Slides, and invoice details collected at checkout

Organization workspace

  • If you run more than one brand, there is now a workspace above them. Open your organization from the brand switcher and you land on an overview that combines every brand you have: credits, turns, ad spend, a health badge, and recent activity, over a 7-day or 30-day window. Brands with usage that cannot yet be attributed appear in explicit Unattributed and Unassigned buckets rather than being quietly dropped from the totals.
  • A dedicated usage and cost page breaks consumption down per brand over any date window you pick, not just a preset range. Each row carries a trend pill, sortable Change and Growth columns, a daily sparkline, and a coarse split showing how much came from interactive chat versus automation versus Autopilot — so "Automation 67%" is readable at a glance instead of inferred. Clicking a brand drills into the individual charges behind the number, each traced back to the conversation or automation run that caused it.
  • Historical usage recorded before per-brand attribution existed is no longer stranded in the Unattributed bucket. A backfill now recovers brand attribution for past chat turns and for third-party API calls made from web sessions, so the overview reflects the brands those charges actually belonged to.
  • Billing has moved from an individual brand's settings up to the organization, where it belongs when several brands share one subscription. Old billing links redirect, and returning from Stripe keeps its query parameters intact. Starting a checkout, opening the billing portal, or cancelling now requires organization admin rights, and the interface reflects that up front — previously a non-admin could start the action and hit a dead end.
  • A new activity page gives the organization a single audit timeline drawn from four sources at once: agent write actions and their approvals, organization changes, member joins, role changes and removals, and billing events. Filter it by kind, brand, or time window, load more as you scroll, and export the filtered view to CSV. Member changes are audited for the first time — previously they left no record at all.

Admin access

  • Admin accounts can now be restricted to specific organizations, so a person who supports two customers sees only those two. Operators can also pre-provision an admin by email — role and organization scope set before that person has ever signed in — and change an existing admin's organization visibility later. A pre-provisioned account is deliberately unusable for signing in until it is claimed, and shows as Pending until then.

Ad creative library

  • There is now a public ad creative library at /ad-library: a browsable catalogue of real ad creatives with search, industry filters, a detail view that plays video, and load-more paging. Signed-in users can hit Remix on any creative to carry it straight into a new chat as structured ad context, and the same creative starters now appear on the New Chat screen with Remix on hover.

Reports and exports

  • An agent-generated report can now leave Soku as an editable document. Open a report artifact in fullscreen and the new Export menu sends it to Google Docs or Google Slides in your own Drive — the agent rebuilds the content in the destination format and hands back the edit link. Brands without Google Docs connected get a short connect guide instead, and every write still goes through the normal approval gate.

Billing and pricing

  • Stripe Checkout now collects the business name and billing address needed for a usable invoice, and offers country-aware tax ID collection. Credit-pack purchases and ChatGPT Ads funding now generate an invoice after purchase rather than only a receipt, and updated billing details are saved back to your customer record.
  • The current paid pricing is now labelled a limited-time offer, consistently on the public pricing page and in the in-app upgrade dialog.

Integrations

  • The hosted-app connection catalogue is now derived from the provider's live catalogue instead of a hand-copied snapshot that had drifted by 281 apps — that many entries in Settings were buttons that could never connect. Apps that only offer a GraphQL API are now labelled as such instead of being presented as REST, which previously meant they could be connected but not used. Documentation links went from covering 8% of apps to 86%.
  • Integration health now recovers on its own more reliably: provider health is reconciled into durable state, a stale failure can no longer overwrite a newer recovery, reconnect prompts point at the exact account that needs attention, and an account whose credentials have gone bad is caught at the moment an action runs rather than failing deep inside it. Abandoned half-finished connections are cleaned up.
  • The Built-in tab on the integrations page no longer links to a per-app detail page — that page only repeated the card's own description, so the cards now carry everything and the old routes are gone.

Chat and agents

  • Approval cards are usable again on large actions. A real payload — a Google Docs update with 76 request objects — had stretched one approval card to over 17,000 pixels tall, pushing the Approve and Reject buttons entirely off screen, which made the action impossible to approve at all. The buttons now sit outside the scrolling parameter view, so they are always reachable. The synthetic follow-up message that used to appear as though you had typed a string of identifiers and internal instructions is now hidden.
  • Submitting a large attachment no longer hangs the browser. Soku now sends the already-uploaded file reference instead of re-reading the file contents into memory at submit time, which was saturating the CPU on big files. Attachment ownership is re-checked at the moment of sending across every place you can compose a message.
  • Agent-sent emails no longer leak internal tool-protocol fragments into the body. Malformed arguments are repaired at the shared agent boundary before anything is saved, delivered, or sent, with a second check at email freeze time in case something slips past.
  • Document analysis now works anywhere inside a brand's workspace instead of only the chat-attachments folder. This was the largest remaining cause of failed agent runs — around 60 a week — because an agent that had just written a screenshot or extracted frame into its own working folder could not then analyse it. Files outside the brand workspace are still refused, and agents are now told to copy such a file in first.
  • Two chat stream faults are fixed: a stalled stream is now recovered by the connection that owns it, and a local end-of-turn can break a stale server-side block instead of leaving the conversation stuck.
  • Files with .ico, .avif, and .bmp extensions now show an image thumbnail in Context Hub instead of a generic placeholder card.

Language and interface

  • The skill Marketplace and the @ mention picker now show official skill names and descriptions in your own language, while skills you uploaded keep exactly the name and description you gave them. Skill slugs are shown so the canonical name is always visible, and an inserted @ mention stays canonical.
  • The Workbench drawer and the Context Hub actions reachable from it are now fully translated for Chinese users — file actions, dialogs, empty states, note editing, and context chips — with artifact terminology rewritten to read naturally rather than literally.
  • New-chat sample questions are now written in both English and Chinese rather than always sending English, hovering one shows the full prompt it will send, and the composer now measures full-width characters correctly so a wide Chinese prompt reflows instead of overflowing.

Reliability

  • The dashboard data-readiness endpoint no longer returns a server error for brands in a specific mid-sync state — around 60 failures a day on one brand — caused by comparing two timestamps recorded in different formats.

Marketing site

  • Nine more software and SaaS partners were added to the partnerships page: Ribbi, Liii STEM, Token Harbor, Maxuod Shift, Oumomo, Manga Capsule, Dory, FastMoss, and Floatboat.

ChatGPT Ads keeps the countries you approved, agents can read an automation's actual result and always know what time it is, quality warnings before an SEO page publishes, a one-command migration from Claude, and a rebuilt homepage

ChatGPT Ads

  • The countries you approve on a ChatGPT Ads campaign are now written to every ad group inside it. Previously the campaign carried your targeting but each ad group silently kept the provider default of All countries, so a campaign approved for two markets could serve everywhere. Soku now also refuses to write when a group's targeting conflicts with the campaign's, and fails loudly if the provider reads back a different country set than the one sent.
  • Freshness alerts no longer fire for ChatGPT Ads accounts that have no live Pixel key to sync with. Those scopes cannot produce a sync run at all, so the daily "data is stale" warning was noise — a shared account still alerts normally when a sibling organization does have a working key.

Agents and automation

  • An agent can now fetch the actual final result of a specific automation run — the text it produced and the files it wrote — instead of only its status. Asking "what did last night's budget check actually say?" now returns the answer rather than a green checkmark. Run history, exact run status, scoped artifact metadata, and re-running a past run are all available too, each permission-checked against the run you asked for.
  • Every agent turn now carries a verified timestamp taken from the server at the moment the turn starts, along with your timezone and UTC offset. Relative dates like "yesterday", "last 7 days", or "month to date" now resolve against the real current time instead of a stale value carried over from an earlier session — including across midnight and daylight-saving changes.

SEO hosting

  • Publishing or uploading a hosted SEO page now surfaces quality warnings before it goes out: a page with no images, a page whose body has no internal links, a canonical URL pointing at a domain you have not connected, and CSS that names a font it never actually loads. The warnings are advisory — they tell you what is wrong and let you decide, rather than blocking the publish.

CLI and Context Hub

  • You can now move an existing Claude workspace into Soku's Context Hub in one step. Install the new migrate-from-claude skill from your own agent and it walks through both paths — a local project directory, or a claude.ai export — and sorts what it finds into Context Hub documents, brand skills, or MCP server config. The /cli page now also documents the soku context commands, which previously existed but were undiscoverable.

Integrations

  • Shoplazza stores now appear as a normal platform card in the integrations grid rather than a separate list pinned underneath it, and you assign a store to a brand in the same Manage dialog used by every other platform. The card only shows for organizations that actually have a store installed from the Shoplazza App Store.

Reliability

  • Out-of-credits notifications now reach organization admins. A background worker fault meant the alert was being dropped silently when automation dispatch was blocked for billing, so the first sign of a stopped automation was the automation not running. The notification now sends correctly.
  • Dashboards stay readable while a brand's historical data is still backfilling — accounts with usable cached data are shown instead of the whole report waiting on the slowest one. When Meta rate-limits a backfill, Soku now waits for the interval Meta specifies and resumes, rather than spending its retry budget and giving up.
  • Chat's regenerate, edit-and-resend, and switch-branch actions no longer fail with a raw validation error when used on a message that is still being written. All three now check that the message actually exists on the server before acting.
  • When an agent tries to write a file larger than the 16 KB per-call limit, the error now states the exact byte count and how many chunks of what size to split it into. Agents previously guessed, retried at a still-too-large size, and stalled partway through writing a long document.

Interface

  • The Library and Marketplace icons in the left rail no longer keep a focus outline after their hover menu closes.

Marketing site

  • The soku.ai homepage is back — it had been temporarily replaced by the agencies landing page for a campaign — and has been rebuilt against the new design: an editorial headline treatment, painted artwork behind the problem, solution, and growth-channel sections, and a layout that reflows properly on a phone. The rest of the marketing site now shares that visual language.

Shoplazza store data for agents and CLI, a first-run guide for Autopilot, onboarding in your own language, honest dashboard and finance freshness, and a Google Ads connect flow that warns you before you leave

Integrations

  • A connected Shoplazza store is now readable by chat, agents, and the Soku CLI — shop profile, product list and detail, and order list and detail — so you can ask about catalog and order data in the same conversation where you plan and review ads, instead of exporting it by hand.
  • The hosted-app catalog no longer lists apps Soku already supports natively, so you connect Google Ads, Meta, TikTok, and the rest through the purpose-built card instead of picking between two entries that look identical.
  • The integrations directory search box now sits on the app-list header row, so filtering the platform grid and the app catalog happens where you're already looking.

Connecting Google Ads

  • Before Google Ads authorization sends you to Google, Soku now shows a short preflight screen explaining the two places people get stuck: Google's consent screen lists every permission as a separate unchecked box that must be ticked, and the hosted connect link asks for an account id that Soku never uses — you pick the real accounts afterwards inside Soku. Fewer connections now come back unable to read the account.

Autopilot and onboarding

  • A brand that has never run Autopilot now sees a first-run screen instead of eight empty panels: what Autopilot is, what the initial scan actually reads (account structure, recent performance, and your brand context), the guarantee that nothing is written to an ad account without your approval, and a single Enable button.
  • Onboarding now generates your launch pack — the starter tasks and the recommended automation — in the language you ran onboarding in, instead of always sending English. Chinese onboarding produces Chinese first messages.

Reporting and finance accuracy

  • Dashboards now handle accounts whose local reporting date is ahead of UTC instead of sitting on "Preparing" indefinitely, and show non-blocking freshness for a date still being collected. A first warm-up, a genuine historical gap, an integration problem, and a real zero are now four distinct states rather than one ambiguous blank.
  • The finance overview now refreshes stale balances when you open it and labels pending, delayed, and errored accounts truthfully, instead of presenting an old snapshot as the current balance. Meta's available budget is computed from the spend cap minus amount spent, with currency and unit conversion verified end to end.
  • Meta historical backfills no longer fail at the platform's 37-month lookback edge — the date clamp now carries a safety margin, so a deep-history import completes instead of erroring out on the boundary date.
  • GA4 traffic breakdowns now show ChatGPT Ads click traffic as "chatgpt-ads" rather than exposing the upstream vendor hostname as a traffic source. Historical data is aliased automatically with no backfill needed.

Reliability

  • Emailed agent deliverables now actually arrive as attachments, and outbound agent email is rendered in the Soku brand frame with proper styling instead of going out as plain text.
  • Site-audit PageSpeed checks no longer report a false "quota exhausted" and give up — long-running checks now complete, and a genuine timeout is reported as a timeout rather than as a quota error.
  • Signup and login rate limits are now sized for shared networks. Offices, campuses, and carrier-grade NAT put hundreds of unrelated people behind one address, and the old per-address ceilings made them ration each other into 429 errors. Per-email and per-code protections are unchanged.
  • The /llms.txt, /llms-full.txt, and robots.txt endpoints are restored and now verified on every release before traffic is shifted, so AI crawlers and search engines keep reading the site correctly after a deploy.

Marketing site

  • Added Anyway to the Partners & Friends page.

TikTok Ads is now generally available, dashboards show honest coverage instead of failing, and a cleaner Shoplazza and Adjust connect flow

Integrations

  • TikTok Ads is now generally available to connect — the feature flag is gone, so every workspace can link a TikTok Ads account and pull creative and performance data without a waitlist.
  • The Shoplazza connect flow now parks your store as soon as you authorize and moves brand-binding into Settings, so connecting and then choosing which brand a store belongs to are two clear steps instead of one crowded screen.
  • Connecting Adjust now deep-links straight to the right API-token page and tells you up front when MCP access still needs to be enabled, so mobile-measurement setup stops dead-ending.
  • Reconnecting a hosted app through Composio now refreshes your onboarding status immediately, so a freshly connected account shows as ready without a reload.

Dashboard reliability

  • Dashboards now render whatever data is available instead of failing an entire brand with an error when only some ad accounts are connected or cached — partial coverage and disconnected accounts are shown honestly rather than hidden behind a blank screen.

Ads data accuracy

  • Ads reports now default to the correct account for brands with a single connected account, so metrics resolve without you having to pick the account by hand.
  • ChatGPT Ads campaign bindings are now verified before actions run, so edits and deployments target the intended campaign.

Reliability

  • Site-audit PageSpeed checks now route through a stable host and no longer fail with rate-limit (429) errors, so audits complete on the first try.
  • Brand creation recovers cleanly when storage is briefly unavailable, so setting up a new brand no longer stalls under load.
  • Large chat edits that exceed the in-place size limit now regenerate the whole file instead of failing, so long documents keep saving.

2,000 signup credits, plan-based ad-account limits, AppGrowing and TikHub creative intelligence, redirect-based app connections, and a large sync reliability pass

Credits, plans, and account limits

  • Every new organization now starts with 2,000 signup credits instead of 10, so a new team can run real chat, research, and image generation before deciding on a plan.
  • Ad-account connections are now capped per channel by plan — 3 on Free, 10 on Starter, unlimited on Pro and Enterprise — across Google, Meta, GA4, and TikTok. Existing connections are untouched, and disconnecting then reconnecting always restores what you already had.
  • The OAuth account picker now shows the limit while you choose, so over-selecting is caught up front with an upgrade path instead of failing after you hit import.

Connecting accounts

  • Connecting Gmail, Notion, Google Workspace, Monday, and other hosted apps now uses a full-page redirect instead of a popup, so authorization no longer gets silently blocked in Safari or in-app browsers.
  • You can now pick your Google service-account key straight from the downloaded .json file instead of pasting the JSON. The file is read entirely in your browser and never uploaded.
  • Rewrote the Google connect chooser around who you are — managing client accounts (MCC) versus advertising for your own business — and linked Google's official service-account guide, so the setup path is obvious without technical background.
  • Google Ads Editor recommendation paths are now validated, and reconnecting an account preserves its original identity and name.

Creative intelligence and AI output

  • Added AppGrowing as a creative intelligence source, so competitor ad-creative research draws on broader evidence with quota-aware fallback when a provider is unavailable.
  • Added TikHub for TikTok, X, YouTube, and LinkedIn social scraping, with automatic Apify fallback when a request isn't supported.
  • Image generation now automatically edits from the reference images you supply instead of regenerating from scratch, and content workflows gained authenticity rules so product imagery isn't fabricated.

Reporting and sync reliability

  • Meta requests now retry automatically when Meta reports a transient platform error, so a brief outage no longer leaves a day-long hole in your ad entity data.
  • Dashboard sync now fails loudly instead of reporting a fresh timestamp over stale data, distinguishes genuinely empty periods from unknown ones, and can recover a mismatched account with a forced 30-day catch-up.
  • Audited all 71 TikTok Ads actions against the official v1.3 API and fixed Smart+, Pixel, Catalog, and GMV Max drift, preserved ad-group bids and frequency caps through edits, and sharded long report windows so large date ranges complete.
  • Restored correct UTC reporting and deployment behavior for ChatGPT Ads.

Chat reliability

  • Healthy chat streams no longer flash red error banners when a turn closes normally.
  • Fixed a case where uploading UTF-16 exports could lose a completed agent answer and surface an unexplained retry prompt.
  • Browser tab titles now reflect the organization, brand, and conversation you're in, and stay current through renames and across multiple open tabs.
  • Brand initialization now retries under contention, so creating a brand no longer fails when several start at once.

Attribution and marketing site

  • Stopped soku.ai's own login redirects from being counted as referral traffic, and preserved first-touch attribution across the marketing site and app, so acquisition reporting reflects real sources instead of self-referrals.
  • Cut the marketing homepage's memory footprint and font loading, so the site is lighter and faster on first visit.

More reliable daily ad data sync

Reporting and sync reliability

  • Restored complete daily ad data sync after a regression that could leave campaign, ad set, and ad metrics frozen for some accounts, so dashboards and reports refresh fully each day again.
  • Hardened Meta data pulls to automatically request smaller pages when the platform rejects an oversized response, so large accounts sync through instead of stalling.

Credit packs with affiliate attribution, redemption-code plans, Slack and Shoplazza connectors, faster account connect, and chat reliability fixes

Billing, plans, and affiliates

  • Added credit pack purchases with affiliate attribution, so you can top up credits on demand and partners get credited for the referrals they drive.
  • Redemption codes can now grant a billing plan alongside credits, turning launch and partner promos into a single code.
  • Updated ChatGPT Ads access and pricing so the intake reflects current availability and cost.
  • Clarified the free plan member limit so teams can see exactly how many seats are included before upgrading.

Chat and agent reliability

  • Any brand member can now delete shared conversations, so teams can clean up shared chat history without waiting on the owner.
  • The first agent turn on a new chat now streams as it generates instead of showing a blank spinner.
  • Failed turns keep an errored placeholder, so a chat no longer goes blank after a refresh.
  • Added fail-safe model degradation so Pro and Max runs fall back cleanly instead of hard-failing when a model is briefly unavailable.

Integrations and attribution

  • Enabled the Composio Slack toolkit in the Bring Your Own catalog, so you can wire Slack actions into agent workflows.
  • Repurposed the Shoplazza connector as a lead funnel with attribution for cleaner lead tracking.
  • Surfaced a Soku Browser SDK docs link in the Pixel setup guide so developers can find install steps in context.
  • Fixed OAuth connection UX — stale Pending states, the sync widget, onboarding redirect, and reconnect anchors — and decoupled ad-account creation from heavy syncs so imports finish faster.
  • Sped up Google account discovery on the first hop so connecting accounts is quicker on large managers.
  • Unified tracking-attribution delivery so conversion data reports more consistently.
  • Temporarily hid the unfinished channels integration tab to avoid a dead end.

Autopilot and marketing site

  • Split the autopilot page and fixed the sidebar so it scrolls all the way to the bottom.
  • Migrated committed image assets to the cdn.soku.ai CDN for faster-loading marketing pages.

Monitor automations, Seedance 2.5 tool, large-MCC Google discovery, agent-led growth pages, and reliability fixes

Automation and monitoring

  • Added a monitor automation type that triggers on metric conditions, so teams can be alerted and act when a KPI crosses a threshold instead of only on a fixed schedule.

AI tools and marketing site

  • Launched a Seedance 2.5 tool page with a functional generator and landing flow for higher-quality AI video from a prompt.
  • Added agent-led growth pages, a dedicated CLI page, and a use-case library so agents and marketers can discover Soku workflows directly.
  • Shipped the daily SEO trio with the Zendesk integration, a business video maker tool, and a generative engine optimization guide.

Integrations and reporting reliability

  • Made Google account discovery lazy for large MCCs so connecting big manager accounts is faster and no longer times out.
  • Added adaptive GAQL date sharding so Google metrics syncs complete on large date ranges instead of failing partway.
  • Stopped admin API request rows from appearing in customer audit logs for cleaner, more accurate activity history.

Reliability and quality

  • Routed the Azure GPT-5.6 model through the responses API so Pro and Max model fallbacks no longer hard-fail mid-run.
  • Verified real image dimensions in the ad-creative QA gate so generated creative matches the intended placement size.
  • Removed stale ChatGPT Ads funding reminders so teams stop seeing outdated funding nudges.

Onboarding

  • Streamlined onboarding into a single automation with a slimmer form, registry-driven connect tools, and localization for a faster first run.

Referral program, MMP and Search Console integrations, model-tiered automations, finance overview revamp, and ChatGPT Ads intake polish

Ad operations and platform coverage

  • Added small-slot ad image rules and budget/ad-group controls to ChatGPT Ads media planning so smaller placements get correctly sized creative and cleaner budgeting.
  • Updated Google Ads to v24 flight-date fields with standard target CPA/ROAS bid strategies for current campaign scheduling and automated bidding.
  • Synced Gravity ad-unit metrics and exposed account spend cap, disable reason, and minimum daily budget on account reads so reports reflect real spend limits and status.
  • Hardened the Pipedream Google Ads sync for more reliable data imports.

Integrations and connections

  • Added an Adjust (MMP) integration so mobile measurement data can flow into Soku ad workflows.
  • Integrated Google Search Console through the Pipedream provider so agents can pull first-party search performance for SEO and content workflows.

Automation, models, and plans

  • Added model-tier selection to automations so scheduled runs match model capability and cost to each job.
  • Added Azure model fallbacks for Pro and Max tiers with a 6-hour breaker cooldown so conversations keep running when a provider degrades.
  • Allowed fal.ai image generation on the Free plan (video generation stays gated) so more teams can create ad images without upgrading.

Referrals and billing

  • Launched a referral program with shareable invite links, credit rewards, and anti-abuse protections.
  • Made the signup reward double-sided so the referrer also earns credit when an invite converts.

Dashboard and reporting

  • Revamped the finance overview with MCC/Business-Manager grouping, account-timezone spend, and Meta coverage so multi-account spend is easier to read.
  • Added an asset creative preview with thumbnail, lightbox, and download to the dashboard for faster creative review.

Onboarding, workspace, and CLI

  • Reduced ChatGPT Ads intake drop-off at the assets step and now persist the intake contact as a draft on step 1 so partial submissions aren't lost.
  • Smoothed the new-workspace welcome with a softened launch backdrop, removed the rolling-word hover tint, and named onboarding Slack channels with a clear Soku suffix.
  • Surfaced the Soku CLI as a dedicated Marketplace hub tab, and made the agent read_session tool work across both render paths.

Docs and marketing site

  • Published a ChatGPT Ads creative-assets upload guide plus Meta placement asset-customization and lead-form pairing guidance for agents.
  • White-labeled the ChatGPT Ads capability docs by removing the upstream vendor name.
  • Shipped the daily SEO trio, expanded the video-campaign-groups blog into a pillar plus a three-post cluster, added the Intercom integration and AI UGC Video Generator tool pages, and replaced placeholder testimonials with real ones.

ChatGPT Ads write actions, unified integrations, account balances, agency pricing, and onboarding launch pack

Ad operations and platform coverage

  • Added ChatGPT Ads write operations so agents can create and manage ChatGPT Ads campaigns directly from Soku workflows.
  • Completed Google Ads recommendation and management (RMF) capabilities for broader campaign optimization coverage.
  • Added a data-readiness check agents can call before segmented audits, so reporting waits for complete data instead of returning partial numbers.
  • Tightened creative handoff so customer screenshots are no longer treated as the final ad image, and clamped Meta Ads metrics lookback for consistent reporting windows.

Integrations and connection reliability

  • Unified the integrations page with a single search and built-in icon fallback, plus complete pagination so every connected app is browsable.
  • Unified the Google OAuth redirect flow and added a domain-aware credential selector so dedup sync pipelines pick the right account automatically.
  • Surfaced credential health to the agent (needs-reauth and reconnect errors) and aligned the account sync status UI with clearer recovery.
  • White-labeled ChatGPT Ads connection labels, refreshed the AppsFlyer card with its official logo on disconnect, and let Continue adopt a pending credential when consolidating accounts.

Dashboard, reporting, and sync reliability

  • Added ad account balances across the dashboard and integrations so budgets are visible at a glance.
  • Added a resident sync widget for live import progress and a dashboard vacuum-period presentation so data freshness is clear.
  • Isolated sync dispatch and each ad platform into dedicated workers so a Google backlog no longer starves Meta and ChatGPT Ads reporting.
  • Added just-in-time backfill on the agent read path and stopped falling back to an HTML report when image or video generation is plan-blocked.

Models, agents, and automation

  • Registered the GPT-5.6 (Azure) model deployments so teams can select the newer model tier.
  • Added per-tier default effort controls to match model reasoning depth and cost to each plan.
  • Replaced the hard mutation budget with graceful run convergence so long agent runs finish cleanly instead of cutting off.
  • Added a ChatGPT Ads weekly reporting skill for recurring performance summaries.

Onboarding and account controls

  • Launched an onboarding launch pack with starter tasks, a free-run billing exemption, and a clearer setup UI for new workspaces.
  • Unwedged onboarding finalize on degraded drafts and now classify GA4 correctly as a measurement source.
  • Restored self-managed organization deletion and added rotating welcome use cases on the new-workspace home.

Pricing and marketing site

  • Merged the credits calculator into the pricing page with an agency-versus-brand persona split so each audience sees the right plan model.
  • Added a 'perfect for agencies' band to the homepage and a partnerships backlink-exchange form with dofollow auto-verification.
  • Shipped the daily SEO trio (blog, tool, integration) with a sitemap snapshot, published ChatGPT Ads onboarding guidance and an ad-account-safety FAQ, and refined skill marketplace navigation.

Public credits calculator with a savings and ROI model

Pricing transparency and planning

  • Launched a public credits calculator at /calculator so teams can estimate Soku costs by task, calibrated against real production usage data across LLM and third-party costs.
  • Added multi-tier planning for performance reports (daily/weekly/monthly) and ad and campaign write actions (single/duplicate/bulk), each with its own monthly frequency, so estimates match how a team actually operates.
  • Added a forward savings model that projects net monthly savings with a before/after ROI badge, plus a Contact-us path above Pro capacity.

ChatGPT Ads billing and funding, unified integrations, in-product docs, and account controls

ChatGPT Ads billing and funding

  • Introduced tiered ChatGPT Ads service fees with a minimum deposit so larger campaigns get clearer, volume-based pricing.
  • Moved ChatGPT Ads funding to a guided manual bank-wire flow that collects payer bank details, for more reliable and auditable budget top-ups.
  • Priced fal-based video generation against the Seedance 2.0 Mini tier so video credit costs stay predictable.

Integrations and connection reliability

  • Unified all integrations into a single searchable app list with icons, so connecting ad, analytics, and messaging tools is easier to browse.
  • Turned OAuth connection failures into clear, human-readable messages — including specific guidance when Meta credentials fail — instead of opaque errors.
  • Made credential fetches retry transient transport failures automatically, so linking an account is less flaky.

Reliability and agent runs

  • Hardened long-running conversations against silent stalls with faster stall detection, recovery on resume, and a reliably reachable stop control.
  • Raised the stream-idle watchdog and now surface live model and provider outages, so it's clear when a model is degraded instead of failing quietly.

Workspace, help, and account controls

  • Added a unified workspace setup splash for a clearer first-run experience, and restored the Library chat panel across navigation.
  • Launched an in-product Soku docs knowledge base and help assistant for self-serve answers inside the product.
  • Added self-serve account deletion that cascades across your organization and connected credentials for privacy compliance.
  • Preserved your current page when switching brands and fixed seat-usage display on the organization members page.

Marketing site and content

  • Published a Google Ads API guide cluster covering brand verification, Basic vs Standard access, and multi-party approvals for ad-automation teams.
  • Added this public changelog so customers can follow product updates that matter to marketing teams.

Google connection reliability, campaign UTM metadata for agents, and public data-deletion access

Integrations and connection reliability

  • Made Google account connections more resilient so transient credential-discovery errors retry automatically instead of failing a connect attempt.
  • Switched Google Ads OAuth to the native provider by default for more consistent account linking and syncing.

Automation and reporting

  • Agents can now request campaign-level UTM parameters when listing brand campaigns, so UTM and attribution analysis workflows have the tracking metadata they need (opt-in, with default responses unchanged).

Privacy and public site

  • Fixed the public data-deletion page so it stays reliably reachable for privacy and compliance requests.

Model tiers, smarter chat home, ad platform sync reliability, and account privacy controls

Model tiers and agent reliability

  • Introduced Soku model tiers (Lite, Pro, Max) with per-conversation model selection so teams can match model capability and cost to each task.
  • Added an automatic model fallback ladder so conversations keep working when a model provider degrades instead of failing mid-task.
  • Hardened agent runs against stalled streams and oversized tool calls, and added a runtime backstop that stops stuck automation runs cleanly.

Chat and workspace experience

  • Redesigned the new chat home with Get started category chips so common ad, SEO, and reporting workflows are one click away.
  • Added a shared Library chat panel with select-to-stage on all Library tabs, plus a hover flyout on the Marketplace rail for faster discovery.
  • Improved Autopilot readability with higher text contrast, larger type, and individually collapsible rail panels, and fixed CSV previews for BOM-less UTF-8 files.

Ad platform connections and syncing

  • Fixed Meta account import so OAuth credentials without a Business Manager can still connect and select ad accounts.
  • Added Google Ads and Meta Marketing API rate-limit governance so data syncs back off gracefully instead of burning daily platform quotas.
  • Added ChatGPT Ads funding entry points so budgets can be funded and reconciled directly from the product.

Onboarding, privacy, and public site

  • Gated incomplete brand onboarding routes so new workspaces finish setup before landing on half-configured pages.
  • Added an account deletion request flow in personal settings and a public data deletion page for privacy compliance.
  • Upgraded SEO hosting page design quality with brand-grounded layouts for hosted marketing pages.

Ads write actions, dynamic creative, ChatGPT Ads onboarding, and agent reliability

Ad operations

  • Expanded Google Ads write coverage for update/remove workflows and filled more Meta Ads lifecycle actions for campaign, ad set, and ad management work.
  • Added Meta dynamic creative support through asset feed specs so teams can create richer creative tests from Soku workflows.
  • Added clearer ads capability coverage and handler wiring so agents can expose supported write actions more reliably.

ChatGPT Ads and onboarding

  • Added a ChatGPT Ads card to onboarding and refreshed workbench selection states so new teams can start from ChatGPT Ads setup more directly.
  • Improved ChatGPT Ads backfill and metrics timezone handling so campaign history and reports line up with the expected reporting window.
  • Kept ChatGPT Ads entry points visible through the announcement banner and onboarding apply path.

Creative workflows

  • Added an ad library chat panel with reusable embedded chat, reference chips, thumbnail context, and Remix actions for faster creative iteration.
  • Added a permanent public media publishing tool so generated assets can be shared from stable URLs instead of temporary workspace links.

Reliability and admin visibility

  • Added user ban/unban controls, plan entitlement controls, and vendor-credit monitoring so admins can keep workspaces healthier and easier to operate.
  • Made agent report generation more resilient with smaller copy-then-edit HTML report steps and retries for transient provider stream failures.
  • Improved user-facing error handling so raw machine errors are less likely to leak into customer-visible toasts.

BYO MCP integrations, ad creative library, ChatGPT Ads routing, and Claude Sonnet 5 guides

Integrations and approvals

  • Added more of the BYO MCP integration workflow, including custom integration drafts, human-reviewed gateway actions, read-policy review, and clearer runtime observability.
  • Introduced tiered human approval controls so teams can choose once, session, always, or deny behavior for sensitive agent actions.
  • Added an admin integration-package registry so integration capabilities can be reviewed and managed more consistently.

Ad creative and marketing workflows

  • Added a DB-backed ad creative library with faceted search, admin CSV import, and gallery performance fixes for browsing large creative catalogs.
  • Improved ChatGPT Ads intake by enforcing a budget floor and simplifying requested campaign timing/contact fields.
  • Fixed the ChatGPT Ads homepage banner redirect so production visitors keep the public soku.ai host and campaign attribution when starting setup.

Workspace and automation UX

  • Made Autopilot proposals visible to brands by default so clients can see recommended next steps without extra admin setup.
  • Refined chat/sidebar behavior with cleaner layout, friendlier automation-created run titles, and live refresh for new conversations.
  • Hardened sign-up and onboarding flows with coupon redemption, idempotent org creation, abuse defenses, and clearer admin brand visibility.

SEO hosting and public content

  • Added first-party SEO hosting mount support and CRM contact-form routing improvements for marketing-site operations.
  • Published a Claude Sonnet 5 content cluster for AI marketers, Meta/Google Ads setup, ad-automation evaluation, and routing tradeoffs versus Opus 4.8.
  • Submitted the newly live Claude Sonnet 5 URLs for indexing and refreshed low-CTR SEO copy/internal links from the previous daily workflow.

Docs, Context Hub exports, ChatGPT Ads setup, and automation reliability

Docs and marketing site

  • Added a public /docs section with getting-started guides, account setup, conversion mapping, team invites, FAQ, and web-app versus CLI guidance.
  • Made docs easier for AI agents to consume with per-page Markdown views, copy-page actions, sitemap inclusion, and llms-full.txt discovery.
  • Published new AI ads guides for TikTok Agentic Hub and YouTube Shorts brand-campaign measurement.

Context Hub and workspace UX

  • Added single-file downloads, multi-file batch downloads, and recursive folder zip exports in Context Hub.
  • Kept failed downloads selected for retry and tightened export handling for non-ASCII folder names and path traversal edge cases.
  • Refreshed the app shell, chat history, sidebar, and Autopilot presentation so workspace navigation and proposal review are cleaner.

Ads, integrations, and CLI

  • Limited ChatGPT Ads setup to supported markets and pinned account display names so users see clearer platform options.
  • Expanded the CLI capability manifest and added ergonomic Meta lead-form and audience write commands for ads operators.
  • Added safer data-action parameter guidance so agents mirror integration contracts more reliably during account audits and reporting workflows.

Automation and reliability

  • Expanded Autopilot proposal autonomy so Soku can prepare more actionable next-step recommendations.
  • Added Google/Gemini support in the backend LLM provider path and an admin control plane for switching the global default model.
  • Hardened MCP egress and runtime dependency handling so integration calls run with clearer contracts and safer isolation.

ChatGPT Ads routing, dashboard polish, integrations packaging, and support visibility

ChatGPT Ads acquisition flow

  • Added a homepage announcement banner for ChatGPT Ads that carries campaign intent through sign-up.
  • Routed tagged ChatGPT Ads visitors to the integrations setup path after onboarding, with the ChatGPT Ads card leading the grid.
  • Handled multi-value ChatGPT Ads UTM parameters so campaign attribution stays intact when visitors arrive from richer ad links.

Dashboard reporting fixes

  • Fixed GA4 property loading for connected brands so the GA4 Analytics tab can open reliably.
  • Raised the pivot-table sticky header above the sticky breakdown column so large reports stay readable while scrolling.

Integrations infrastructure

  • Packaged built-in integrations behind a registry so Soku can expose and manage integration capabilities more consistently.
  • Added a trusted MCP client core and egress dispatch contract for safer integration calls through managed gateways.
  • Added a gateway policy shadow evaluator to inspect integration routing decisions before enforcing new gateway policies.

Support and reliability visibility

  • Added third-party provider error recording, digesting, and an admin trace-lookup view so vendor failures are easier to investigate.
  • Moved the pixel proxy and SDK into dedicated submodules to keep tracking components easier to maintain independently.

ChatGPT Ads intake, workspace integrations, SEO hosting, and dashboard updates

ChatGPT Ads and lead capture

  • Added a gated ChatGPT Ads whitepaper page with Meta/PostHog lead tracking and secure PDF delivery.
  • Required company and LinkedIn fields on the whitepaper gate so sales follow-up gets cleaner lead context.
  • Synced ChatGPT Ads intake assets into Lark Bitable with file-count, size, and URL validation guardrails.

Integrations and agent skills

  • Added Monday.com read/write support through Composio with human-reviewed GraphQL mutations.
  • Added Google Drive and Google Calendar Composio integrations, including matching agent skills for file and calendar workflows.
  • Improved Fireflies API-key connection handling and refreshed Composio integration cards with official toolkit logos.

SEO hosting and site setup

  • Added per-brand SEO Hosting section catalogs so each brand can manage its own hosted content sections.
  • Reworked site verification settings into a clearer install journey with advanced controls.
  • Added analytics-only last-seen recording to make site verification and SDK setup easier to diagnose.

Dashboard, CLI, and reliability

  • Added ad-account-level selection in the dashboard account picker for more precise reporting filters.
  • Scoped the integrations page to the current brand and kept account mappings accessible to admins.
  • Added Meta bulk ads and brand-skill management commands to the CLI.
  • Returned structured 424 upstream errors for Composio proxy failures so agents see the real vendor issue instead of an opaque edge 502.

Seedance Mini, SEO hosting, ad ops, and automation updates

AI video and creative tools

  • Added a public Seedance 2.0 Mini tool page with sign-in, credit-aware generation, prompt persistence, generated-clip history, and upgrade flow support.
  • Defaulted Seedance 2.0 video generation to the mini tier for lower-cost video experiments.
  • Added a SaaS creative-design playbook and planner/generator/evaluator pipeline for product demo, real-person, illustration, and reference-image creative routes.

Ad operations and conversion workflows

  • Expanded Google Performance Max asset uploads across image, text, and YouTube assets.
  • Added Meta bulk ad deployment actions and campaign duplication with per-campaign overrides.
  • Exposed ChatGPT Ads agent capabilities and improved ads executor fallback errors.
  • Moved Google enhanced-conversion lead uploads to the Data Manager API path for newer Google Ads integrations.

Integrations, CLI, and SEO hosting

  • Added a Google Sheets runtime skill through the Composio proxy path.
  • Added automation management commands to the Soku CLI.
  • Polished SEO Hosting with wider previews, cleaner page lists, copyable sitemap links, and silent auto-verification while domain connections settle.
  • Updated the public CLI page to the current file-based SEO Hosting pages workflow.

UX and reliability

  • Fixed Slack OAuth callbacks so installs return through the correct integration processor and back to the brand settings page.
  • Fixed Stripe checkout return paths that could send customers to a 404 after purchase.
  • Added zip uploads in chat and rendered user messages as plain text with URL autolinks.
  • Redesigned sign-in with a new sky backdrop and streamlined frosted-card layout.

Marketing and SEO content

  • Published a Gemini computer-use pillar and three cluster guides for AI ad ops and browser-agent workflows.
  • Refreshed selected low-CTR marketing titles, descriptions, and internal links.
  • Updated Kling 3.0 tool metadata for official-site and Kuaishou search intent.

Explore More Resources