3 Commits
Author SHA1 Message Date
AFFAANhandClaude Opus 5 b2b2050bbd docs: record the Meta App Live-mode gate found during live testing
Code 100 / subcode 1885183 stopped the connection test after nine
consecutive field-mapping fixes, and it is not one: "Ads creative post was
created by an app that is in development mode. It must be in public to
create this ad." Decoded the access token via /debug_token to confirm
which app — MaskanXAds Integration, id 1592299622228272 — rather than
guess. Toggling it to Live on developers.facebook.com is the only fix;
nothing in MaskanX can do this on the user's behalf.

Documented next to the payment-method gate it sits beside in the setup
guide.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 18:26:17 +05:30
AFFAANhandClaude Opus 5 c0b458d283 feat(campaigns): answer "why won't this launch?" in the browser
A live sync against the real account failed with Meta code 100, subcode
4834011, and the only thing we stored was the literal string "Invalid
parameter". Meta had written an explanation — it puts one in
error_user_title and error_user_msg — and MetaError was discarding it.
Every explanatory field is now kept, describe() prefers the text written
for a person, and as_dict() carries the lot into the API response and the
stored sync_error.

That still left diagnosis needing a terminal, which is no good: the person
who has to attach a payment method or fix a Page id is a client, not a
developer. GET /campaigns/diagnostics runs seven ordered readiness checks
and returns a remedy with each failure. It stops at the first hard failure
— with no token every later check fails for the same reason, and five
identical errors hide the one that matters.

POST /campaigns/diagnostics/smoke-test closes the remaining gap: the unit
suite proves we send what we think we send, not that Meta accepts it. It
builds the real chain, reads back from Graph that every object is PAUSED,
and deletes in a finally. If cleanup fails, the ids come back in the
response rather than being abandoned in a real ad account.

Both routes are declared above /{campaign_id}. /diagnostics is a single
path segment, so the wildcard would otherwise answer it — the same
shadowing /discover and /adopt are already guarded against. Four tests go
through HTTP to pin the ordering, because the rest of this file's tests
call the functions directly and would pass against an unreachable
endpoint.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 11:21:22 +05:30
AFFAANhandClaude Opus 5 5e52c425ba docs: add the campaign management guide
Setup, first campaign, daily use, and the chat prompts — including the
MCP path for adding CRM fields from a conversation.

Records the two things currently blocking a live launch: the ad account
has no payment method, which only Business Manager can fix, and the
operator token has to be set before an approval can authorise spend.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-04 11:13:20 +05:30