Run Reddit campaigns for multiple clients. One API key per account, full control.
Running Reddit marketing for 5 clients manually means 5 sets of logins, 5 separate planning sessions, 5 different posting schedules, and 5 weekly reports — all assembled by hand. At 2–4 hours per client per week, you hit a ceiling around 4–5 clients where the operations overhead makes it impossible to onboard more without hiring.
The data problem is equally painful: client reports are manually assembled from screenshots, spreadsheets, and platform dashboards. Every week, someone spends 90 minutes copying numbers into a Notion doc or Google Sheet. Clients want real-time visibility; you can only provide last week's static numbers.
The solution is treating each client's API key as the isolation boundary and building your own orchestration layer on top. Your backend loops over client configurations, runs discovery and scheduling for each independently, and generates automated reports — turning a 4-hour/client manual process into a 20-minute review.
The Reoogle API is designed for multi-tenant use from the ground up. Each client has their own account, their own API key, and their own data isolation. Your agency backend stores the keys in a secrets vault, iterates over clients on a schedule, and runs discovery, scheduling, and reporting for each independently. The result is a single interface you control that orchestrates multiple campaigns simultaneously — scaling to 10, 20, or 50 clients without proportional operations overhead.
Establish a secure key management pattern
Store each client's rog_live_ API key in a secrets vault (AWS Secrets Manager, Doppler, or even a simple encrypted Supabase table). Never hardcode keys or store them in environment variables where they're difficult to rotate. Build a getClientKey(clientId) abstraction that your entire backend uses — this makes key rotation trivial.
Build a client configuration schema
For each client, store: apiKey, category, postingFrequency (posts per week), contentTemplate (default title/body template), blockedSubreddits (ones that have removed posts), and targetMinMembers. This configuration drives all automated decisions and can be updated per client without code changes.
Run per-client subreddit discovery daily
For each client, call GET /subreddits/postable with their category and filter settings. Store the results in a per-client database table and refresh daily. This gives every client a tailored, always-current list of target communities — not a generic shared one.
Build a unified scheduling queue
Each morning, run a scheduling pass for all clients: fetch each client's pending content, select the day's target subreddits from their discovery list, and call POST /schedule for each post with staggered timing. Your scheduler should enforce per-client posting limits and minimum gaps between posts to the same subreddit.
Create a centralised monitoring dashboard
Poll GET /ai-posts for each client key every hour and write results to a shared database. Build a simple internal dashboard (Retool, or a custom Next.js app) that shows all clients' current post queue, live scores, and recent performance in one view — so your team can spot issues without logging into 5 accounts.
Automate weekly performance reports
Every Monday morning, run a report generation job: pull the past 7 days of post data for each client, calculate aggregate metrics (total posts, avg score, top performer, total comments), and format them into a branded email or Notion doc. Clients get data-driven reports automatically; you spend zero time on manual assembly.
Track usage against plan limits
Call GET /me/usage for each client key to check their API quota consumption. Build alerts that fire when a client is within 20% of their monthly limit — giving you time to upgrade their plan or throttle posting before they hit a wall. Usage visibility prevents surprise quota overages that interrupt campaigns mid-month.
Multi-client scheduler
interface Client {
name: string;
apiKey: string;
category: string;
postTemplate: { title: string; body: string };
}
async function runDailyCampaign(clients: Client[]) {
for (const client of clients) {
const headers = { Authorization: 0