This guide walks publishers through the complete onboarding process – from initial deployment to going live with AI-driven ad sales. Each step builds on the previous one, resulting in a fully operational Sales Agent connected to your ad server.
Before configuring your publisher environment, you need a running Sales Agent instance.
Follow the Quick Start guide to deploy with Docker. For production environments, see the Deployment Guide.
For local evaluation, use CREATE_DEMO_TENANT=true to pre-populate sample data while you learn the system.
The Sales Agent supports OAuth 2.0 / OpenID Connect for admin authentication. Configure your preferred identity provider to control who can access the publisher dashboard.
| Provider | Environment Variables | Notes |
|---|---|---|
OAUTH_GOOGLE_CLIENT_ID, OAUTH_GOOGLE_CLIENT_SECRET |
Google Workspace or consumer accounts | |
| Microsoft | OAUTH_MICROSOFT_CLIENT_ID, OAUTH_MICROSOFT_CLIENT_SECRET |
Azure AD / Entra ID |
| Okta | OAUTH_OKTA_CLIENT_ID, OAUTH_OKTA_CLIENT_SECRET, OAUTH_OKTA_DOMAIN |
Requires Okta domain |
| Auth0 | OAUTH_AUTH0_CLIENT_ID, OAUTH_AUTH0_CLIENT_SECRET, OAUTH_AUTH0_DOMAIN |
Requires Auth0 domain |
| Keycloak | OAUTH_KEYCLOAK_CLIENT_ID, OAUTH_KEYCLOAK_CLIENT_SECRET, OAUTH_KEYCLOAK_URL |
Self-hosted identity provider |
https://your-domain.com/auth/google/callbackOAUTH_GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
OAUTH_GOOGLE_CLIENT_SECRET=your-client-secret
https://your-domain.com/auth/microsoft/callbackOAUTH_MICROSOFT_CLIENT_ID=your-application-id
OAUTH_MICROSOFT_CLIENT_SECRET=your-client-secret
https://your-domain.com/auth/okta/callbackOAUTH_OKTA_CLIENT_ID=your-client-id
OAUTH_OKTA_CLIENT_SECRET=your-client-secret
OAUTH_OKTA_DOMAIN=your-org.okta.com
https://your-domain.com/auth/auth0/callbackOAUTH_AUTH0_CLIENT_ID=your-client-id
OAUTH_AUTH0_CLIENT_SECRET=your-client-secret
OAUTH_AUTH0_DOMAIN=your-tenant.auth0.com
https://your-domain.com/auth/keycloak/callbackOAUTH_KEYCLOAK_CLIENT_ID=your-client-id
OAUTH_KEYCLOAK_CLIENT_SECRET=your-client-secret
OAUTH_KEYCLOAK_URL=https://keycloak.your-domain.com/realms/your-realm
Control which users have super admin privileges using email addresses or domain patterns:
SUPER_ADMIN_EMAILS=admin@yourpub.com,ops@yourpub.com
SUPER_ADMIN_DOMAINS=yourpub.com
Super admins have full access to all tenants and system settings. Restrict this to a small set of trusted users.
Products define the advertising inventory you offer to AI buying agents. Each product specifies format, targeting, pricing, and availability.
Navigate to Admin UI > Products and create products with the following attributes:
| Field | Description | Example |
|---|---|---|
| Name | Human-readable product name | “Homepage Leaderboard - Desktop” |
| Description | Detailed description for AI agents | “728x90 display banner on homepage above the fold, desktop only” |
| Ad Unit | Ad server placement identifier | /12345/homepage/leaderboard |
| Format | Creative format (display, video, native, audio) | display |
| Dimensions | Width x Height for display | 728x90 |
| Base Rate | CPM floor price | $15.00 |
Products support multiple pricing models:
| Pricing Model | Description | Use Case |
|---|---|---|
| CPM | Cost per thousand impressions | Standard display and video |
| CPC | Cost per click | Performance campaigns |
| Flat Rate | Fixed cost per day/week/month | Sponsorships and takeovers |
| Tiered | Volume-based pricing with breakpoints | High-volume buyers |
Products are discoverable by AI agents via the get_products MCP tool. The better your descriptions, the more accurately agents can match buyer requests to your inventory.
Advertisers represent the buying entities that interact with your Sales Agent. Each advertiser gets isolated API credentials.
Navigate to Admin UI > Advertisers to create advertiser accounts:
| Field | Description | Example |
|---|---|---|
| Name | Advertiser or agency name | “Acme Corp” |
| Contact Email | Primary contact for notifications | media@acme.com |
| Status | Active or paused | active |
Each advertiser needs an authentication token to access the MCP and A2A endpoints:
API tokens provide full buying access to your inventory. Treat them as secrets – transmit securely and rotate regularly.
Advertisers use their token to authenticate with the Sales Agent:
x-adcp-auth headerBearer token in the Authorization headerThe Sales Agent uses an adapter pattern to integrate with ad servers. The adapter translates AdCP operations into platform-specific API calls.
To connect to GAM, configure the following environment variables:
GAM_OAUTH_CLIENT_ID=your-gam-client-id
GAM_OAUTH_CLIENT_SECRET=your-gam-client-secret
GAM_OAUTH_REFRESH_TOKEN=your-refresh-token
GAM_NETWORK_CODE=12345678
Setup steps:
The GAM adapter maps AdCP media buys to GAM Orders, Line Items, and Creatives. See the AdCP GAM Mapping documentation for details.
Select the active adapter via the Admin UI or environment configuration. The adapter determines how media buys, creatives, and delivery data are handled.
| Adapter | Status | Description |
|---|---|---|
| Google Ad Manager | Production | Full campaign lifecycle management |
| Mock | Testing | Simulates ad server responses for development |
Before connecting a live ad server, validate your setup using the mock adapter:
ADCP_AUTH_TEST_MODE=true# List available products
uvx adcp http://localhost:8000/mcp/ --auth test-token get_products '{"brief":"all"}'
# Create a media buy
uvx adcp http://localhost:8000/mcp/ --auth test-token create_media_buy '{
"product_id": "your-product-id",
"advertiser_id": "your-advertiser-id",
"budget_cents": 50000,
"start_date": "2025-04-01",
"end_date": "2025-04-30",
"name": "Test Campaign"
}'
# Check delivery
uvx adcp http://localhost:8000/mcp/ --auth test-token get_media_buy_delivery '{
"media_buy_id": "your-media-buy-id"
}'
The mock adapter returns realistic simulated responses, allowing you to verify the full campaign lifecycle without affecting live inventory.
Before enabling production traffic, verify the following:
| Item | Status | Details |
|---|---|---|
| SSL/TLS configured | Required | HTTPS on your SALES_AGENT_DOMAIN |
| SSO configured | Required | At least one OAuth provider enabled |
ADCP_AUTH_TEST_MODE disabled |
Required | Must be false in production |
ENCRYPTION_KEY set |
Required | Unique, random 32+ character key |
| Ad server adapter connected | Required | GAM or other production adapter |
| Products created | Required | At least one product with pricing |
| Advertiser accounts created | Required | With production API tokens |
ENVIRONMENT set to production |
Recommended | Enables production logging and security |
| Nginx reverse proxy configured | Recommended | See Configuration |
| Backup strategy in place | Recommended | PostgreSQL backup schedule |
| Monitoring configured | Recommended | Health check endpoint polling |
Never run with ADCP_AUTH_TEST_MODE=true in production. This disables authentication and allows unrestricted access.