Product Owner Guide
What every PO needs to know - the things you won't discover just by clicking through the UI
1. Complete Feature Inventory
What Actually Exists in the Product
mindmap
root((Campaign Manager))
Campaign Engine
Campaign CRUD
Phase/Step hierarchy
Computation graph (DAG)
Multi-threaded execution
Environment variables
Dependency resolution
Downstream propagation
Auto-publishing
AI Integration
6 LLM providers
Text prompts
Image generation (DALL-E)
Structured JSON output
Multi-turn sessions
Chat interface
AI Assist (Customer App)
Scripting access to LLM
Rate limiting + key pool
Content & Assets
Document templates (XSL, FTL, static)
Asset generation pipeline
Approval chain (4 stages)
Microsite deployment
S3 + CloudFront + SFTP
HTML-to-PDF conversion
HTML-to-XSLT conversion
Collaboration
Comments with approval
Audit trail (Envers)
Version restore
i18n labels
Dictionary system
User Management
OAuth2 + API keys
170+ granular permissions
Permission groups + overrides
Multi-tenancy (company isolation)
Login As (impersonation)
Data Portability
ZIP export/import
Git/MCT integration
Campaign cloning
Campaign migration
Cross-company transfer
Two Applications
Admin Console (full)
Customer App (5-step wizard)
Dynamic form engine
Field handlers
Application versioning
Feature Prerequisites Map
Before a feature works, these prerequisites must be met:
| Feature | Requires | What happens if not configured |
|---|---|---|
| AI prompts in computation | At least 1 AI model config + API key for that provider | Prompt variables fail with "model not found" error |
| Chat interface | At least 1 AI model with "Use in Chat" = true | Chat can't send messages; no model available |
| AI Assist (Customer App) | Chat-enabled model + step with aiAssistParams configured | AI Assist button not shown or fails to create chat |
| Asset deployment to microsite | Company microsite created (state = "Created") + asset in public storage | Deployment silently fails or errors with "microsite not found" |
| HTTPS on microsite | CloudFront distribution + SSL certificate provisioned | Site accessible only via HTTP |
| SFTP upload to microsite | MicrositeUser created (IAM role + credentials) | No SFTP endpoint available |
| Customer App campaign creation | At least 1 Published Template (GTM Foundation) | Step 1 blocked: "No GTM Foundation available" |
| Document view on step | Document template assigned to step + matching classes | Document view not available for that step |
| Git push/pull | GitHub OAuth configured for the user | Git operations fail with auth error |
| Computation downstream reset | User preference "Update Downstream Dependencies" = Enabled | Editing a variable doesn't auto-reset dependents (per-user setting!) |
| Image generation | "Imaging Enabled" permission + DALL-E model configured | Image features hidden in UI |
| Audit trail viewing | "Audit Enabled" permission | Audit tab not visible |
2. Implicit System Behaviors
Things the system does automatically that you won't see in any UI button or menu:
Automatic Cascades
| When you do this | The system also does this (invisibly) |
|---|---|
| Publish a campaign as template | Resets ALL environment variables and computation items back to initial state. Any computed results in the template are cleared. |
| "Start Campaign" from a template | Deep-clones the entire structure: phases, steps, CC items, env vars, i18n labels. The new campaign is independent - future template changes don't propagate. |
| Delete a campaign | Soft-deletes the record + cascading delete of all phases, steps, CC items, assets. Also deletes storage folders (public + private) and unpublishes from microsite. |
| Rename a phase | Updates all CC item path-based references that used the old phase name. |
| Rename a step | Same: updates all CC item references that used the old step name. |
| Delete a dictionary class | Removes that class from all steps and document templates that used it. |
| System restart during computation | All "in-progress" variables auto-reset to "created". No data lost, but user must re-trigger. |
| API key hits rate limit | Key auto-disabled for 15 seconds, another key from the pool takes over. Re-checked every 60 seconds. |
| Edit a CC item (with downstream pref enabled) | All dependent variables downstream are automatically reset to "created" state. |
| Computation completes + auto-deploy enabled | Assets are automatically copied from campaign storage to microsite S3 bucket. |
Critical: Publishing a template is destructive
Publishing resets all computed data. If you publish a campaign that has real results, those results are permanently cleared. This is by design (templates are structures, not data), but it's the #1 surprise for new POs.
What Does NOT Cascade
| What you might expect | What actually happens |
|---|---|
| Update a template -> live campaigns update | No. Once a campaign is started from a template, it's independent. Template changes never propagate to existing campaigns. |
| Remove a class from a step -> items lose that class | No. Classes on CC items are separate from step classes. Removing a step class doesn't change item classes. |
| Delete a file from S3 -> asset record updates | No. The asset record still references the deleted file. Next deploy will fail with "file not found". |
| Disable a user -> their campaigns are affected | No. Campaigns are independent of the creating user. Disabling a user only blocks their login. |
3. Two Applications: What Each Can Do
| Capability | Admin Console | Customer App |
|---|---|---|
| Create campaign from scratch | Yes | No (template-based only) |
| Design campaign structure (phases, steps, vars) | Yes | No |
| 5-step guided wizard | No | Yes |
| Run full computation | Yes (any scope) | Yes (via "Activate") |
| Edit individual variables | Yes (grid editor) | Limited (field handlers in Steps 4-5) |
| AI Chat | Yes (full) | Yes (embedded AI Assist) |
| File storage management | Yes (all storage types) | No |
| User/permission management | Yes | No |
| AI model configuration | Yes | No |
| Document template editing | Yes | No |
| Microsite configuration | Yes | No |
| View generated assets | Yes | Yes |
| Clone campaign | Yes | Yes (from Step 5 view) |
Application Versioning
The Customer App supports multiple versions running simultaneously. Each campaign stores which app version created it. If a user opens a campaign created with a different version, they're redirected to the correct version. This enables A/B testing of different wizard workflows.
4. Metrics & KPIs Available
The system exposes 200+ metrics via Prometheus/Grafana with 15 pre-built dashboards.
User Adoption & Engagement
| Metric | What it tells you | Actionable insight |
|---|---|---|
company.active.count | Number of active companies (tenants) | Customer growth |
campaign.created (by company) | Campaign creation volume | Feature adoption per company; identify power users |
campaign.published | Campaigns promoted to templates | Template reusability |
campaign.started | Campaigns started from templates | Template value - which templates drive adoption |
auth.login.success | Successful logins | Active user count; DAU/MAU |
chat.created | Chat sessions started | AI chat feature adoption |
chat.message.sent (by role) | User vs. assistant messages | Conversation depth; user engagement with AI |
Campaign Lifecycle Funnel
flowchart LR
Created["Created
(campaign.created)"] --> Published["Published
(campaign.published)"]
Published --> Started["Started
(campaign.started)"]
Started --> Computed["Computed
(computation.completed)"]
Track drop-off rates between each stage. High drop-off at Created->Published = template design friction. High drop-off at Started->Computed = computation reliability issues.
Performance & Reliability
| Metric | What it tells you | Alert threshold |
|---|---|---|
computation.campaign.duration P99 | End-to-end campaign computation time | P99 > 300s = user patience limit |
llm.duration P99 | AI API call latency | P99 > 55s = 504 timeout risk |
computation.failed rate | Computation failure rate | Any spike = investigate immediately |
llm.provider.pool_exhausted | All API keys for a provider exhausted simultaneously | Any occurrence = AI requests failing |
computation.graph.tasks.stuck | Tasks running > 5 minutes | Non-zero = emergency investigation |
computation.lock.rejected | Users hitting "campaign locked" error | High rate = UX friction |
Cost Drivers
| Metric | What it tells you | Optimization lever |
|---|---|---|
llm.tokens.prompt by model | Input token volume per model | Large prompts = high cost. Simplify prompts. |
llm.tokens.completion by model | Output token volume per model | High completion:prompt ratio = verbose model. Reduce max_tokens. |
llm.calls by provider | API call volume per provider | Provider pricing comparison |
file.upload.size.bytes | S3 storage consumption | Large files = high S3 cost |
computation.graph.topology.items_by_type | Prompt items per campaign | More prompt items = more LLM cost per run |
Pre-Built Grafana Dashboards
| # | Dashboard | Best for |
|---|---|---|
| 01 | Platform Overview | Executive health check: success rates, active computations, error rates |
| 02 | Campaign Lifecycle | Adoption funnel, top companies, operation durations |
| 03 | Computation Engine | Performance deep-dive: duration by type, lock rejections, thread pools |
| 04 | AI & LLM | AI cost and quality: token usage by model, error rates, latency |
| 05 | Documents & Storage | Document generation health, file upload/download volume |
| 06 | Microsite & Git | Deployment stats, Git operation performance |
| 13 | LLM Provider Availability | Provider-specific incident diagnosis: errors, retries, pool exhaustion |
5. Configuration Impact Matrix
What EXACTLY changes when you flip each setting:
Campaign-Level Settings
| Setting | Impact on system behavior |
|---|---|
| Default AI Model | All prompt/chat variables without their own model use this one. If not set, falls back to system default. If no system default exists, prompt computation fails. |
| Application ID | Links campaign to a Customer App version. Controls which handlers/UI the Customer App uses. If changed, existing Customer App users may be redirected to a different version. |
| Microsite Context Folder | Defines the URL path prefix for assets on the microsite. Supports variable placeholders. Changing this after deployment means old URLs break. |
| MCT ID | Read-only reference to source template. Used for lineage tracking and metrics grouping. Can be cleared but not changed. |
AI Model Configuration Impact
| Setting | Business impact |
|---|---|
| Temperature 0.0 | Deterministic output - same input always produces same output. Best for structured data. |
| Temperature 1.0+ | Creative/varied output. Each run produces different content. Best for marketing copy. |
| Max Tokens low (256) | Short outputs - may cut off mid-sentence. Cheap but risky for long content. |
| Max Tokens high (4096) | Full-length outputs. Higher cost per call but content won't be truncated. |
| RPM low (10) | Only 10 AI calls per minute per model. Large campaigns will be very slow. |
| RPM high (1000) | High throughput but may exceed provider's actual limit -> 429 errors. |
| "System Default" flag | All campaigns/chats without explicit model use this. Changing it affects ALL users immediately. |
| "Use in Chat" flag | Makes model available in chat dropdown. Disabling removes it from all chat sessions. |
User Preferences (Per-User!)
| Preference | Impact | PO concern |
|---|---|---|
| Update Downstream Dependencies = Enabled | Editing a variable auto-resets all dependents. More predictable but slower for iterative editing. | Different users may have different settings, leading to inconsistent behavior in same campaign. |
| Update Downstream Dependencies = Disabled | Editing a variable only changes that variable. Dependents keep old values until manually reset. | Users may not realize downstream values are stale. |
| Default Application ID | On login, user redirected to their preferred Customer App version. | If set to a removed app version, user may get errors on login. |
The per-user downstream preference is a hidden UX trap
Two users editing the same campaign will see different behavior depending on their personal preference. User A edits a variable and sees all dependents reset. User B edits the same variable and nothing else changes. This is a known source of confusion in team workflows.
6. Understanding Computation Complexity
The computation engine tracks topology metrics that reveal campaign complexity:
| Metric | What it means for the product |
|---|---|
| Total items per campaign | Campaign size. More items = longer computation. Typical: 10-200 items. |
| Initial parallelism | Items with zero dependencies = can run simultaneously. Higher = faster start. |
| Dependency ratio | 0 = all items independent (very fast). 1 = all items chained (slow serial execution). |
| Items by type | Prompt and image items drive AI cost. Function items are free. Asset items involve S3. |
| Broken references | Non-zero = template quality issue. Variables reference keys that don't exist. |
Tip for template designers
Design campaigns with high initial parallelism (many independent variables at the start) and minimize deep dependency chains. This dramatically reduces computation time because more items can use the thread pool simultaneously.
7. Critical PO Gotchas
1. Publishing a template clears ALL computed data
Don't publish if you need to preserve results. This is irreversible.
2. Template updates don't propagate to live campaigns
By design. But confusing if you expect "update template once, all campaigns update". Each campaign is an independent clone.
3. Downstream dependency preference is per-user, not per-campaign
Two users editing the same campaign see different cascading behavior. This causes confusion in team workflows.
4. Microsite deploy can silently fail
If the microsite isn't configured or the file is in private storage, deployment just doesn't happen - no error shown in UI unless you check the asset's state.
5. applicationState is unvalidated JSON
The system stores it but doesn't validate. The Customer App is responsible for handling it. Bad JSON breaks the Customer App silently.
6. Deleting S3 files doesn't update asset records
Asset records still reference the deleted file. Next deployment will fail with "file not found".
7. Changing the system default AI model affects everyone immediately
All campaigns and chats without an explicit model switch to the new default. No confirmation, no rollback.
8. Computation is limited to 1 concurrent run per campaign
If two users try to compute the same campaign, one gets "campaign locked". System-wide: max 150 threads. Under heavy load, new computations queue.
9. Session prompts accumulate tokens with each turn
Each message includes full conversation history. Long sessions can exceed the model's context window, causing failures. No automatic truncation.
10. File and folder size limits are hard (100 MB)
No warning before hitting the limit. Users discover it only when an upload fails.