Steward
All docs

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:

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.

NetworkDraftPause and resumeBudgetSpend and clicks
Reddit AdsA campaign with configured_status PAUSED, campaign budget optimization on, goal_type DAILY_SPEND and the daily cap as goal_valueconfigured_status ACTIVE or PAUSEDgoal_valueThe reports API: SPEND and CLICKS by campaign and day
Google AdsA campaign budget (standard delivery), then a paused Search campaign on it with Maximize clicks and the EU political ads declarationstatus ENABLED or PAUSEDThe budget's amountMicrosgoogleAds:search with metrics.cost_micros and metrics.clicks by day
Meta AdsComingComingComingComing

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.

  1. Create a developer application for the Ads API and get a refresh token for the account that runs the ads, with the adsread and adsedit scopes.
  2. Set the env vars on the server: REDDIT_ADS_CLIENT_ID, REDDIT_ADS_CLIENT_SECRET and REDDIT_ADS_REFRESH_TOKEN. Add _<SLUG> to give one business its own (for example REDDIT_ADS_REFRESH_TOKEN_MY_SHOP).
  3. 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

  1. 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.
  2. Set GOOGLE_ADS_DEVELOPER_TOKEN, GOOGLE_ADS_CLIENT_ID, GOOGLE_ADS_CLIENT_SECRET and GOOGLE_ADS_REFRESH_TOKEN (or the _<SLUG> versions).
  3. 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

ToolWhat it does
ads_create_campaignA paused draft on reddit_ads or google_ads with a daily cap. Always a card.
ads_resumeStart a draft or resume a paused campaign. The trust ladder decides; the budget always applies.
ads_set_budgetA new daily budget. A raise is always a card.
ads_pausePause now.
ads_statusThe budget, spend, what's committed, and each campaign.