Repository navigation
fix: drop ChatGPT Ads ad-group and campaign update flags the server rejects - #27
Merged
Merged
Conversation
`ads chatgpt campaign create` exposed campaign-level flags the server rejects: `--max-cpc`, `--billing-model` (only cpc is accepted, on the ad group), `--allowed-countries` (never mapped; geo is `geo_targets`), and the `leads` objective. Bids live on each ad group and are independent of sibling groups. `ads chatgpt campaign migrate-legacy` called `migrate_legacy_ad_units`, which no longer exists on the server or in the capability manifest. `ads chatgpt ad create` required `--cta`, which OpenAI Ads rejects, so the command always failed. `--cta` and `--description` are removed from `ad create` and `ad update`. The bundled `ads-write.md` reference now shows one campaign with two groups, each with its own bid and two ads, and states which fields are campaign-level and which are group-level. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ejects - ad-group create: drop --brand-name, --group-type, --negative-context, --ad-prompt, --image-url, --daily-budget, --example-query, --allowed-countries, --allowed-devices (group_body rejects or never writes them). - ad-group update: drop --landing-page, --brand-name, --image-url, --daily-budget; add --max-cpc for per-group bids. - campaign update: drop --landing-page and --objective (bidding_type is fixed after create). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolve against the squashed #25 on main: the tree equals main plus this branch's own commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1099271
added a commit
that referenced
this pull request
Oct 21, 2026
## Summary Release `@soku-ai/cli` 0.1.0-alpha.25. Stamped with `node scripts/stamp-release.mjs 0.1.0-alpha.25`; on merge, CI tags `soku-ai-cli-v0.1.0-alpha.25` and `publish.yml` publishes to npm. ## Carried changes (since alpha.24) - ChatGPT Ads 1 campaign : M ad groups : N ads (#25), matching nex-studio About-Intelligence/nex-studio#6450. - ChatGPT Ads ad-group / campaign update flags the server rejects are removed (#27, replaces closed #26). - Typed flags that two platforms spell alike now go to the selected platform's param. ## Verification - `node scripts/stamp-release.mjs --check`: version consistent across package.json, src/version.ts, changelog.json, SKILL.md and all plugin manifests. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Replaces #26, which GitHub closed when its base branch (#25) was deleted on merge. Same change; the branch now merges main so it applies on top of the squashed #25.
Stacked on #25 (base is its branch; retarget to
mainafter #25 merges).Summary
Removes ChatGPT Ads flags that the nex-studio backend rejects or silently drops, so the CLI only offers the 1 Campaign : M Ad Groups : N Ads fields that work.
ad-group create--group-typead_groups.pygroup_body: non-manualraises--negative-context,--ad-prompt,--image-url,--daily-budget,--example-query,--allowed-devicesgroup_bodyunsupportedlist raises--allowed-countriesnormalize.pyallowlist, never mapped--brand-name(was required)group_bodyonly writesname/status/bidding_config/context_hints;brand_nameis read only at campaign create (campaign_bodies.pygravity)ad-group update--landing-pageupdate_ad_groupraises "Update the Ad target URL"--image-url,--daily-budgetgroup_bodyraises--brand-namecampaign update--landing-pageparity_campaign_bodyraises on update--objectiveAdded:
ad-group update --max-cpc(was-p max_cpc=Nonly).group_bodyreads the parent campaign bidding type and writesbidding_config.max_bid_micros, so each ad group bid changes alone. Help text states the unit: CPC (clicks), CPA (conversions), CPM (reach).Kept on
ad-group create:--name,--landing-page(default URL for inline--ads),--context,--max-cpc,--ads.Also:
unreleasedchangelog note +commands.changed; bundled skillskills/soku/references/ads-write.mdexample drops--brand-nameand uses--max-cpcon update.Test
pnpm typecheckpasspnpm test: 250 + 22 pass, 0 fail. New test asserts the kept/removed flag sets onad-group create|updateandcampaign update.🤖 Generated with Claude Code