Back to Influencer & Partnership Outreach

Developer Handover Pack

Everything needed to build the automation from scratch: current state, full agent specs, data flow, and the build stack.

4 pagesPDF · Technical
FS-DOC-04Technical

Developer Handover Pack

Influencer & Partnership Outreach Automation

[YourCompany.com] · Marketing Department · Prepared by FullSpec · [Today's Date]

This document gives the FullSpec build team everything needed to implement the three-agent Influencer and Partnership Outreach automation end to end. It covers the current-state step map with bottlenecks flagged, full agent specifications with IO contracts, the complete data flow from trigger to output, and the recommended build stack with environment and credential requirements. The owner-facing process and SOP documentation is kept separate. Everything in this pack is build-ready: read it alongside the Integration and API Spec and the Test and QA Plan before writing any workflow code.

01Process snapshot

Step
Name
Description
1
Define Campaign Brief and Target Criteria
Marketing Manager writes a campaign brief in Notion specifying niche, audience size range, and engagement benchmarks. This step is retained in the automated flow as the trigger condition. Time cost: 30 min/cycle.
2
Research and Build Prospect Shortlist
Marketing Coordinator manually searches social platforms, blogs, and directories, then pastes names, handles, and follower counts into a Google Sheet. Highest single time cost in the process. Time cost: 120 min/cycle.
3
Find Contact Email Addresses
Coordinator uses Hunter.io manually to look up a business email per prospect and enters it into the spreadsheet row by row. Time cost: 60 min/cycle.
4
Create CRM Contact Records
Each prospect is manually entered as a new HubSpot contact with source, channel, niche, and campaign tag fields completed. Time cost: 45 min/cycle.
5
Write Personalised Outreach Pitch
Marketing Manager drafts a bespoke pitch per prospect in Gmail, manually referencing recent content and audience fit. Second-largest time sink and highly variable in quality. Time cost: 90 min/cycle.
6
Send Initial Outreach Emails
Pitch emails are sent individually from Gmail, each manually reviewed before dispatch. Time cost: 30 min/cycle.
7
Log Send Date and Status in Spreadsheet
Coordinator updates the Google Sheet with send date, email subject, and initial status of Sent. Time cost: 20 min/cycle.
8
Monitor for Replies
Marketing Manager checks Gmail inbox daily and manually identifies replies, then updates the spreadsheet. Time cost: 25 min/cycle.
9
Send Follow-Up Emails Manually
Marketer writes and sends follow-up emails by hand, often inconsistently or not at all. The step most commonly skipped. Time cost: 50 min/cycle.
10
Update CRM Deal Stage
Coordinator manually updates the HubSpot deal stage and adds a reply summary note when a prospect responds or declines. Time cost: 20 min/cycle.
11
Notify Team of Hot Leads in Slack
Marketing Manager posts a manual Slack message when a prospect shows strong interest. Time cost: 10 min/cycle.
Time cost summary: Total manual time per outreach cycle is 500 minutes (approximately 8.3 hours). At a weekly volume of roughly 40 contacts and a cadence of ongoing batches, this equates to approximately 8 hours of manual work per week. The automation replaces steps 2, 3, 4, 5, 7, 8, 9, 10, and 11. Steps 1 (brief creation) and 6 (human approval and send) are retained as deliberate human touchpoints. The three flagged bottlenecks, steps 2, 5, and 9, account for 260 of the 500 minutes per cycle and represent the highest-value automation targets.
Developer Handover PackPage 1 of 4
FS-DOC-04Technical

02Agent specifications

Prospect Research Agent

Monitors Notion for campaign briefs marked as ready, reads the target criteria (niche, audience size range, channel), generates a qualified prospect shortlist using those parameters, and calls Hunter.io to retrieve and verify a business email address for each prospect. Each verified prospect is written as a new row to a designated Google Sheet with all enrichment fields populated. Rows where Hunter.io cannot return a verified email are flagged in a dedicated status column rather than silently skipped, so the marketing coordinator can action them manually. This agent replaces the two largest research steps in the current-state flow. Estimated build time: 10 hours. Complexity: Moderate.

Trigger
A campaign brief record in Notion has its status field set to 'Ready'. The automation platform polls the Notion database every 15 minutes or receives a webhook event on status change.
Tools
Notion (brief read), Google Sheets (prospect row write), Hunter.io (email lookup and verification)
Replaces steps
2 (Research and Build Prospect Shortlist), 3 (Find Contact Email Addresses)
Estimated build
10 hours / Moderate
// Input
notion.brief.campaign_name          : string
notion.brief.target_niche            : string
notion.brief.audience_size_min       : integer
notion.brief.audience_size_max       : integer
notion.brief.channel                 : string  // e.g. Instagram, YouTube, Blog
notion.brief.engagement_benchmark    : string  // optional, e.g. '3% ER minimum'
notion.brief.campaign_angle          : string  // used downstream by Pitch Drafting Agent

// Output (one row per prospect written to Google Sheets)
sheets.row.prospect_name             : string
sheets.row.handle                    : string
sheets.row.niche                     : string
sheets.row.estimated_audience_size   : integer
sheets.row.channel                   : string
sheets.row.email_address             : string | null
sheets.row.email_verified            : boolean
sheets.row.email_status              : string  // 'verified' | 'unverified' | 'not_found'
sheets.row.campaign_name             : string  // copied from brief
sheets.row.brief_notion_id           : string  // Notion page ID for downstream reference
sheets.row.research_timestamp        : ISO8601
  • Notion integration must use an internal integration token scoped to the campaign briefs database only. The token must have read access. Confirm the Notion workspace and database ID before build.
  • The Google Sheets output tab must be named 'Prospect Staging' and must not overwrite existing rows from prior campaigns. Append-only writes. Include a campaign_name column to allow filtering per batch.
  • Hunter.io must use the Domain Search endpoint first, then the Email Finder endpoint if domain search returns no results. Cap lookups at 200 per campaign run to stay within the Hunter.io Starter plan limit of 500 searches/month. Confirm the active Hunter.io plan tier before build.
  • Prospects where email_status is 'not_found' must still be written to the sheet with a status of 'Manual lookup required'. Do not skip or discard these rows.
  • Dedupe check: before writing a row, query the sheet for an existing row with the same handle and campaign_name. If found, skip and log a duplicate warning to the error log table.
  • The research shortlist generation step uses the automation platform's built-in LLM or a connected AI model. Confirm which model is available in the chosen platform and whether output quality requires a prompt iteration pass before go-live.
  • The campaign_angle field from the Notion brief must be passed through to the Google Sheet row for use by the Pitch Drafting Agent downstream. Do not drop this field.
Pitch Drafting Agent

Reads each validated prospect row from Google Sheets where email_verified is true or email_status is 'verified', then generates a personalised outreach pitch email referencing the prospect's content niche and the campaign angle stored in the brief. Each draft is saved to Gmail via the Drafts API under the sending account. In parallel, the agent creates a new HubSpot contact record for the prospect and sets the contact's lifecycle stage and a campaign tag. The Gmail draft ID is written back to the Google Sheet row and stored on the HubSpot contact record so the follow-up agent can reference it later. No email is sent at this stage. The human approval gate at step 6 is mandatory and must not be bypassed under any build configuration. Estimated build time: 10 hours. Complexity: Moderate.

Trigger
A Google Sheets row in the 'Prospect Staging' tab has email_status of 'verified' and a draft_status column value of 'pending'. The agent runs on a scheduled poll every 30 minutes or is triggered by a Sheets webhook via the automation platform.
Tools
Google Sheets (prospect read and status write-back), Notion (campaign angle and brief read), Gmail (draft creation via Drafts API), HubSpot (contact record creation)
Replaces steps
4 (Create CRM Contact Records), 5 (Write Personalised Outreach Pitch), 7 (Log Send Date and Status in Spreadsheet)
Estimated build
10 hours / Moderate
// Input (read from Google Sheets row)
sheets.row.prospect_name             : string
sheets.row.handle                    : string
sheets.row.niche                     : string
sheets.row.estimated_audience_size   : integer
sheets.row.channel                   : string
sheets.row.email_address             : string
sheets.row.campaign_name             : string
sheets.row.brief_notion_id           : string
sheets.row.campaign_angle            : string  // fetched from Notion via brief_notion_id

// Output
gmail.draft.draft_id                 : string  // Gmail draft ID, stored back to sheet
gmail.draft.to                       : string  // prospect email_address
gmail.draft.subject                  : string  // generated by agent
gmail.draft.body_html                : string  // personalised pitch body
hubspot.contact.contact_id           : string  // newly created HubSpot contact
hubspot.contact.email                : string
hubspot.contact.properties.niche     : string
hubspot.contact.properties.channel   : string
hubspot.contact.properties.campaign_tag : string
hubspot.contact.properties.draft_status : string  // 'draft_created'
hubspot.contact.properties.gmail_draft_id : string
sheets.row.draft_status              : string  // written back: 'draft_created'
sheets.row.hubspot_contact_id        : string  // written back

// On approval (triggered by marketing manager sending the draft from Gmail)
hubspot.contact.properties.draft_status  : string  // updated to 'sent'
hubspot.contact.properties.send_timestamp : ISO8601
sheets.row.draft_status              : string  // updated to 'sent'
sheets.row.send_timestamp            : ISO8601
  • Gmail OAuth must use the sending account that the marketing manager monitors. Required scopes: gmail.compose, gmail.readonly, gmail.send (send scope used only when the manager triggers dispatch, not by the agent). Confirm the Google Workspace account and that OAuth consent has been granted before build.
  • The pitch generation prompt must include: prospect_name, handle, niche, channel, estimated_audience_size, and campaign_angle. The prompt template must be stored as a configurable variable in the automation platform's credential or environment store, not hardcoded, so the marketing team can update brand voice without a code change.
  • HubSpot contact creation must check for an existing contact with the same email address before creating a new record. If a duplicate is found, update the existing record with the campaign tag rather than creating a second contact. Use HubSpot's Contact Search API (POST /crm/v3/objects/contacts/search) for the pre-check.
  • HubSpot integration requires Sales Hub Starter or higher for sequence enrolment used by the Follow-Up and Pipeline Agent. Confirm the active HubSpot tier before starting this agent's build. Free-tier HubSpot cannot enrol contacts in sequences.
  • The draft_status field in Google Sheets acts as the state machine for this agent. Only rows with draft_status equal to 'pending' are processed. After draft creation, the agent sets draft_status to 'draft_created'. This prevents reprocessing on subsequent poll cycles.
  • If Gmail draft creation fails for any reason, write draft_status as 'draft_error' to the sheet row and insert a record into the error log table. Do not silently continue.
Follow-Up and Pipeline Agent

Monitors HubSpot contacts whose draft_status is 'sent' and checks for reply activity. Non-responders after the initial send are enrolled in a two-email HubSpot follow-up sequence timed at day 4 and day 9. When a reply or link click is detected on a contact, the agent cancels any pending sequence steps, updates the HubSpot deal stage to 'Replied', and posts a Slack alert to the marketing channel with the prospect name, reply summary, and a direct link to the HubSpot contact record. All deal stage transitions are logged with a timestamp property on the HubSpot contact. This agent replaces the four final manual steps in the current-state process. Estimated build time: 8 hours. Complexity: Moderate.

Trigger
A HubSpot contact has the property draft_status equal to 'sent' and the property sequence_enrolled is not 'true'. The automation platform polls HubSpot on a scheduled basis every 60 minutes to identify newly sent contacts not yet enrolled.
Tools
HubSpot (contact read, deal stage update, sequence enrolment and cancellation), Gmail (reply detection via Gmail API history poll), Slack (channel alert via Incoming Webhook)
Replaces steps
8 (Monitor for Replies), 9 (Send Follow-Up Emails Manually), 10 (Update CRM Deal Stage), 11 (Notify Team of Hot Leads in Slack)
Estimated build
8 hours / Moderate
// Input
hubspot.contact.contact_id           : string
hubspot.contact.email                : string
hubspot.contact.properties.draft_status : string  // must equal 'sent'
hubspot.contact.properties.send_timestamp : ISO8601
hubspot.contact.properties.sequence_enrolled : boolean
gmail.thread.reply_received          : boolean  // polled via Gmail API
gmail.thread.click_detected          : boolean  // via HubSpot email tracking

// Output: enrolment path (no reply detected within 4 days)
hubspot.sequence.enrolment_id        : string
hubspot.contact.properties.sequence_enrolled : boolean  // set to true
hubspot.contact.properties.sequence_step : string  // 'followup_1' | 'followup_2'

// Output: reply detected
hubspot.contact.properties.deal_stage : string  // updated to 'Replied'
hubspot.contact.properties.reply_timestamp : ISO8601
hubspot.sequence.cancelled           : boolean  // sequence unenrolled on reply
slack.message.channel                : string  // '#marketing' or configured channel name
slack.message.text                   : string  // includes prospect name, reply summary, HubSpot link

// Output: no reply after followup_2 (day 9)
hubspot.contact.properties.deal_stage : string  // updated to 'No Response'
hubspot.contact.properties.sequence_enrolled : boolean  // set to false
  • HubSpot sequence enrolment requires the Sales Hub Starter plan or higher. The sequence must be pre-built in HubSpot before the agent attempts enrolment. The sequence ID must be stored as an environment variable in the automation platform. Confirm the sequence ID with the marketing team during discovery.
  • Reply detection uses the Gmail API threads.list and messages.get endpoints filtered by the sending account's inbox. Poll interval should be no shorter than 30 minutes to avoid hitting Gmail API rate limits (250 quota units per second per user). Consider using HubSpot's built-in email open and reply tracking as a secondary signal where available.
  • The Slack alert must use an Incoming Webhook URL configured for the '#marketing' channel (or the channel name confirmed by the marketing team). Store the webhook URL as an environment variable. The message payload must include: prospect first name, niche, a one-line reply excerpt (first 120 characters), and a hyperlink to the HubSpot contact record.
  • Sequence cancellation on reply: use HubSpot's POST /crm/v3/objects/contacts/{contactId}/associations to cross-reference the enrolled sequence, then call DELETE on the enrolment. Confirm that the HubSpot account's sequence unenrolment API is available at the active tier.
  • The deal stage names 'Replied' and 'No Response' must match the exact stage labels configured in the HubSpot pipeline. Confirm stage names and IDs from the HubSpot pipeline settings before build. Store stage IDs as environment variables.
  • If Slack webhook delivery fails, log the failure to the error log table and retry once after 5 minutes. Do not suppress the alert silently.
Developer Handover PackPage 2 of 4
FS-DOC-04Technical

03End-to-end data flow

Full trigger-to-output data flow with field names and agent handoff boundaries
// ============================================================
// INFLUENCER & PARTNERSHIP OUTREACH -- END-TO-END DATA FLOW
// ============================================================

// TRIGGER
// Marketing Manager sets Notion brief status to 'Ready'
NOTION.database.query(
  filter: { property: 'status', equals: 'Ready' }
)
-> brief.campaign_name        : string
-> brief.target_niche         : string
-> brief.audience_size_min    : integer
-> brief.audience_size_max    : integer
-> brief.channel              : string
-> brief.campaign_angle       : string
-> brief.notion_page_id       : string

// ============================================================
// AGENT 1 HANDOFF: Prospect Research Agent
// ============================================================

// Step 1: Generate prospect shortlist from brief criteria
RESEARCH_AGENT.generate_shortlist(
  niche         : brief.target_niche,
  audience_min  : brief.audience_size_min,
  audience_max  : brief.audience_size_max,
  channel       : brief.channel
)
-> prospects[]  // array of candidate objects
   .prospect_name             : string
   .handle                    : string
   .niche                     : string
   .estimated_audience_size   : integer
   .channel                   : string

// Step 2: Email enrichment via Hunter.io for each prospect
FOR EACH prospect IN prospects[]:
  HUNTER_IO.email_finder(
    full_name  : prospect.prospect_name,
    domain     : derived from prospect.handle or known brand domain
  )
  -> prospect.email_address   : string | null
  -> prospect.email_verified  : boolean
  -> prospect.email_status    : 'verified' | 'unverified' | 'not_found'

// Step 3: Write enriched rows to Google Sheets (append-only)
GOOGLE_SHEETS.append_row(
  tab         : 'Prospect Staging',
  row_fields  : {
    prospect_name           : prospect.prospect_name,
    handle                  : prospect.handle,
    niche                   : prospect.niche,
    estimated_audience_size : prospect.estimated_audience_size,
    channel                 : prospect.channel,
    email_address           : prospect.email_address,
    email_verified          : prospect.email_verified,
    email_status            : prospect.email_status,
    campaign_name           : brief.campaign_name,
    brief_notion_id         : brief.notion_page_id,
    campaign_angle          : brief.campaign_angle,
    draft_status            : 'pending',
    research_timestamp      : now()
  }
)

// ============================================================
// AGENT 2 HANDOFF: Pitch Drafting Agent
// ============================================================

// Step 4: Read verified rows from Prospect Staging where draft_status = 'pending'
GOOGLE_SHEETS.read_rows(
  tab    : 'Prospect Staging',
  filter : { email_status: 'verified', draft_status: 'pending' }
)

// Step 5: Generate personalised pitch per prospect
FOR EACH row IN verified_rows:
  PITCH_AGENT.generate_draft(
    prospect_name           : row.prospect_name,
    handle                  : row.handle,
    niche                   : row.niche,
    channel                 : row.channel,
    estimated_audience_size : row.estimated_audience_size,
    campaign_angle          : row.campaign_angle
  )
  -> draft.subject      : string
  -> draft.body_html    : string

// Step 6: Save draft to Gmail
  GMAIL.drafts.create(
    to           : row.email_address,
    subject      : draft.subject,
    body         : draft.body_html
  )
  -> gmail.draft_id     : string

// Step 7: Create HubSpot contact (with dedupe check)
  HUBSPOT.contacts.search( email: row.email_address )
  IF no_existing_contact:
    HUBSPOT.contacts.create(
      email                : row.email_address,
      firstname            : row.prospect_name,
      niche                : row.niche,
      channel              : row.channel,
      campaign_tag         : row.campaign_name,
      draft_status         : 'draft_created',
      gmail_draft_id       : gmail.draft_id
    )
    -> hubspot.contact_id : string
  ELSE:
    HUBSPOT.contacts.update( existing_contact_id, campaign_tag, gmail_draft_id )
    -> hubspot.contact_id : string

// Step 8: Write back to Google Sheets row
  GOOGLE_SHEETS.update_row(
    draft_status       : 'draft_created',
    hubspot_contact_id : hubspot.contact_id,
    gmail_draft_id     : gmail.draft_id
  )

// ============================================================
// HUMAN GATE: Marketing Manager reviews and sends Gmail drafts
// No automation action occurs until manager sends the draft.
// On send, HubSpot contact draft_status is updated to 'sent'
// via a HubSpot workflow or a polling check on Gmail sent folder.
// ============================================================

GMAIL.sent.poll( draft_id: gmail.draft_id )
IF draft_sent:
  HUBSPOT.contacts.update(
    contact_id        : hubspot.contact_id,
    draft_status      : 'sent',
    send_timestamp    : now()
  )
  GOOGLE_SHEETS.update_row(
    draft_status      : 'sent',
    send_timestamp    : now()
  )

// ============================================================
// AGENT 3 HANDOFF: Follow-Up and Pipeline Agent
// ============================================================

// Step 9: Poll HubSpot for sent contacts not yet enrolled in sequence
HUBSPOT.contacts.search(
  filter: { draft_status: 'sent', sequence_enrolled: false }
)

// Step 10: Enrol in follow-up sequence (days 4 and 9)
FOR EACH contact IN sent_contacts:
  HUBSPOT.sequences.enrol(
    contact_id  : contact.contact_id,
    sequence_id : ENV.HUBSPOT_SEQUENCE_ID
  )
  HUBSPOT.contacts.update(
    sequence_enrolled : true,
    sequence_step     : 'followup_1'
  )

// Step 11: Monitor for reply or click
  GMAIL.threads.poll( contact_email: contact.email )
  IF reply_detected OR click_detected:
    HUBSPOT.sequences.unenrol( contact_id: contact.contact_id )
    HUBSPOT.contacts.update(
      deal_stage        : ENV.HUBSPOT_STAGE_ID_REPLIED,
      reply_timestamp   : now(),
      sequence_enrolled : false
    )
    SLACK.incoming_webhook.post(
      channel : ENV.SLACK_CHANNEL,
      text    : 'Hot lead: {prospect_name} ({niche}) replied. View: {hubspot_contact_url}'
    )

// Step 12: No reply after followup_2 (day 9 elapsed)
  IF no_reply AND sequence_completed:
    HUBSPOT.contacts.update(
      deal_stage        : ENV.HUBSPOT_STAGE_ID_NO_RESPONSE,
      sequence_enrolled : false
    )

// ============================================================
// END OF FLOW
// ============================================================
Developer Handover PackPage 3 of 4
FS-DOC-04Technical

04Recommended build stack

Orchestration layer
A workflow automation platform with one workflow per agent (three workflows total): 'Prospect Research Workflow', 'Pitch Drafting Workflow', and 'Follow-Up and Pipeline Workflow'. All three workflows share a single credential store within the platform. No credentials are hardcoded in workflow logic. The automation platform must support scheduled polling triggers, webhook receipt, HTTP request nodes, and a code or expression node for conditional branching. Platform selection is to be confirmed by the FullSpec build team before sprint start.
Webhook configuration
Notion brief trigger: configure a Notion automation or use the automation platform's polling node to query the campaign briefs database every 15 minutes for records where status equals 'Ready'. Mark processed records with a secondary status field ('Automation Triggered') immediately after pickup to prevent double-processing. Gmail sent detection: poll the Gmail sent folder every 10 minutes for draft IDs matching those stored in Google Sheets, using the Gmail API messages.list endpoint with a labelIds filter of SENT. HubSpot reply detection: use HubSpot contact property webhooks where available at the active tier, or fall back to a 60-minute scheduled poll on the contacts API filtered by draft_status equals 'sent' and last_modified within the polling window.
Templating approach
Pitch body and subject line are generated via a prompt template stored as a platform environment variable (ENV.PITCH_PROMPT_TEMPLATE). The template must include named placeholders: {{prospect_name}}, {{handle}}, {{niche}}, {{channel}}, {{estimated_audience_size}}, {{campaign_angle}}. The Slack alert message format is stored as ENV.SLACK_MESSAGE_TEMPLATE with placeholders for {{prospect_name}}, {{niche}}, {{reply_excerpt}}, and {{hubspot_contact_url}}. Sequence email body templates are maintained directly in HubSpot Sequences and are not managed by the automation platform.
Error logging
All agent-level errors (Hunter.io not_found, Gmail draft creation failure, HubSpot contact creation failure, Slack webhook failure) are written to a Supabase table named 'outreach_automation_errors'. Required columns: id (uuid), workflow_name (text), error_type (text), prospect_email (text), error_message (text), created_at (timestamptz). A Slack alert to a separate '#automation-errors' channel is triggered whenever a new row is inserted into this table, using the same Incoming Webhook mechanism as the hot-lead alerts. The marketing team does not monitor this channel; it is for the FullSpec build team and the designated automation owner only.
Testing approach
All three agents must be built and tested against sandbox or staging instances before any production credentials are used. HubSpot testing uses a HubSpot sandbox account (available on Sales Hub Professional and above; confirm availability). Gmail testing uses a dedicated test Gmail account with OAuth configured separately from the production sending account. Hunter.io testing uses a small batch of known-good test domains to validate lookup logic without consuming significant quota. Google Sheets testing uses a dedicated 'Prospect Staging - TEST' tab within the same spreadsheet, switched to the production tab only after end-to-end QA passes. Three full end-to-end test campaigns with dummy contacts must be completed and signed off before go-live, as specified in the Test and QA Plan.
Environment variables required
NOTION_INTEGRATION_TOKEN, NOTION_BRIEFS_DATABASE_ID, GOOGLE_SHEETS_ID, GOOGLE_SHEETS_TAB_NAME, GMAIL_OAUTH_CLIENT_ID, GMAIL_OAUTH_CLIENT_SECRET, GMAIL_OAUTH_REFRESH_TOKEN, GMAIL_SENDING_ADDRESS, HUBSPOT_API_KEY, HUBSPOT_SEQUENCE_ID, HUBSPOT_PIPELINE_ID, HUBSPOT_STAGE_ID_REPLIED, HUBSPOT_STAGE_ID_NO_RESPONSE, HUNTER_IO_API_KEY, SLACK_WEBHOOK_URL_MARKETING, SLACK_WEBHOOK_URL_ERRORS, SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, PITCH_PROMPT_TEMPLATE, SLACK_MESSAGE_TEMPLATE
Estimated total build time
Prospect Research Agent: 10 hours. Pitch Drafting Agent: 10 hours. Follow-Up and Pipeline Agent: 8 hours. End-to-end integration testing and QA: 8 hours (per delivery schedule). Total: 36 hours across a 4-week build window. Note: the process template records a build_effort_hours figure of 28 hours for agent logic only; the 8-hour QA and testing phase is additive and tracked separately in the Test and QA Plan.
Before any build sprint begins, the following must be confirmed and documented in the project credential log: (1) HubSpot tier is Sales Hub Starter or higher and sequence enrolment is available; (2) Gmail OAuth consent has been granted for the production sending account and refresh tokens are stored; (3) Hunter.io plan tier and monthly search quota are confirmed and the per-campaign cap of 200 lookups is acceptable; (4) the Notion briefs database ID and brief template field names match those expected by the Research Agent workflow; (5) HubSpot pipeline stage names and IDs for 'Replied' and 'No Response' are confirmed and stored as environment variables. Any of these items outstanding at sprint start will extend the build timeline. Contact support@gofullspec.com with any access or credential questions.
Developer Handover PackPage 4 of 4

More documents for this process

Every document generated for Influencer & Partnership Outreach.

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