Developer Handover Pack
Everything needed to build the automation from scratch: current state, full agent specs, data flow, and the build stack.
Developer Handover Pack
Strategic Planning Workflow
[YourCompany.com] · Management Department · Prepared by FullSpec · [Today's Date]
This document gives the FullSpec build team everything needed to implement, configure, and hand over the Strategic Planning Workflow automation. It covers the current-state step map with bottleneck flags, full agent specifications with IO contracts, the end-to-end data flow trace, and the recommended build stack. The owner's responsibilities are limited to reviewing and approving the consolidated plan in Notion; every other step described here is handled by the automation. Questions about this document should be directed to support@gofullspec.com.
01Process snapshot
02Agent specifications
Handles all data gathering and consolidation tasks at the start of each planning cycle. On trigger, the agent duplicates the standard Notion goal submission template for every active department, writes the correct team name and quarter label into each page, posts a direct Slack message to each department head with the page link and deadline, queries Google Sheets and HubSpot for current financial and pipeline figures, and writes those values into the master strategy Notion page. Forty-eight hours before the submission deadline it re-queries Notion to identify incomplete pages and sends a targeted Slack reminder only to those departments. Once the deadline passes, it reads all completed pages and merges them into the master Notion page, flagging any still-incomplete submissions for owner review. Estimated build time: 20 hours. Complexity: Moderate.
// Input
cycle_start_date: ISO 8601 date string from scheduler
quarter_label: string e.g. 'Q3 2025'
department_list: array of { dept_id, dept_name, slack_user_id, notion_template_page_id }
submission_deadline: ISO 8601 date string
// Google Sheets pull
sheets_range: 'FinancialSummary!B2:E10' -> revenue_ytd, pipeline_value, expenses_ytd, gross_margin
// HubSpot pull
hubspot_endpoint: GET /crm/v3/objects/deals filter: stage=closedwon, closedate=current_quarter
hubspot_fields: [ 'amount', 'closedate', 'pipeline' ] -> total_closed_revenue, open_pipeline_value
// Output
notion_submission_pages: array of { dept_name, page_id, page_url, status: 'created' }
slack_kickoff_messages: array of { slack_user_id, message_ts, delivery_status }
slack_reminder_messages: array of { slack_user_id, message_ts, delivery_status } // 48-hr reminder only
master_notion_page_id: string // updated with financial data and merged dept inputs
consolidation_report: { complete_count, incomplete_depts: array of dept_name, merged_at: ISO 8601 }- Notion tier must support API access (Notion Business or above required for database duplication via API). Confirm workspace plan before build starts.
- The Notion template page ID for goal submissions must be pinned in the credential store. The agent duplicates this page, not a database entry; confirm the template lives in a shared workspace accessible to the automation integration user.
- Department list (dept_id, dept_name, slack_user_id, notion_template_page_id) must be maintained as a config object in the orchestration layer, not hard-coded. This allows the owner to add or remove contributors without a code change.
- HubSpot field names for pipeline and revenue vary between accounts. The fields 'amount', 'closedate', and 'pipeline' must be confirmed against the live HubSpot instance before build. The deal stage filter value ('closedwon') must also be verified as it is case-sensitive.
- Google Sheets range 'FinancialSummary!B2:E10' is illustrative. The exact sheet name, tab name, and cell range must be confirmed with the Finance Lead before build. If the sheet structure changes, the agent will silently pull incorrect data without a schema validation step.
- Dedupe logic: if a submission Notion page already exists for a department in the current quarter (identified by quarter_label property match), the agent must skip creation and log a warning rather than duplicate the page.
- Fallback behaviour for HubSpot timeout or Google Sheets read failure: the agent must post an alert to the designated Slack error channel, write a failure record to the error log table, and continue with the rest of the cycle using null values for the affected fields, clearly marking them as unresolved in the master Notion page.
- Slack kickoff and reminder messages must use a pinned message template stored in the orchestration config. Do not hard-code message text in the workflow itself.
- The 48-hour reminder cron must only fire if at least one submission page has a status property value other than 'complete'. Add a gate check before the Slack dispatch step.
- Owner approval notification (Slack message prompting review in Notion) is triggered by the consolidation completion event, not by this agent directly. Confirm whether this notification is handled inline here or by a separate lightweight workflow step.
Manages the ongoing weekly check-in loop for the duration of each active planning quarter. Every Monday morning the agent sends a structured Slack message to each department head prompting them to update their goal status in their Notion submission page. Later that day, or at a configured read-back time, the agent queries each Notion page for updated status property values and completion percentages, calculates an overall completion rate per department and in aggregate, and posts a formatted progress summary to the designated leadership Slack channel. If a department head has not updated their page by the read-back window, the agent flags that department as unresponsive in the report rather than omitting them. Estimated build time: 14 hours. Complexity: Moderate.
// Input
cycle_status_page_id: string // Notion page where active cycle flag is stored
cycle_active_flag: boolean // agent exits if false
quarter_label: string // used to scope the correct set of submission pages
department_list: array of { dept_id, dept_name, slack_user_id, notion_page_id }
read_back_time: string // e.g. '14:00' local timezone, configurable in orchestration config
leadership_slack_channel_id: string // destination for weekly report post
// Notion read per dept page
notion_page_properties: { goal_status: enum['not_started','in_progress','complete','at_risk'], completion_pct: number 0-100, last_updated: ISO 8601 }
// Output
slack_checkin_messages: array of { slack_user_id, message_ts, delivery_status }
progress_report: { week_number, quarter_label, dept_summaries: array of { dept_name, goal_status, completion_pct, responsive: boolean }, overall_completion_pct: number, generated_at: ISO 8601 }
slack_report_post: { channel_id: leadership_slack_channel_id, message_ts, delivery_status }
// On approval (plan distribution step, handled by orchestration layer post owner approval)
distribution_trigger: { approved_by: slack_user_id, approved_at: ISO 8601, master_notion_page_url: string }
slack_distribution_messages: array of { slack_user_id, message_ts, delivery_status }- The cycle_active_flag must be the first thing the agent checks on each Monday run. If the flag is false or the Notion read fails, the agent must exit cleanly and log a skipped-run record. Do not post a partial report.
- Notion goal pages must have a standardised property schema: 'goal_status' (select), 'completion_pct' (number), 'last_updated' (date). This schema must be confirmed and applied to all department pages before the Progress Tracking Agent build begins. Pages missing these properties will return null values and cause report formatting errors.
- The leadership Slack channel ID must be stored in the orchestration config. Do not hard-code. Confirm the bot has been added to that channel with chat:write scope before deployment.
- The Slack check-in message template must include a direct link to the department's Notion page and a plain-language prompt. Store the template in the orchestration config, not in the workflow code.
- If a department Notion page returns a last_updated timestamp older than 7 days at the read-back window, mark that department as unresponsive: true in the report and display it with a visual flag in the Slack report block (amber emoji or bold label).
- The weekly report Slack post must use Slack Block Kit formatting for readability. Design and pin the Block Kit JSON template in the orchestration config. Avoid plain-text concatenation for the report body.
- overall_completion_pct is calculated as the mean of all responsive department completion_pct values. Unresponsive departments are excluded from the mean but listed separately in the report.
- Timezone handling: the Monday 08:00 cron must use the owner's configured IANA timezone string (e.g. 'America/New_York'). Store this in the orchestration config. Do not assume UTC.
- The plan distribution Slack messages (post owner approval) should be handled by the orchestration layer as a discrete step triggered by the Notion approval flag update, not by this agent's Monday cron. Confirm the handoff boundary before build.
03End-to-end data flow
// ============================================================
// STRATEGIC PLANNING WORKFLOW - END-TO-END DATA FLOW
// ============================================================
// TRIGGER
// Scheduled date-based trigger fires at cycle_start_date (ISO 8601)
TRIGGER.scheduled_date -> orchestration_layer
fields: { cycle_start_date, quarter_label, submission_deadline }
// ============================================================
// AGENT HANDOFF 1: PLANNING DATA AGENT - TEMPLATE CREATION
// ============================================================
orchestration_layer -> Planning_Data_Agent.create_submission_pages
input: {
quarter_label: string,
department_list: [{ dept_id, dept_name, slack_user_id, notion_template_page_id }],
submission_deadline: ISO 8601
}
action: Notion API POST /pages (duplicate template per department)
dedupe_check: Notion query filter { quarter_label == current, dept_id == dept_id }
output: {
notion_submission_pages: [{ dept_name, page_id, page_url, status: 'created' }]
}
// PLANNING DATA AGENT - KICKOFF NOTIFICATIONS
Planning_Data_Agent.create_submission_pages -> Planning_Data_Agent.send_kickoff_slack
input: {
department_list: [{ dept_name, slack_user_id }],
notion_submission_pages: [{ dept_name, page_url }],
submission_deadline: ISO 8601
}
action: Slack API POST /chat.postMessage (one message per dept head)
message_template: config.kickoff_message_template
output: {
slack_kickoff_messages: [{ slack_user_id, message_ts, delivery_status }]
}
// PLANNING DATA AGENT - FINANCIAL AND PIPELINE DATA PULL
Planning_Data_Agent.send_kickoff_slack -> Planning_Data_Agent.pull_financial_data
action_1: Google Sheets API GET
range: 'FinancialSummary!B2:E10'
output_fields: { revenue_ytd, pipeline_value, expenses_ytd, gross_margin }
action_2: HubSpot CRM API GET /crm/v3/objects/deals
filter: { stage: 'closedwon', closedate: current_quarter }
fields: [ 'amount', 'closedate', 'pipeline' ]
output_fields: { total_closed_revenue, open_pipeline_value }
on_error: write to error_log_table; post alert to config.error_slack_channel_id
-> Planning_Data_Agent.write_financial_to_notion
action: Notion API PATCH /pages/{master_notion_page_id}
properties: { revenue_ytd, pipeline_value, expenses_ytd, gross_margin,
total_closed_revenue, open_pipeline_value }
output: { master_notion_page_id: string, financial_write_status: 'success'|'partial'|'failed' }
// PLANNING DATA AGENT - 48-HOUR DEADLINE REMINDER
cron_trigger (deadline - 48h) -> Planning_Data_Agent.check_incomplete_pages
action: Notion API POST /databases/{submission_db_id}/query
filter: { quarter_label == current, status != 'complete' }
output: { incomplete_depts: [{ dept_name, slack_user_id, page_id }] }
gate: if incomplete_depts.length == 0 -> exit, no reminder sent
-> Planning_Data_Agent.send_reminder_slack
action: Slack API POST /chat.postMessage (targeted to incomplete depts only)
message_template: config.reminder_message_template
output: { slack_reminder_messages: [{ slack_user_id, message_ts, delivery_status }] }
// PLANNING DATA AGENT - CONSOLIDATION INTO MASTER NOTION PAGE
cron_trigger (submission_deadline) -> Planning_Data_Agent.consolidate_inputs
action: Notion API POST /databases/{submission_db_id}/query
filter: { quarter_label == current }
fields_read_per_page: { dept_name, goals: array, initiatives: array,
goal_status, completion_pct, last_updated }
output: {
complete_depts: [{ dept_name, goals, initiatives, goal_status, completion_pct }],
incomplete_depts: [{ dept_name }]
}
-> Planning_Data_Agent.write_consolidated_to_master
action: Notion API PATCH /pages/{master_notion_page_id}
append_blocks: merged dept goals, initiatives, financial summary
flag_incomplete: incomplete_depts listed with 'AWAITING INPUT' label
output: {
consolidation_report: { complete_count, incomplete_depts, merged_at: ISO 8601 }
master_notion_page_id: string
}
// ORCHESTRATION LAYER - OWNER APPROVAL NOTIFICATION
Planning_Data_Agent.write_consolidated_to_master -> orchestration_layer.notify_owner_approval
action: Slack API POST /chat.postMessage -> config.owner_slack_user_id
message: 'Planning cycle consolidated. Review and approve in Notion: {master_notion_page_url}'
output: { approval_notification_ts: string, delivery_status }
// MANUAL STEP - OWNER REVIEWS AND APPROVES IN NOTION
owner -> Notion page: sets property approval_status = 'approved'
monitored_by: orchestration_layer polling Notion GET /pages/{master_notion_page_id}
poll_interval: 30 minutes
fields_checked: { approval_status: enum['pending','approved','revision_requested'] }
// ORCHESTRATION LAYER - DISTRIBUTE APPROVED PLAN
orchestration_layer.detect_approval -> orchestration_layer.distribute_plan
trigger_condition: approval_status == 'approved'
input: { master_notion_page_url, quarter_label, approved_by, approved_at }
action: Slack API POST /chat.postMessage -> all leadership_team slack_user_ids
message_template: config.distribution_message_template
output: { slack_distribution_messages: [{ slack_user_id, message_ts, delivery_status }] }
// ============================================================
// AGENT HANDOFF 2: PROGRESS TRACKING AGENT - WEEKLY LOOP
// ============================================================
cron_trigger (every Monday 08:00 owner_timezone) -> Progress_Tracking_Agent.gate_check
action: Notion API GET /pages/{cycle_status_page_id}
field_checked: { cycle_active_flag: boolean }
if cycle_active_flag == false -> exit, log skipped_run
Progress_Tracking_Agent.gate_check -> Progress_Tracking_Agent.send_checkin_slack
input: {
department_list: [{ dept_name, slack_user_id, notion_page_id }],
quarter_label: string
}
action: Slack API POST /chat.postMessage (one per dept head)
message_template: config.checkin_message_template // includes notion_page link
output: { slack_checkin_messages: [{ slack_user_id, message_ts, delivery_status }] }
cron_trigger (every Monday config.read_back_time) -> Progress_Tracking_Agent.read_notion_pages
action: Notion API POST /databases/{submission_db_id}/query
filter: { quarter_label == current }
fields: { dept_name, goal_status, completion_pct, last_updated }
responsive_check: last_updated >= (today - 7 days) -> responsive: true, else false
output: {
dept_summaries: [{ dept_name, goal_status, completion_pct, responsive }]
}
Progress_Tracking_Agent.read_notion_pages -> Progress_Tracking_Agent.compile_report
calculation: overall_completion_pct = mean(completion_pct) where responsive == true
unresponsive_depts: listed separately in report with flag
output: {
progress_report: { week_number, quarter_label, dept_summaries,
overall_completion_pct, generated_at: ISO 8601 }
}
Progress_Tracking_Agent.compile_report -> Progress_Tracking_Agent.post_slack_report
action: Slack API POST /chat.postMessage -> config.leadership_slack_channel_id
format: Slack Block Kit JSON (template pinned in orchestration config)
output: { slack_report_post: { channel_id, message_ts, delivery_status } }
// ============================================================
// ERROR LOGGING - ALL AGENTS
// ============================================================
on_error (any agent) -> error_log_table.insert
fields: { agent_name, step_name, error_type, error_message, timestamp, cycle_id }
alert: Slack API POST /chat.postMessage -> config.error_slack_channel_id
// ============================================================04Recommended build stack
More documents for this process
Every document generated for Strategic Planning Workflow.