Deliverable Planner
[Live] ·
agent__deliverable-planner· Claude Sonnet 4.6
Converts the approved marketing strategy into concrete monthly deliverable commitments — specifying what gets produced, how much, and on which channels — and writes the Goal and Deliverable records that drive the production pipeline.
Overview
| Function | Convert approved strategy into concrete monthly deliverable volumes by channel and content type |
| Type | Strategy |
| Model | Claude Sonnet 4.6 |
| Queue | agent__deliverable-planner |
| Concurrency | 5 |
| Timeout | 5 min |
| Est. cost / task | ~$0.35 |
| Plan | Free+ (all tenants) |
Triggers
| Trigger type | When | Who initiates |
|---|---|---|
| Scheduled / cron | Auto-triggered when tenant admin approves the strategy document for the first time | Platform scheduler (event-chained from Strategy Writer approval) |
| Human on-demand | ”Refresh Plan” button in Dashboard → Strategy → Deliverable Plan; also auto-triggered when strategy is refreshed and re-approved | Tenant admin |
| Activity Planner dispatch | Not applicable — Deliverable Planner runs before the Activity Planner; Activity Planner reads the output of this agent | — |
Input
interface DeliverablePlannerInput {
tenantId: string;
approvedStrategy: string; // Full Markdown of the approved strategy document
planType: 'free' | 'pro' | 'agency' | 'enterprise';
connectedChannels: string[]; // Active OAuth channel slugs
budgetHint?: string; // Optional — e.g. "~$2,000/month ad spend" from onboarding
monthlyHours?: number; // Optional — agency capacity scoping (e.g. 20 hours/month)
existingDeliverables?: DeliverableRecord[]; // Only on refresh — current commitments for comparison
}
interface DeliverableRecord {
type: string; // e.g. "blog_post", "gbp_post", "social_post"
monthlyVolume: number;
platforms: string[];
}Output
interface DeliverablePlannerOutput {
tenantId: string;
generatedAt: string; // ISO 8601 timestamp
goals: GoalRecord[]; // Goal records to create in the database
deliverables: DeliverableSpec[]; // Deliverable records to create in the database
monthlyCostEstimate: number; // Estimated Leadmetrics credit cost per month
changesSummary?: string; // Only on refresh — what changed vs existing plan
planningNotes: string; // Rationale, trade-offs, assumptions made
}
interface GoalRecord {
title: string; // e.g. "Grow organic search traffic by 40%"
metric: string; // e.g. "Google Search Console impressions"
targetValue: string; // e.g. "+40%"
timeframeMonths: number; // e.g. 6
channel?: string; // Primary channel this goal tracks against
linkedDeliverableTypes: string[]; // Which deliverable types contribute to this goal
}
interface DeliverableSpec {
type: string; // Canonical deliverable type slug (see deliverable-types list)
label: string; // Human-readable e.g. "SEO Blog Post"
monthlyVolume: number; // How many per month
platforms: string[]; // e.g. ["google_search", "website"]
priority: 'high' | 'medium' | 'low';
rationale: string; // One sentence explaining why this volume on this channel
agentQueue: string; // Which agent will produce it e.g. "agent__blog-writer"
estimatedCostPerUnit: number; // In platform credits
}Sample output excerpt
{
"goals": [
{
"title": "Grow organic search traffic by 40% in 6 months",
"metric": "Google Search Console impressions",
"targetValue": "+40%",
"timeframeMonths": 6,
"channel": "google_search",
"linkedDeliverableTypes": ["blog_post", "gbp_post"]
},
{
"title": "Generate 25 additional booked enquiries per month from website",
"metric": "Website contact form submissions",
"targetValue": "+25/month",
"timeframeMonths": 3,
"channel": "website",
"linkedDeliverableTypes": ["blog_post", "google_ads_copy"]
}
],
"deliverables": [
{
"type": "blog_post",
"label": "SEO Blog Post",
"monthlyVolume": 4,
"platforms": ["website", "google_search"],
"priority": "high",
"rationale": "4 posts/month builds keyword coverage at a sustainable pace; aligns with the pricing-transparency content opportunity identified in strategy.",
"agentQueue": "agent__blog-writer",
"estimatedCostPerUnit": 2
},
{
"type": "gbp_post",
"label": "Google Business Profile Post",
"monthlyVolume": 8,
"platforms": ["google_business_profile"],
"priority": "high",
"rationale": "2 posts/week maintains GBP freshness signal for Ipswich and Brisbane local pack rankings.",
"agentQueue": "agent__gbp-post-writer",
"estimatedCostPerUnit": 1
},
{
"type": "google_ads_copy",
"label": "Google Ads RSA Copy Set",
"monthlyVolume": 1,
"platforms": ["google_ads"],
"priority": "medium",
"rationale": "Monthly copy refresh for emergency plumbing and blocked drain campaigns to maintain Quality Score.",
"agentQueue": "agent__google-ads-writer",
"estimatedCostPerUnit": 2
}
],
"monthlyCostEstimate": 21,
"planningNotes": "Plan is calibrated for a Pro plan with 20 hours/month agency capacity. Blog volume reduced from a possible 6/month to 4/month to leave capacity for GBP management and ad copy. LinkedIn was excluded — no evidence the target audience (homeowners) discovers tradies via LinkedIn."
}How It Works
-
Receive job — BullMQ dequeues the job with the approved strategy Markdown, plan type, connected channels, and optional scoping hints.
-
RAG: uploaded targets — Call
rag_searchagainst the Client Documents dataset for “deliverable targets”, “content volume”, “publishing schedule”, “monthly output”. If the tenant or agency has uploaded a content plan, scope document, or SOW, these are loaded to anchor the volume decisions. -
Plan and channel filtering — Map
planTypeandconnectedChannelsto the canonical list of available deliverable types. Only deliverable types that have a corresponding agent queue and are available on the tenant’s plan are candidates. No deliverables are planned for disconnected channels. -
LLM planning call — Send approved strategy + RAG context + plan/channel constraints to Claude Sonnet 4.6 with the Deliverable Planner system prompt. Model returns the full
DeliverablePlannerOutputJSON. -
Goal extraction validation — Cross-check that every goal in the strategy document is represented by at least one deliverable. If a goal has no linked deliverable type, the model is re-prompted to either add a deliverable or explain why the goal is not addressable given the plan constraints.
-
Cost estimate calculation — Worker sums
monthlyVolume × estimatedCostPerUnitacross all deliverables to producemonthlyCostEstimate. If this exceeds the plan’s monthly credit limit, the model is re-prompted to reduce volumes or de-prioritise low-priority deliverables. -
Persist — Goal records written to the
goalstable. Deliverable specs written to thedeliverable_templatestable. Both keyed bytenantId. Previous plan archived ifexistingDeliverableswas provided. AnAgentRunrecord is created at job start (agent:started) and updated on completion/failure (agent:completed/agent:failed) so the run is visible in the Execution Queue. -
Trigger downstream — Creates an approval record for the tenant admin. On approval, the Activity Planner can begin creating activity pipelines against this plan.
System Prompt
You are a senior digital marketing account manager. You have been given an approved marketing strategy document for a client. Your job is to convert it into a concrete monthly deliverable plan — specific content types, volumes per channel, and priorities.
TENANT SETTINGS: {{TENANT_SETTINGS}}
PLAN TYPE: {{PLAN_TYPE}}
CONNECTED CHANNELS: {{CONNECTED_CHANNELS}}
MONTHLY CAPACITY HINT: {{MONTHLY_HOURS}} hours/month
BUDGET HINT: {{BUDGET_HINT}}
APPROVED STRATEGY:
{{APPROVED_STRATEGY}}
CLIENT CONTEXT FILE:
{{CLIENT_CONTEXT}}
UPLOADED SCOPE DOCUMENTS:
{{RAG_CONTEXT}}
AVAILABLE DELIVERABLE TYPES FOR THIS PLAN:
{{AVAILABLE_DELIVERABLE_TYPES}}
Your output must:
1. Create a GoalRecord for each SMART goal in the strategy — extract the metric, target value, and timeframe precisely
2. Create a DeliverableSpec for each content type that should be produced monthly
3. Set monthlyVolume based on: (a) what the strategy recommends, (b) the plan capacity, (c) any uploaded scope documents
4. Only include deliverable types available on the {{PLAN_TYPE}} plan
5. Only include channels that are in the {{CONNECTED_CHANNELS}} list
6. Write a one-sentence rationale for each deliverable volume decision
7. Write planningNotes explaining any trade-offs, assumptions, or things excluded and why
Be conservative. It is better to plan a sustainable volume the client can be proud of than an ambitious volume that gets missed. If monthlyHours is provided, ensure the total workload is achievable within that capacity.
Output must be valid JSON matching the DeliverablePlannerOutput schema.Skills Injected
| Skill file | Purpose |
|---|---|
client-context-file.md | Always injected — provides business type, channels, and audience context to inform appropriate content volumes |
deliverable-types.md | Canonical list of all deliverable types, their agent queues, plan availability, and typical monthly volume ranges |
deliverable-types.md — content
# Deliverable Types — Canonical Reference
## Content Deliverables
| Type slug | Label | Agent queue | Min plan | Typical monthly range | Cost / unit |
|---|---|---|---|---|---|
| `blog_post` | SEO Blog Post | `agent__blog-writer` | Free | 2–8 | 2 credits |
| `gbp_post` | Google Business Profile Post | `agent__gbp-post-writer` | Free | 4–12 | 1 credit |
| `social_post` | Social Media Post | `agent__social-post-writer` | Pro | 8–30 | 1 credit |
| `email_newsletter` | Email Newsletter | `agent__email-writer` | Pro | 1–4 | 2 credits |
| `landing_page` | Landing Page Copy | `agent__landing-page-writer` | Pro | 0–2 | 3 credits |
| `google_ads_copy` | Google Ads RSA Set | `agent__google-ads-writer` | Pro | 1–3 | 2 credits |
| `meta_ads_copy` | Meta Ads Copy Set | `agent__meta-ads-writer` | Pro | 1–3 | 2 credits |
## Research Deliverables
| Type slug | Label | Agent queue | Min plan | Notes |
|---|---|---|---|---|
| `keyword_cluster` | Keyword Research Cluster | `agent__keyword-researcher` | Free | Usually 1/month; feeds blog content |
| `content_brief` | SEO Content Brief | `agent__content-brief-writer` | Free | 1 per blog post planned |
## Analysis Deliverables
| Type slug | Label | Agent queue | Min plan | Notes |
|---|---|---|---|---|
| `monthly_report` | Monthly Performance Report | `agent__report-writer` | Pro | Always 1/month if on Pro+ |
| `social_calendar` | Social Media Calendar | `agent__social-calendar-planner` | Pro | 1/month; required before social_post batch |
## Volume Guidelines
**Conservative (recommended for new clients):**
- Blog: 2/month
- GBP: 4/month (1/week)
- Social: 8–12/month (2–3/week)
**Standard:**
- Blog: 4/month
- GBP: 8/month (2/week)
- Social: 16–20/month (4–5/week)
**Aggressive (Agency/Enterprise only):**
- Blog: 6–8/month
- GBP: 12/month (3/week)
- Social: 24–30/month (daily)
## Dependency Rules
- `blog_post` requires a `content_brief` — always plan 1 content brief per blog post
- `social_post` batch requires a `social_calendar` — always plan 1 calendar/month if social posts are planned
- `google_ads_copy` requires at least 1 `keyword_cluster` to have been runRAG Usage
| Dataset | Query example | When used |
|---|---|---|
| Client Documents | "deliverable targets", "content volume", "publishing schedule", "monthly output", "scope of work" | Step 2 — loads any uploaded scope documents or content plans that specify output targets |
| Website Content | Not queried | Not applicable at this stage |
| Published Content | Not queried | Existing content performance is addressed at strategy level, not planning level |
| Competitor Research | Not queried | Competitor data already incorporated via strategy document |
Tools Required
| Tool | Method | Purpose | Required? |
|---|---|---|---|
rag_search | search | Query Client Documents for uploaded scope and content volume targets | Yes |
No external web tools are called. This agent is a pure planning step.
HITL Gates
Gate 1 — Deliverable plan review The deliverable plan is surfaced to the tenant admin in Dashboard → Strategy → Deliverable Plan. They see:
- A table of each deliverable type with monthly volume and channel
- The total monthly credit estimate
- The goals with their linked deliverable types
Admin actions:
- Adjust monthly volumes per deliverable type (slider/number input)
- Enable or disable specific deliverable types
- Approve the plan (“Start producing content”)
Approval triggers the Activity Planner to create the first month’s activity pipeline.
Gate 2 — Credit limit warning
If monthlyCostEstimate exceeds the tenant’s monthly credit allocation by more than 20%, the approval UI shows a warning: “This plan may use more credits than your monthly allowance. Consider reducing volumes or upgrading your plan.” The admin can still approve with the warning.
Guardrails
deliverablesarray must contain at least 1 entry.- Every goal in the strategy must be linked to at least 1 deliverable type in
linkedDeliverableTypes. monthlyVolumefor any deliverable type must not exceed the maximum defined in the deliverable-types matrix.- Only deliverable types available on the tenant’s plan are included — validated post-generation.
agentQueuevalues must exactly match the canonical queue names in the deliverable-types matrix.- If
monthlyHoursis provided, the total volume must not imply more thanmonthlyHours × 3agent-hours (rough heuristic: ~3 agent-hours per deliverable unit).
Tenant Settings Used
| Setting | How it’s used |
|---|---|
plan | Filters available deliverable types; constrains volumes to plan entitlements |
connectedChannels | Excludes deliverable types requiring disconnected channels |
tenantId | Keys the goal and deliverable records in the database |
industry | Used by the model to sanity-check volume suggestions (local service vs B2B have different norms) |
Cost Profile
| Avg input tokens | ~8,000 (strategy document + RAG + system prompt) |
| Avg output tokens | ~800 |
| Est. cost / task | ~$0.35 |
Error Handling
| Error | Response |
|---|---|
| Approved strategy is empty or missing | Fail immediately; surface error: “Cannot plan deliverables — no approved strategy found” |
| All deliverable types are filtered out (plan or channel mismatch) | Fail with HITL gate: “No deliverables available for your current plan and connected channels. Connect channels in Dashboard → Integrations to enable content production.” |
| Cost estimate exceeds plan credit limit by >50% | Re-prompt with hard cap instruction; if still over after retry, surface HITL warning and require explicit admin acknowledgement |
| Goal has no linkable deliverable type | Note in planningNotes: “Goal ‘[title]’ cannot be addressed through content deliverables on this plan. Consider upgrading or addressing this goal through other means.” |
| RAG returns no results | Proceed without scope documents; note in planningNotes |
| LLM returns malformed JSON | Retry once with strict JSON-only instruction; if still failing, log and create HITL flag |