Agency OS - Agency User Journeys

Three distinct journeys an agency operator runs on the dashboard, broken down screen by screen: (1) connect an ad platform and confirm data is flowing, (2) set goals and alerts then monitor progress, and (3) build and share client reports. Each step lists what is on screen, what you can do, and where each click leads. Screenshots use seed (mock) data.

RRoles and access

Every screen below is gated by role. Three agency roles exist.

Admin

  • Full access to every page and Settings.
  • Connect / reconnect / disconnect platforms, manage team, delete client portal access.

Manager

  • All clients, reports, targets, and client invites.
  • No Settings access.

Member

  • Only the clients they are assigned to.
  • No Settings, no team management.

TSite map (tree)

Routes and the primary actions available on each. Labels match the sidebar.

1Connect data & confirm it is connected

The operator logs in, opens Connections, starts a platform connect, reviews the read-only consent, authorizes at the provider, picks which account to connect, and lands back on Connections where the first sync runs automatically and a green Connected badge appears.

Log in Open Connections Click Connect Account Review consent Authorize at provider Select account(s) Auto-sync runs Connected
Login screen

1Login

/login

On screen

  • Brand logo, email + password fields
  • "Forgot password" link, and a magic-link option below the divider

What clicks do

  • Sign In/dashboard (portal users route to /portal)
  • Send Magic Link → emails a one-click sign-in link
  • Forgot password → emails a reset link
Connections screen

2Connections (starting point) edit: admin

/pipeline-health

On screen

  • One collapsible card per platform: Google Ads, Meta Ads, GA4, Search Console, Basis, TikTok
  • Before connecting, a card reads "No accounts connected" with a Connect Account button
  • Each card header shows last sync time, next sync, and data-point count once connected

What you can do

  • Connect Account → opens the consent modal (next screen)
  • Members see a read-only banner: connect, sync, and disconnect are hidden
  • Basis opens an API-key form instead of OAuth
Representative mockup, not a live screenshot
LightAD
Connect Google Ads×

Read-only access. We never change your campaigns.

What will happen
1. You are redirected to Google to sign in
2. You grant read-only access
3. Return here to select which ad account to connect
Permissions we request
🛡 View your Google Ads campaigns and metrics (read-only)
Connect with GoogleCancel

3Connect consent modal

/pipeline-health → Connect Account

On screen

  • Title "Connect {platform}" with four sections: What you'll need, What will happen, Permissions we request, and a notice box
  • This is purely informational; it does not pick an account yet

What clicks do

  • Connect with Google (label varies: "Connect with Facebook", "Connect GA4", "Connect with TikTok") → redirects to the provider
  • Cancel / X → closes, nothing changes
Representative mockup, not a live screenshot
Select Google Ads Account

Choose which account to connect:

Bloom BoutiqueID: 412-555-0188
Summit Real EstateID: 730-441-9920
Apex DigitalID: 880-122-7741
Connect 2 accountsCancel

4Select account (after authorizing)

/oauth-callback (returns from provider)

On screen

  • First a "Connecting to Google..." spinner while tokens are exchanged
  • If several accounts are accessible, this multi-select picker appears (GA4 says "Select GA4 Property", GSC "Select a site")

What happens

  • Connect N accounts → saves, then returns to Connections
  • Exactly one account auto-connects (no picker); zero shows "No accounts found" with a retry link
  • Denying consent shows "Permission denied" with next-step guidance
Representative mockup, not a live screenshot
LightAD
Connections
Google Ads  1 account connectedLast sync: just now
Bloom Boutique ID: 412-555-0188  Connected Refresh

The first sync starts on its own. Later, expired tokens show "Reconnect needed"; failed syncs show "Sync Failed".

✓ Connected. Fetching your data now...

5Connected & confirmed

/pipeline-health

How you know it worked

  • Green "1 account connected" pill and a Connected badge on the account row
  • A "Last sync" time appears, and a toast reads "Connected. Fetching your data now..."
  • The 90-day Sync Health strip and sync history begin to fill in

What you can do

  • Refresh / Sync now → pulls fresh data immediately
  • Test → checks the connection is still valid
  • + Add Account → connect another account on the same platform

2Set targets & alerts, then monitor

With data flowing, the operator opens Targets & Alerts, creates a goal, adds a threshold alert, then watches progress on the home dashboard and reacts to alerts as they fire.

Open Targets & Alerts + Create Target Set scope, metric, value Alerts tab + Add Alert Monitor on Home Alert fires
Representative mockup, not a live screenshot
LightAD
Targets & Alerts
+ Create Target
TargetsAlerts
Spend > $50,000 Recurring Monthly$41,280 / $50K  
ROAS > 4.0x Recurring4.6x / 4.0x  
CPA < $30 Recurring$27.40 / $30  
Conversions > 1,200 Recurring980 / 1,200  

Grouped by Agency-wide and per client. Green dot = on track, red = behind. Lower-is-better metrics (CPA) flip the comparison.

1Targets tab

/targets

On screen

  • Two tabs: Targets and Alerts
  • Filters: scope (All / Agency-wide / Per Client), client, "Show archived"
  • Each row: actual vs target, a status dot, and an expandable history chart

What you can do

  • + Create Target → opens the create form (next screen)
  • Per row 3-dot menu: Edit, Pause/Resume, View History, Archive, Delete
  • Members can only act within their assigned scope
Representative mockup, not a live screenshot
Create Target×
Scope
Agency-widePer Client
Client *
Bloom Boutique ▾
Goal Name *
Q2 Spend Target
Platform *
Google Ads ▾
Metric *
Spend ▾
Type
One-timeRecurring
Condition *
Greater Than ▾
Target Value *
50000
Time Period
Repeats monthly ▾
Create TargetCancel

2Create Target form

/targets → + Create Target

Fields, in order

  • Scope (Agency-wide / Per Client), Client, Goal Name
  • Platform, then Metric (options depend on platform)
  • Type (One-time / Recurring), Condition (Greater / Less / Equal Than), Target Value
  • Period: Start + Due date (one-time) or Repeats daily/weekly/monthly (recurring); optional Description

What clicks do

  • Create Target → validates, saves, toast "Target created", row appears with a status dot
  • Cancel → closes without saving
Representative mockup, not a live screenshot
LightAD
Targets & Alerts
+ Add Alert
TargetsAlerts

3 active rules across 2 clients

Bloom Boutique · Google Ads · CPA > $35Active
Agency · Meta Ads · Spend > $5,000Active
Summit · GA4 · Sessions < 1,000Paused

3Alerts tab

/targets?tab=alerts

On screen

  • Table columns: Client, Platform, Rule, Status, Actions
  • Rule reads as metric + symbol + threshold (for example "CPA > $35")
  • Status pill: Active, Paused, or Archived

What you can do

  • + Add Alert → opens the alert form (next screen)
  • Per row: Pause/Enable, edit, archive, delete (delete asks "Confirm?")
Representative mockup, not a live screenshot
Create Alert×

Bloom Boutique

Scope
Bloom Boutique ▾
Platform
Google Ads ▾
Metric
CPA ($) ▾
Condition
Greater Than ▾
Trigger Value ($)
35
Interval
Day ▾
Description (optional)
Add a note about this alert...
Create AlertCancel

4Add Alert form

/targets?tab=alerts → + Add Alert

Fields, in order

  • Scope (Agency-wide or a client), Platform, Metric
  • Condition (Greater / Less / Equal Than) and Trigger Value side by side
  • Interval (Hour / Day / Week / Month), optional Description

What clicks do

  • Create Alert → saves the rule; it begins evaluating on its interval
  • When breached it raises a notification (final screen)
Home overview dashboard

5Home (monitor progress)

/dashboard

On screen

  • Shown here in first-run state: before any platform is connected, an onboarding prompt appears; once data syncs, the cards populate
  • Headline KPI cards (spend, ROAS, conversions and more) with a target dot and sparkline
  • Client health overview, an alerts panel, and a notifications bell

What you can do

  • Watch each KPI's target dot to see whether you are tracking to the goals set above
  • Change the date range to re-scope every KPI; manual refresh from the top bar
  • Open the bell to see fired alerts and target milestones (next screen)
Representative mockup, not a live screenshot
🔔 3AD
NotificationsMark all read
CPA exceeded $35 on Bloom Boutique
Bloom Boutique · 2h ago
View
Meta spend over $5,000 this week
Agency · 5h ago
View
View all alerts

6Notifications (alert fired)

top bar bell, on any dashboard route

On screen

  • Bell with an orange unread count; dropdown headed "Notifications"
  • Each item: a severity dot (red error / amber warning / blue info / green success), the message, client, and relative time
  • Empty state reads "No notifications -- all clear"

What clicks do

  • View → marks read and opens /targets?tab=alerts
  • Dismiss → removes the item; Mark all read clears the count
  • View all alerts → the Alerts tab

3Build & share reports

The operator filters Reporting to a client, generates a report now or schedules a recurring one, reviews the print-ready output, then opens the client and grants read-only portal access.

Open Reporting Select a client Generate Report Sections + delivery Or schedule recurring Report opens Open client Invite to portal
Representative mockup, not a live screenshot
LightAD
Reporting
📄 Generate Report
Bloom Boutique ▾ All Platforms ▾ Apr 24 - May 23 ▾
Key Metrics
Spend
$41,280
Conversions
980
ROAS
4.6x
CTR
3.1%
Ads Performance

1Reporting generate: admin/manager

/reporting

On screen

  • Filters: client (All Clients), platform (All Platforms), and a date-range picker
  • Sections: Key Metrics, Ads Performance, Website Performance (GA4), SEO (GSC), and a Reports panel when a client is selected

What you can do

  • Generate Report → opens the modal; disabled until a client is selected (tooltip "Select a client")
  • Switch filters to drill in; there are no per-client pages
Representative mockup, not a live screenshot
Report×
Generate NowSchedule
Client
Bloom Boutique
Date range
Last 7 DaysLast 30 DaysThis MonthLast MonthCustom
Include sections
Executive Summary Google Ads Meta Ads GA4 SEO
Delivery method
Open in browser (print to PDF)
Download PDF
Generate ReportCancel

2Generate Now

/reporting → Generate Report

On screen

  • Tabs: Generate Now and Schedule; client shown read-only
  • Date range presets (or Custom), and seven section checkboxes (all on by default)
  • Delivery: Open in browser (print to PDF) or Download PDF

What clicks do

  • Generate Report (browser) → opens /report/:clientId in a new tab
  • Generate Report (PDF) → renders via the PDF service ("Generating your report...")
Representative mockup, not a live screenshot
Report×
Generate NowSchedule
Schedule name
Monthly Performance Report
Frequency
daily   weekly   monthly
Day
Monday ▾
Time
09:00
Timezone
America/Chicago ▾
Date range in report
Last 30 Days ▾
Recipients
jane@bloom.com
Save ScheduleCancel

3Schedule (recurring email)

/reporting → Generate Report → Schedule

Fields

  • Schedule name, Frequency (daily/weekly/monthly), Day (weekly) or Day of month (monthly)
  • Time + Timezone, Include sections, Date range in report
  • Recipients: one email per line

What clicks do

  • Save Schedule → the system emails the PDF automatically on cadence
  • Saved schedules appear in the Reports panel on the Reporting page
Representative mockup, not a live screenshot
← BackPrint / Save as PDF
Bloom Boutique
Digital Marketing Report
Apr 24 - May 23, 2026
Performance Overview
Total Spend
$41,280
Conversions
980
ROAS
4.6x
Sessions
22,140
Spend Over Time

4Generated report (print / PDF view)

/report/:clientId

On screen

  • White-label cover: agency logo and colors, "Digital Marketing Report", client name, date range
  • Performance Overview, then Google Ads, Meta Ads, Website Analytics (GA4), SEO, and All Campaigns sections
  • No "Agency OS" branding anywhere; only the agency's identity

What you can do

  • Print / Save as PDF → the browser print dialog
  • ← Back → returns to /reporting
Representative mockup, not a live screenshot
LightAD
Clients
+ Add Client
Search clients...All ▾
Bloom Boutique · e-commerceActive
Summit Real Estate · real estateActive
Apex Digital · SaaSInactive

Each row also shows platform icon chips (connected platforms in color). Click a row to open the client.

5Clients list

/clients

On screen

  • Search box and a status filter (All / Active / Inactive / Archived)
  • Table: Client, Status, Created, Actions, plus a row of platform chips
  • Members see only their assigned clients

What clicks do

  • Click a row → /clients/:id (next screen)
  • + Add Client / Edit → the client form (admin/manager)
Representative mockup, not a live screenshot
LightAD

← Back to Clients

Bloom Boutique Active
e-commerce
Spend (30d)
$18,400
ROAS
5.1x
Conversions
612
Client portal accessInvite
Jane Smith jane@bloom.comActive
Mark Lee mark@bloom.comInvited

6Client detail

/clients/:id

On screen

  • Client performance summary and assigned team members
  • A Client portal access section listing invited clients, their status, and last sign-in ("Not signed in" until they do)

What you can do

  • Invite / Invite Client → opens the invite modal (next screen)
  • Status badges: Invited, Active, Inactive
  • Admins can delete a client's access
Invite client modal

7Invite a client (share reporting access)

/clients/:id → Invite Client

On screen

  • Client contact name, email address, and an optional personal message
  • A "What your client will see" preview, and a read-only scope note

What clicks do

  • Send Invitation → validates the email, then shows "Invitation sent to ..."
  • The client gets an email, sets a password, and lands on their own read-only portal
  • The new row appears as Invited until they accept

MWhat you can do (by role)

Actions available on the dashboard, and which role can perform each.

ActionAdminManagerMember
View Home / KPIsYesYesAssigned clients
View ReportingYesYesAssigned clients
Generate / schedule reportsYesYesNo
Create targets & alertsYesYesAssigned scope
Connect / reconnect platformsYesView onlyView only
Invite a client to the portalYesYesNo
Delete a client's portal accessYesNoNo
Manage team / assign clientsYesNoNo
Branding & account settingsYesNoNo
Live captures: Login, Connections (starting point), Home, and the Invite Client modal are real screenshots taken against seed (mock) data, so no real client information appears. Representative mockups: the remaining screens (Connect consent, Select account, Connected state, Create Target, Alerts tab, Add Alert, Notifications, Reporting, Generate Now, Schedule, generated report, and Clients list) render through OAuth provider calls or server-side functions that do not surface seed data in local preview, so they are faithfully reconstructed in HTML from the real components, field labels, and brand rather than captured. Each is labeled accordingly.