Tempio Docs
Platforms

Meta

Meta covers Facebook and Instagram advertising through one ad account. Connect the account first — Connections covers the grant, the first sync and what each status means — and from then on Tempio reads the account's structure and daily numbers, and writes to it through drafts. Nothing here reaches Meta directly: a change is a draft on the record first, applied when it is approved, by you or by a rule your workspace wrote.

What a draft can change

EntityWhat a draft can changeOn Meta
CampaigncreateCreated paused, on one of the six outcome objectives. Meta no longer accepts the older objective names, and a draft naming one is refused before anything is sent
CampaignnameRenaming is its own draft, and takes effect immediately
CampaignstatusActive, paused or archived
CampaignbudgetDaily or lifetime. The mode is part of the draft, and Meta does not switch a campaign from one mode to the other on an update
CampaignbidLowest cost, bid cap or cost cap, with the cap where the strategy takes one
CampaignscheduleStart and end. Dayparting is an ad set setting on Meta, so a campaign-level dayparting draft is refused
Ad setcreateCreated paused, under a campaign, with its targeting written whole
Ad setnameRenaming is its own draft, and takes effect immediately
Ad setstatusActive, paused or archived
Ad setbudgetDaily or lifetime, and only when the budget lives on the ad set rather than on its campaign
Ad setbidThe same three strategies as a campaign
Ad settargetingA complete replacement of the ad set's targeting, never a partial edit
Ad setscheduleStart, end, and the dayparting hours
AdcreateTwo writes: the creative, then the ad that points at it. Created paused
AdnameThe name Ads Manager shows, not the creative's
AdstatusActive, paused or archived
AdcreativeMeta creatives cannot be edited, so the change is a new creative swapped onto the ad
CreativecreateBuilt whole from the draft's copy, media and call to action
Lead formcreateAn ad references the form it collects through
MediauploadImages and videos, by URL
Account defaultsupdateThe Page, Instagram account, pixel and European Union declaration this ad account uses
Campaign, ad set, addeleteTempio does not delete on Meta. A draft asking for one is refused, and archiving is offered instead

Everything lands paused, and an ad waits for review

Every campaign, ad set and ad Tempio creates on Meta is created paused. The status is written explicitly rather than left to Meta's own default, so a new entity can never start spending because a platform default moved. Setting it live is a second change, drafted and approved on its own.

A new ad also waits on Meta. Facebook reviews an ad before it can run, so an applied create ad draft means the ad exists and is paused — not that it is live. The draft carries a note saying so when it is applied.

Archiving is not deleting

Meta archives. Tempio does not delete a Meta campaign, ad set or ad at all, so a draft asking it to remove one is refused with a message pointing at the archive instead. Archiving sets the entity's status to archived: it stops running, it stays in the account, its history stays in Tempio, and it can be brought back. That is the reversibility a delete would throw away.

Special ad categories are refused

Meta requires every campaign to declare whether it advertises credit, employment, housing, social issues, elections or politics. Tempio always declares "none" and refuses a draft that names a category.

The refusal is deliberate, and it is about the restrictions rather than the category. A campaign in a special ad category cannot target an age range, a gender, an audience exclusion or a lookalike, and its location targeting has a minimum radius — all of them hard errors on Meta rather than warnings. Until the approval screen can show a reviewer what a category does to the targeting they are approving, Tempio will not create one on your behalf. A campaign already in a category can still be changed, and a draft against one carries a note saying its targeting is restricted.

Where a budget lives

A Meta budget sits either on the campaign or on each of its ad sets, never on both. Before writing a budget Tempio reads the entity to see which, and refuses the draft rather than writing the wrong one: writing a daily budget onto a campaign whose ad sets each carry their own would take all of them over at once. The same read answers the mirror case, where an ad set under a campaign-budget campaign has no budget of its own to change.

Meta also does not move an entity between daily and lifetime on an update. A lifetime campaign asked for a daily budget is refused, naming the mode.

Currencies Meta counts differently

Money is stored and shown in the ad account's own currency, in the smallest unit that currency has. Meta keeps its own table of how many decimal places a currency has, and for ten currencies that table puts the smallest unit at the whole unit rather than at a hundredth:

Japanese yen, South Korean won, Chilean peso, Colombian peso, Icelandic króna, Hungarian forint, New Taiwan dollar, Indonesian rupiah, Paraguayan guaraní and Vietnamese đồng.

Four of those — the Colombian peso, the forint, the New Taiwan dollar and the rupiah — are counted differently by the international standard, which is where a budget can land a hundred times too large or too small. Tempio converts every amount through Meta's table on the way out and back through it on the way in, so a 5,000 forint daily budget is 5,000 forint in Ads Manager.

For a currency Meta's published table does not name, Tempio falls back to the international standard and says so: the applied draft carries a note asking you to check the number in Ads Manager. It does not refuse, and it does not guess silently.

The marker in a name

Meta offers no way to tell it "this create has already been made, do not make it again". So Tempio writes its own handle: a short marker in square brackets, appended to the name of anything it creates.

If the connection drops after the request is sent and before Meta answers, Tempio looks for that marker rather than creating the entity a second time. As soon as it has confirmed what landed, the marker is removed and the name is the name you wrote. If that removal fails the entity keeps a slightly long name for a while, the applied draft says so, and nothing else is affected.

The one marker you may see and should leave alone is on a creative. An ad's name is what Ads Manager shows; its creative's name is internal, and the marker there is the only handle Tempio has for recovering a creative that was made but never attached.

Uploading an image or a video

Meta fetches media itself rather than being sent the bytes: Tempio hands it a URL for the file and Meta pulls it into the ad account.

An image is identified by a hash of its contents, which means uploading the same file twice gives the same image back rather than a second copy. A video is a numbered object instead, and Meta transcodes it after accepting it — so an applied video upload means the file reached the account, and the draft says the video cannot be used in an ad until processing finishes. A transcode that fails is reported rather than retried, because uploading again would leave two copies in the account.

Account defaults

Some things belong to the ad account rather than to any one campaign: the Facebook Page an ad posts as, the Instagram account it posts as, the pixel it optimizes against, the payor and beneficiary Meta requires on ads shown in the European Union, and the smallest daily budget the account allows.

These are stored by Tempio, not by Meta — Meta has no account-defaults object — and changing them is a draft like any other. When the draft is applied, Tempio checks with Meta that it can see each Page, account and pixel the draft names, and refuses if it cannot. A wrong Page is worth catching here rather than on the first ad that fails for a reason nobody can read.

An ad set targeting a European Union country needs the payor and beneficiary before it can be created. When neither the draft nor the account defaults carry them, the draft is refused naming the missing field.

Rate limits

Meta counts calls per ad account, so every Tempio workspace connected to the same ad account draws on one allowance. Syncs of one ad account run one at a time: two workspaces on it queue rather than overlap. Tempio reads the account's usage off every answer Meta sends. Past 80% it waits two seconds before each call. At 100% it stops calling that account, from every sync and every workspace, for as long as Meta says the account needs to recover.

When Meta refuses a call anyway, Tempio waits the time Meta gives before calling that account again. When Meta gives none, it waits the block Meta documents for the app's access tier: five minutes on development access, one minute on standard. The connection shows "The platform asked us to slow down" meanwhile, and syncing resumes on its own.

Access

Tempio's own Meta accounts write today under the system-user grant; customer ad accounts write once Meta grants Advanced Access, which is in review.