Back to Social & Digital Promotion

Developer Handover Pack

Everything an engineer needs to build end to end: current state, agent specs, data flow, security, and a pre-build checklist.

4 pagesPDF · Technical
FS-DOC-04Technical

Developer Handover Pack

Social & Digital Promotion Automation

Document code
FS-DOC-04
Process
Social & Digital Promotion
Build option
Standard (recommended)
Total build effort
52 hours across 3 weeks
Audience
Developer / Technical implementer
Date
[Today's Date]
Client
[YourCompany.com]

01Process snapshot

The current process runs on 6 manual steps owned by two roles. Three of those steps are confirmed bottlenecks, accounting for the majority of the 9 hours lost per week. The table below maps each step, its owner, tool, time cost, and bottleneck status. Steps flagged as bottlenecks are the primary automation targets.

#
Step
Owner
Tool
Time
Bottleneck
Automated
1
Reformat Per Channel
Marketing Coordinator
Canva
45 min
Yes
Channel Formatting Agent
2
Schedule Each Post
Marketing Coordinator
Buffer
50 min
Yes
Scheduling Agent
3
Monitor Publishing
Marketing Coordinator
None
25 min
No
Scheduling Agent
4
Pull Channel Metrics
Marketing Coordinator
Google Analytics
40 min
Yes
Reporting Agent
5
Build Weekly Report
Marketing Lead
Google Sheets
50 min
No
Reporting Agent
6
Share With Team
Marketing Lead
Slack
15 min
No
Reporting Agent
Bottleneck steps 1, 2, and 4 are the primary automation targets. Step 3 (Monitor Publishing) is retained as a decision gate: if publishing fails, a manual fix-and-reschedule step is triggered before the flow continues.
Metric
Current state
After automation
Total manual time/week
9 hrs/week
2 hrs/week
Staff time cost/year
$19,700/year
$4,600/year
Hours saved/year
0
350 hrs
Scheduling time
5 hrs/week
1 hr/week
Report build time
4 hrs (manual)
Automatic
Posts published on time
78%
100%
Process runs/month
~60 posts
~60 posts (372 automation runs/month)
Developer Handover PackPage 1 of 4
FS-DOC-04Technical

02Agent specifications

Channel Formatting Agent

Receives an approved post from the content calendar and adapts it into channel-ready versions. Adjusts copy length, hashtag sets, image crop ratios, and platform-specific metadata for each target channel. Outputs one formatted variant per channel, ready for the Scheduling Agent to consume.

Trigger
A post is approved in the content calendar (webhook or polling interval: 5 min)
Tools
Canva API (image resize and template apply), FullSpec Automation (orchestration)
Replaces steps
Step 1: Reformat Per Channel (45 min manual)
Build time estimate
10 hours
Output
Channel-ready versions of each post (JSON payload with asset URLs and copy per channel)
Error handling
If Canva API returns an error or asset is missing, flag to coordinator via Slack and pause that post. Remaining posts continue unblocked.
Implementation note
Canva template IDs must be pre-configured per channel type. A channel config map (channel name to template ID and character limits) is required before build begins. Tone and formatting rules are configurable.
// Input
{
  "post_id": "string",
  "approved_copy": "string",
  "asset_url": "string (source image)",
  "channels": ["facebook", "instagram", "linkedin", "twitter"],
  "campaign_id": "string"
}

// Output
{
  "post_id": "string",
  "channel_variants": [
    {
      "channel": "instagram",
      "copy": "string (trimmed to 2200 chars)",
      "hashtags": ["#campaign", "#brand"],
      "asset_url": "string (resized 1080x1080)",
      "canva_export_id": "string"
    },
    { "channel": "linkedin", "..." },
    { "channel": "facebook", "..." },
    { "channel": "twitter", "..." }
  ],
  "status": "formatted | error",
  "error_detail": "string | null"
}
Scheduling Agent

Receives channel-ready post variants from the Channel Formatting Agent and schedules each to its optimal publish time via Buffer. Monitors confirmation of successful publishing. If a publish fails, routes the post to a manual fix-and-reschedule step via Slack notification and awaits resubmission before continuing.

Trigger
Channel-ready post variants exist in the queue (output from Channel Formatting Agent)
Tools
Buffer API (schedule and publish), FullSpec Automation (orchestration and decision gate)
Replaces steps
Step 2: Schedule Each Post (50 min) and Step 3: Monitor Publishing (25 min)
Build time estimate
14 hours
Output
Scheduled and confirmed posts; failure alerts for any rejected or failed publishes
Error handling
Buffer API rate limit: 60 requests/min per profile. Queue posts in batches if volume exceeds this. On publish failure (HTTP 4xx/5xx), send Slack alert with post ID and channel, set post status to 'needs_review'.
Implementation note
Optimal time scheduling uses Buffer's suggested time feature via the API. Buffer profile IDs must be mapped to channel names in the config. The decision gate (Publish OK?) is implemented as a polling check against Buffer's post status endpoint at 10-minute intervals post-scheduled-time.
// Input
{
  "post_id": "string",
  "channel_variants": [ { "channel": "string", "copy": "string", "asset_url": "string" } ],
  "preferred_send_window": "string (e.g. 09:00-12:00 local)"
}

// Output (success)
{
  "post_id": "string",
  "scheduled_posts": [
    { "channel": "instagram", "buffer_post_id": "string", "scheduled_at": "ISO8601", "status": "scheduled" },
    { "channel": "linkedin", "buffer_post_id": "string", "scheduled_at": "ISO8601", "status": "published" }
  ],
  "overall_status": "all_published | partial_failure | all_failed"
}

// Output (failure branch)
{
  "post_id": "string",
  "failed_channels": ["twitter"],
  "slack_alert_sent": true,
  "status": "needs_review"
}
Reporting Agent

Runs on a weekly schedule when the reporting window closes. Pulls performance metrics from Google Analytics for all posts published in the window. Compiles metrics into a structured weekly performance report and distributes it to the team via Slack. Eliminates the Monday-morning manual copy-paste task entirely.

Trigger
Reporting window closes (cron: every Monday 07:00 local time, or configurable)
Tools
Google Analytics Data API v1 (metrics pull), FullSpec Automation (orchestration and report compile), Slack API (distribution)
Replaces steps
Step 4: Pull Channel Metrics (40 min) and Step 5: Build Weekly Report (50 min) and Step 6: Share With Team (15 min)
Build time estimate
16 hours
Output
A compiled weekly performance report delivered to the configured Slack channel
Error handling
If Google Analytics API returns partial data or a 429 rate-limit error, retry with exponential backoff (max 3 retries). If data is still incomplete after retries, send report with a data-incomplete flag and note the affected metrics.
Implementation note
Google Analytics property ID and the relevant dimensions (source/medium, campaign, date range) must be configured before build. Report template is configurable. Slack webhook URL must be supplied by the client. A short tuning period against real data is recommended to validate metric mappings.
// Input (cron trigger, no external payload)
{
  "reporting_window_start": "ISO8601 (e.g. Monday 00:00)",
  "reporting_window_end": "ISO8601 (e.g. Sunday 23:59)",
  "ga4_property_id": "string",
  "channels_to_report": ["facebook", "instagram", "linkedin", "twitter"]
}

// Output
{
  "report_id": "string",
  "period": { "start": "ISO8601", "end": "ISO8601" },
  "summary": {
    "total_impressions": 18400,
    "total_engagements": 1220,
    "top_post_id": "string",
    "engagement_rate": 0.066
  },
  "channel_breakdown": [
    { "channel": "instagram", "impressions": 7200, "clicks": 540, "engagement_rate": 0.075 },
    { "channel": "linkedin", "impressions": 5100, "clicks": 380, "engagement_rate": 0.074 }
  ],
  "slack_message_ts": "string",
  "data_complete": true
}
Developer Handover PackPage 2 of 4
FS-DOC-04Technical

03End-to-end data flow

The diagram below traces a single approved post from trigger through all three agents to final report delivery. The failure branch at the publish gate is included. All timestamps are ISO 8601.

Social & Digital Promotion: end-to-end data flow (trigger to report)
// ─────────────────────────────────────────────────────────────────────
// TRIGGER
// ─────────────────────────────────────────────────────────────────────
Content calendar webhook fires  →  post_id, approved_copy, asset_url, channels[]

// ─────────────────────────────────────────────────────────────────────
// AGENT 1: Channel Formatting Agent
// ─────────────────────────────────────────────────────────────────────
IN  : { post_id, approved_copy, asset_url, channels[] }
      │
      ├─ Canva API  →  resize asset per channel spec (1080x1080, 1200x628, etc.)
      ├─ Canva API  →  apply channel template, embed copy with char limit enforced
      └─ Build channel_variants[]  →  { channel, copy, hashtags, asset_url, canva_export_id }

OUT : { post_id, channel_variants[], status: 'formatted' }

      ⚠ ERROR PATH: Canva API error  →  Slack alert to coordinator  →  post paused
                     remaining posts continue unblocked

// ─────────────────────────────────────────────────────────────────────
// AGENT 2: Scheduling Agent
// ─────────────────────────────────────────────────────────────────────
IN  : { post_id, channel_variants[], preferred_send_window }
      │
      ├─ Buffer API  →  POST /v1/profiles/{profile_id}/updates/create per channel
      ├─ Buffer API  →  apply suggested optimal time per profile
      └─ Buffer API  →  poll /v1/updates/{update_id} at T+10 min for status

      DECISION GATE: Publish OK?
      ├─ YES  →  status: 'published'  →  pass post_id to metrics collection queue
      └─ NO   →  Slack alert: { post_id, channel, error_code }
                  coordinator fixes and resubmits  →  re-enters Scheduling Agent

OUT : { post_id, scheduled_posts[], overall_status: 'all_published | partial_failure' }

// ─────────────────────────────────────────────────────────────────────
// METRICS COLLECTION (tool step, no agent)
// ─────────────────────────────────────────────────────────────────────
Google Analytics Data API v1
  →  POST /v1beta/properties/{property_id}:runReport
  →  dimensions: [ sessionSource, campaignName, date ]
  →  metrics:    [ sessions, engagedSessions, screenPageViews, eventCount ]
  →  dateRange:  { reporting_window_start, reporting_window_end }
  →  store raw rows in automation datastore keyed by post_id + channel

// ─────────────────────────────────────────────────────────────────────
// AGENT 3: Reporting Agent  (cron: every Monday 07:00)
// ─────────────────────────────────────────────────────────────────────
IN  : { reporting_window_start, reporting_window_end, ga4_property_id, channels[] }
      │
      ├─ Aggregate channel_breakdown[] from datastore rows
      ├─ Compute summary: total_impressions, total_engagements, top_post_id, engagement_rate
      ├─ Compile report object  →  { report_id, period, summary, channel_breakdown }
      └─ Slack API  →  POST /api/chat.postMessage  →  #marketing channel

      ⚠ ERROR PATH: GA4 rate limit (429)  →  exponential backoff, max 3 retries
                     partial data  →  report sent with data_complete: false + note

OUT : { report_id, slack_message_ts, data_complete: true }

// ─────────────────────────────────────────────────────────────────────
// FINAL OUTPUT
// ─────────────────────────────────────────────────────────────────────
Posts live on all channels  +  weekly performance report in Slack
Manual intervention required only on publish failure or partial GA4 data

04Security and compliance requirements

The table below covers data handling, credential management, access control, and audit obligations relevant to this build. The 'Status' column must be resolved before go-live. Items marked 'To confirm' require input from [YourCompany.com] or the designated process owner.

#
Requirement
Detail
Status
1
API credential storage
All API keys and OAuth tokens (Canva, Buffer, Google Analytics, Slack) must be stored in the orchestration platform's encrypted secrets vault. No credentials in plaintext config files or version control.
Required
2
OAuth 2.0 scopes: Buffer
Request minimum required scopes only: write_updates (schedule posts), read_updates (poll status). Do not request delete_updates unless explicitly needed.
To confirm
3
OAuth 2.0 scopes: Google Analytics
Use read-only scope: https://www.googleapis.com/auth/analytics.readonly. Service account preferred over user OAuth for server-side cron runs.
To confirm
4
Slack webhook security
Use a dedicated Slack app with a bot token scoped to chat:write for the target channel only. Rotate the bot token if the channel membership changes. Store token in secrets vault.
To confirm
5
Canva API access token
Canva Connect API uses OAuth 2.0. Token must be refreshed automatically before expiry (3600 s). Implement token refresh logic in the orchestration layer. Scope: asset:read, asset:write, design:content:read, design:content:write.
To confirm
6
Post content data in transit
All HTTP calls between the orchestration platform and third-party APIs must use TLS 1.2 or higher. Reject connections with invalid certificates.
Required
7
Post content data at rest
Approved copy and asset URLs passing through the automation datastore must not be retained longer than 30 days after the reporting window closes. Confirm retention policy with [YourCompany.com].
To confirm
8
Role-based access to automation config
Only the developer and designated process owner should have write access to the automation workflows and config maps. Read-only access for other team members.
To confirm
9
Audit logging
The orchestration platform must log all agent runs with: run ID, timestamp, trigger source, status (success/failure), and any error codes. Logs retained for minimum 90 days.
Required
10
Failure alert routing
Slack failure alerts must route to a named responder, not a generic channel. Confirm the alert recipient and Slack channel name with the process owner before launch.
To confirm
11
Third-party sub-processor disclosure
Buffer, Canva, Google Analytics, and Slack are sub-processors. Confirm that [YourCompany.com]'s data processing agreements cover these tools, particularly for any audience or campaign data that passes through them.
To confirm
12
Sensitive step ownership
By design, the fix-and-reschedule step remains with a human. No automation should override a post that a coordinator has manually paused. Enforce this as a hard gate in the Scheduling Agent decision logic.
Required
Items with 'To confirm' status must be resolved and signed off by the process owner before the build moves past Foundation and Integrations (Week 1). Unresolved items block go-live.
Developer Handover PackPage 3 of 4
FS-DOC-04Technical

05Pre-build checklist

The checklist is split into two groups. Items under 'Client to provide' must be supplied by [YourCompany.com] before the developer starts. Items under 'Developer to set up' are the developer's responsibility during Foundation and Integrations week.

Client to provide: all items below are blocking. Build cannot start without these.
Buffer account credentials and profile IDs for each social channel : Developer needs profile IDs to map channels in the Scheduling Agent config. Provide at least: Facebook, Instagram, LinkedIn, Twitter/X.
Google Analytics GA4 property ID and service account access : Create a Google Cloud service account, grant it 'Viewer' role on the GA4 property, and share the JSON key file with the developer securely (not via email).
Canva account with Connect API access enabled : Canva Connect API requires approval. Confirm API access is active. Provide existing channel-specific design templates or brand kit IDs for each channel type.
Slack workspace invite and target channel name for alerts and reports : Provide the name of the Slack channel where weekly reports and failure alerts should be posted. Confirm the alert recipient by name.
Content calendar tool name and webhook or API access details : The trigger fires when a post is approved in the content calendar. Provide the tool name, webhook URL or API token, and the field that signals 'approved' status.
Confirmation of channel list and posting frequency : Confirm the exact channels in scope and the expected post volume per week per channel. Template assumes approximately 60 posts/month across all channels.
Data retention and sub-processor confirmation : Process owner to confirm that Buffer, Canva, Google Analytics, and Slack are covered under existing data processing agreements and confirm acceptable retention period for automation datastore.
Developer to set up: complete these before agent build begins.
Provision FullSpec Automation workspace and configure environment variables : Create a dedicated workspace for this process. Set environment variables: BUFFER_CLIENT_ID, BUFFER_CLIENT_SECRET, GA4_PROPERTY_ID, GA4_SERVICE_ACCOUNT_KEY, CANVA_CLIENT_ID, CANVA_CLIENT_SECRET, SLACK_BOT_TOKEN.
Store all API credentials in the secrets vault : Do not reference credentials inline. Use the vault reference syntax throughout all workflow definitions. Verify vault access from the orchestration runtime.
Set up Buffer OAuth 2.0 connection and verify profile IDs : Complete OAuth handshake, confirm minimum scopes (write_updates, read_updates), and validate that GET /v1/profiles returns the expected channel profiles.
Set up Google Analytics service account and validate Data API access : Run a test report query against the GA4 property using the service account. Confirm dimensions and metrics return expected data for a recent date range.
Set up Canva API OAuth and validate template access : Complete OAuth flow, confirm asset:read, asset:write, design:content:read, and design:content:write scopes. Test retrieval of at least one channel template by design ID.
Configure Slack bot and verify posting to target channel : Install the Slack app to the workspace, set chat:write scope, invite the bot to the target channel, and send a test message to confirm delivery.
Configure channel-to-template map and character limit rules : Build the config map: channel name to Canva template ID, asset dimensions, and character limits. This map is consumed by the Channel Formatting Agent at runtime.
Set up audit logging and verify 90-day retention : Enable run logging in the orchestration platform. Confirm log retention is set to at least 90 days. Test that a failed run produces a retrievable log entry with error code.

06Recommended build stack

The stack below reflects the Standard (recommended) build option. Monthly costs and roles are based on the confirmed tooling in the process template. Total build effort is 52 hours across a 3-week delivery schedule.

Tool
Role in automation
Auth method
Monthly cost
Notes
FullSpec Automation
Orchestration, agent logic, secrets vault, audit logging
Platform login + secrets vault
$135/month
Primary orchestration layer. All agents built here.
Buffer
Post scheduling and publishing across channels
OAuth 2.0 (scopes: write_updates, read_updates)
$15/month
Profile IDs must be mapped per channel before build.
Google Analytics (GA4)
Post-publish performance metrics
Service account (OAuth 2.0, readonly scope)
$0
Service account preferred for cron-based Reporting Agent.
Canva Connect API
Asset resize and channel template application
OAuth 2.0 (asset and design scopes)
$0 (included in Canva plan)
Connect API access must be enabled by Canva; confirm before build.
Slack
Failure alerts and weekly report distribution
Bot token (chat:write scope)
$0
Slack app must be installed to workspace and invited to target channel.
Content calendar (client tool)
Trigger: post approved event
Webhook or API token (client to confirm)
Existing cost
Tool name and auth method to be confirmed by client in pre-build checklist.
Total monthly tooling cost
$150/month ($135 FullSpec Automation + $15 Buffer)
Automation cost (annualised)
$1,620/year
Total build effort
52 hours
Delivery schedule
3 weeks
Payback period
3 months
Annual saving
$15,300/year
Build cost (Standard)
$3,400
Delivery stage
Weeks
Lead agent / focus
Effort
Foundation and integrations
Week 1
Environment setup, all tool connections, secrets config
~10 hrs
Channel Formatting Agent build and test
Weeks 1 to 2
Channel Formatting Agent (Canva, FullSpec)
~10 hrs
Scheduling Agent build and test
Weeks 2 to 3
Scheduling Agent (Buffer, FullSpec)
~14 hrs
Reporting Agent build and test
Week 3
Reporting Agent (GA4, Slack, FullSpec)
~16 hrs
End-to-end QA and launch
Week 3
Full regression, stakeholder sign-off, go-live monitoring
~2 hrs
The 52-hour estimate assumes all pre-build checklist items are resolved before Week 1 starts. Delays in client-side credential provisioning or sub-processor confirmation will extend the schedule. A short tuning period against live data is recommended after go-live to validate metric mappings and channel formatting rules.
Developer Handover PackPage 4 of 4

More documents for this process

Every document generated for Social & Digital Promotion.

Launch Plan
Operations · Owner
View
ROI and Business Case
Finance · Owner
View
Process Runbook / SOP
Operations · Owner
View
Integration and API Spec
Technical · Developer
View
Test and QA Plan
Quality · Developer
View