Docs Running a business
Paid ads
@steward can run small paid campaigns on Reddit and Google for a business. Ads spend money, so the rules are strict:
- A new campaign always asks an owner, whatever its trust level. So does raising a daily budget.
- Starting or resuming a campaign follows the trust ladder for "start or resume an ad campaign" (risk money: it asks until it has earned the right not to).
- Pausing runs at once. It saves money, so it's internal.
- The monthly ad budget is a hard limit. An owner sets it on Growth, under Paid ads. With no budget, nothing can be created or started. The check runs again when an approved card runs, so an approval can't spend past it.
The monthly budget
What a change commits is this month's spend so far, plus each running campaign's daily budget for every day left in the month (today included). A new campaign, a raise or a start is refused if that would go over the monthly budget; the refusal says the most the campaign could run at.
Networks can spend a little over a daily budget on a given day (Google up to twice the daily amount). So the hub also reads real spend every hour, and once the month's spend reaches the budget it pauses every running campaign on its own and says so in the channel.
Campaigns
ads_create_campaign makes a paused draft with a daily budget cap. Ad groups, targeting and the ads themselves are made in the network's own ads manager. Then ads_resume (or Start on Growth) starts it.
| Network | Draft | Pause and resume | Budget | Spend and clicks |
|---|---|---|---|---|
| Reddit Ads | A campaign with configured_status PAUSED, campaign budget optimization on, goal_type DAILY_SPEND and the daily cap as goal_value | configured_status ACTIVE or PAUSED | goal_value | The reports API: SPEND and CLICKS by campaign and day |
| Google Ads | A campaign budget (standard delivery), then a paused Search campaign on it with Maximize clicks and the EU political ads declaration | status ENABLED or PAUSED | The budget's amountMicros | googleAds:search with metrics.cost_micros and metrics.clicks by day |
| Meta Ads | Coming | Coming | Coming | Coming |
Spend and clicks are synced for the last 3 days every hour (ADS_SYNC_MINUTES) into the numbers store as ad_spend (dollars) and ad_clicks, so Analytics shows them next to the funnel. Update spend on Growth syncs now.
Meta is a stub: managing campaigns through its Marketing API needs Advanced Access to ads_management, which goes through Meta's App Review and Business Verification. It shows as coming until that's done.
Setting up Reddit Ads
The Reddit Ads API is open to all developers.
- Create a developer application for the Ads API and get a refresh token for the account that runs the ads, with the
adsreadandadseditscopes. - Set the env vars on the server:
REDDIT_ADS_CLIENT_ID,REDDIT_ADS_CLIENT_SECRETandREDDIT_ADS_REFRESH_TOKEN. Add_<SLUG>to give one business its own (for exampleREDDIT_ADS_REFRESH_TOKEN_MY_SHOP). - On Integrations, fill in the Reddit ad account id (and a funding instrument id if the account has more than one), and switch Reddit Ads on.
Optional: REDDIT_ADS_USER_AGENT (Reddit asks for a unique one, like server:my-studio:v1 (by /u/you)).
Setting up Google Ads
- Get a developer token from the Google Ads API Center, an OAuth client, and a refresh token for a Google account that can manage the ads account.
- Set
GOOGLE_ADS_DEVELOPER_TOKEN,GOOGLE_ADS_CLIENT_ID,GOOGLE_ADS_CLIENT_SECRETandGOOGLE_ADS_REFRESH_TOKEN(or the_<SLUG>versions). - On Integrations, fill in the Google Ads customer id (10 digits), plus the manager account id if access goes through a manager account, and switch Google Ads on.
Optional: GOOGLE_ADS_API_VERSION (default v26).
Secrets stay in env vars. The hub keeps only the account ids.
Tools
| Tool | What it does |
|---|---|
ads_create_campaign | A paused draft on reddit_ads or google_ads with a daily cap. Always a card. |
ads_resume | Start a draft or resume a paused campaign. The trust ladder decides; the budget always applies. |
ads_set_budget | A new daily budget. A raise is always a card. |
ads_pause | Pause now. |
ads_status | The budget, spend, what's committed, and each campaign. |