Back to Influencer & Partnership Outreach

Test and QA Plan

How the build is validated before go-live: three sequential test phases, edge cases, and production verification.

4 pagesPDF · Quality
FS-DOC-06Quality

Test and QA Plan

Influencer and Partnership Outreach Automation

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

This document defines the full quality assurance process for the Influencer and Partnership Outreach automation. It is written for the FullSpec team responsible for building and verifying the three-agent workflow covering prospect research, pitch drafting, and follow-up pipeline management. Testing is structured across three sequential phases: unit, integration, and end-to-end production. No phase begins until all test cases in the previous phase achieve a passing result. The process owner joins Phase 3 to perform a final approval run on live infrastructure.

01Testing approach

All testing follows three phases in strict sequence. No phase begins until every test case in the preceding phase has achieved a passing result and that result has been logged in the FullSpec test tracker. Phase 1 validates each agent in isolation using mocked or sandboxed credentials. Phase 2 validates cross-agent handoffs and edge-case resilience. Phase 3 exercises the complete workflow end-to-end against live production credentials with the process owner present to confirm outcomes.

1
Phase 1: Unit Testing
Each agent tested in isolation before any integration work begins
Scope
Individual agent logic: Prospect Research Agent, Pitch Drafting Agent, Follow-Up and Pipeline Agent
Environment
Sandbox only. No live HubSpot contacts, no real Hunter.io credits consumed, no real Gmail account used
Credential rule
Sandbox API keys and OAuth tokens exclusively. Production credentials must not be present in any Phase 1 environment variable
Pass condition
All test cases T01 through T15 return the expected output with no unhandled exceptions
Who runs it
FullSpec team only
2
Phase 2: Integration and Edge Case Testing
Agent handoffs and failure scenarios validated before production credentials are loaded
Scope
Cross-agent data handoffs (Research to Drafting, Drafting to Follow-Up), tool API responses, and all defined edge cases
Environment
Sandbox for all API calls. Mocked webhook responses used where sandbox equivalents are unavailable
Credential rule
Sandbox credentials only. Edge-case tests may use intentionally malformed or stubbed payloads to simulate failure states
Pass condition
All integration test cases T16 through T24 and all edge cases E01 through E08 resolve with correct outputs or correctly routed error handling
Who runs it
FullSpec team only
3
Phase 3: End-to-End Production Testing
Full workflow run against live credentials with process owner sign-off
Scope
Complete workflow from Notion brief trigger through to Slack hot-lead alert, using live credentials across all six connected tools
Environment
Production. All tool credentials are live. Test contacts must use internal addresses and be voided from HubSpot after the run
Credential rule
Production OAuth tokens and API keys. The Gmail sending account must be the authorised outreach account. HubSpot pipeline must be the live instance
Pass condition
All end-to-end test cases T25 through T29 pass and process owner confirms approval in the FullSpec confirmation record
Who runs it
FullSpec team executes; process owner (Marketing Manager) joins to review outputs and record approval
Test and QA PlanPage 1 of 4
FS-DOC-06Quality

02Phase 1 — unit test cases

Sandbox credentials only during Phase 1. Do not load production API keys for HubSpot, Hunter.io, Gmail, or Notion into the test environment at this stage. Any test that touches a live account is invalid and must be re-run in sandbox before Phase 1 can be marked complete.

Prospect Research Agent — estimated build time: 10 hours, complexity: Moderate

ID
Scenario
Input
Expected Output
Pass Criteria
T01
Happy path: valid brief triggers prospect list build
Notion webhook payload with niche: 'fitness', audience_min: 50000, channel: 'Instagram'
Google Sheet populated with 10 rows: name, handle, niche, estimated audience size, status: 'pending email lookup'
All 10 rows present; no blank required fields; sheet tab matches campaign ID
T02
Hunter.io returns verified email for prospect
Prospect row with domain 'example-creator.com' passed to Hunter.io sandbox stub
email_address field populated; verification_status: 'valid'; row status updated to 'email found'
Email field non-null; status column updated; no Hunter.io error response logged
T03
Hunter.io returns no result for prospect
Prospect row with domain 'ghost-creator.net' that returns 404 from Hunter.io stub
Row status set to 'email not found'; row flagged for manual review; workflow continues to next row
No exception thrown; flagged row visible in sheet; remaining rows processed normally
T04
Notion webhook payload missing required field (audience_min absent)
Webhook payload with niche and channel but no audience_min value
Workflow halts at validation step; error logged: 'Missing field: audience_min'; no Sheet rows written
Error log entry present with field name; zero rows written to Sheet; no downstream agent triggered
T05
Google Sheets write fails due to quota exceeded
Valid Notion payload; Sheets API stub returns 429 Too Many Requests on first attempt
Orchestration layer retries with exponential backoff (max 3 attempts); success on retry 2; row written
Retry logic fires; final row written correctly; retry count logged; no duplicate rows created

Pitch Drafting Agent — estimated build time: 10 hours, complexity: Moderate

ID
Scenario
Input
Expected Output
Pass Criteria
T06
Happy path: validated prospect row produces Gmail draft
Google Sheet row with name, handle, niche, email, and Notion brief reference
Gmail draft created in sandbox outreach account; subject line and body reference prospect niche and campaign angle; HubSpot contact created with status 'draft'
Draft present in Gmail sandbox drafts folder; HubSpot contact record exists with correct campaign tag and 'draft' status
T07
Multiple prospects produce one draft each with distinct personalisation
Sheet with 5 rows, each with a different niche value
5 Gmail drafts; each body references the correct niche from its corresponding row; no draft content duplicated across prospects
5 drafts created; niche reference in each body matches corresponding sheet row; character diff between any two drafts exceeds 80 characters
T08
Prospect row has email field empty (email not found flag set)
Sheet row with status 'email not found'
Agent skips this row; no Gmail draft created; no HubSpot record written; skip logged
Zero drafts for skipped row; skip event in error log with row ID; next row processed normally
T09
HubSpot contact creation returns duplicate contact error
Prospect email already exists as a HubSpot contact in sandbox
Agent detects duplicate; updates existing contact with new campaign tag rather than creating a second record; logs 'contact updated, not created'
No duplicate HubSpot contact; existing record has updated campaign tag; log entry confirms update path taken
T10
Gmail OAuth token expired during draft save
Valid draft content; Gmail sandbox stub returns 401 on draft create call
Token refresh attempted automatically; draft retried; on persistent 401 after refresh, error logged and task queued for manual retry
Refresh attempt logged; on success, draft created; on failure, error queued with prospect ID and no silent data loss

Follow-Up and Pipeline Agent — estimated build time: 8 hours, complexity: Moderate

ID
Scenario
Input
Expected Output
Pass Criteria
T11
Happy path: sent email enrols contact in HubSpot follow-up sequence
HubSpot contact with deal stage 'email sent'; no reply flag; send timestamp present
Contact enrolled in follow-up sequence; follow-up 1 scheduled at day 4; follow-up 2 scheduled at day 9
HubSpot sequence enrolment confirmed via sandbox API response; both follow-up dates calculated correctly from send timestamp
T12
Prospect replies: follow-up sequence cancelled and deal stage updated
HubSpot contact receives inbound reply event in sandbox
Sequence enrolment cancelled; deal stage updated to 'replied'; Slack sandbox message posted with prospect name and reply summary
No follow-up emails dispatched after reply; deal stage field updated; Slack sandbox webhook fires with correct payload
T13
Slack hot lead alert fires with correct prospect details
HubSpot contact reply event; contact name: 'Test Creator'; reply snippet available
Slack message in sandbox channel contains: prospect name, reply snippet, HubSpot contact link, and campaign tag
Slack webhook payload contains all four required fields; message appears in designated sandbox Slack channel
T14
HubSpot Sequences API unavailable (Sales Hub tier insufficient)
Contact ready for enrolment; HubSpot sandbox returns 403 Forbidden on sequences endpoint
Error logged: 'HubSpot Sequences not available on current plan'; contact flagged for manual follow-up; no silent failure
403 captured and not swallowed; contact record includes manual follow-up flag; team notified via error log
T15
Slack webhook returns error on hot lead alert
Valid reply event; Slack sandbox webhook returns 500
Retry attempted once after 30 seconds; on continued failure, alert details written to a fallback Google Sheet row and error logged
Retry attempt logged; fallback Sheet row written with prospect name and reply summary; no data lost
Test and QA PlanPage 2 of 4
FS-DOC-06Quality

03Phase 2 — integration and edge case tests

Integration tests verify that data flows correctly across agent boundaries and that each tool receives the expected payload shape from the previous step in the workflow.

ID
Scenario
Agents / Tools Involved
Expected Output
Pass Criteria
T16
Notion brief triggers Research Agent and Sheet is correctly seeded for Drafting Agent
Notion webhook to Research Agent to Google Sheets
Sheet rows written with all fields required by Pitch Drafting Agent: name, handle, niche, email, brief_id
Drafting Agent reads Sheet without schema error; all required columns present and non-null for valid rows
T17
Research Agent Hunter.io result passes verified email to Drafting Agent
Hunter.io lookup result to Google Sheets to Pitch Drafting Agent
Only rows with verification_status 'valid' are passed downstream; 'email not found' rows are excluded from draft creation
Draft count equals verified-email row count; excluded rows logged; no draft created for unverified rows
T18
Pitch Drafting Agent HubSpot contact record consumed correctly by Follow-Up Agent
HubSpot contact with 'draft' status from Drafting Agent; status updated to 'email sent' externally
Follow-Up Agent triggers on status change to 'email sent'; enrolment sequence starts for correct contact ID
Follow-Up Agent enrols the matching HubSpot contact ID; no cross-contact enrolment; send timestamp carried correctly
T19
End-to-end handoff: all three agents complete a single prospect cycle in sandbox
Full sandbox run: Notion trigger through to Slack alert for one prospect
Google Sheet row written, Gmail draft created, HubSpot contact created, follow-up sequence enrolled, Slack alert fired on simulated reply
All five output artefacts present; data consistent across all tools (same prospect name, email, campaign tag in every system)
T20
Gmail draft status change (approved) correctly triggers send step
Gmail draft approval event to orchestration layer to Gmail send API
Approved draft sent via Gmail; send timestamp written to HubSpot contact record and Google Sheet
Draft no longer in drafts folder; sent item present; HubSpot send_timestamp field populated; Sheet status updated to 'sent'
T21
Batch of 10 prospects completes full Research-to-Draft cycle within acceptable time
Notion brief with 10 qualifying prospects; sandbox APIs respond at normal latency
All 10 Sheet rows written and 10 Gmail drafts created within 4 minutes of trigger
Completion time under 4 minutes; all 10 drafts present; no timeout errors in orchestration log
T22
Follow-up sequence day-4 email dispatches at correct interval
Sandbox contact enrolled in sequence with send_timestamp set to 4 days prior in test data
Follow-up email 1 dispatched via Gmail; HubSpot activity log updated; sequence remains active for day-9 email
Follow-up 1 sent email present in sandbox sent items; HubSpot activity entry dated correctly; sequence not cancelled prematurely
T23
Follow-up sequence day-9 email dispatches and sequence closes
Sandbox contact with follow-up 1 already sent; day-9 interval elapsed in test data
Follow-up email 2 dispatched; sequence closed; HubSpot deal stage updated to 'no response'
Follow-up 2 sent email present; HubSpot deal stage is 'no response'; sequence shows as completed, not active
T24
Reply received between follow-up 1 and follow-up 2 cancels remaining sequence
Inbound reply event fires after follow-up 1 sent but before follow-up 2 dispatch time
Follow-up 2 not sent; HubSpot deal stage updated to 'replied'; Slack alert posted
Zero follow-up 2 emails in sandbox sent items; deal stage updated; Slack payload present with correct contact details

Edge case tests cover inputs and conditions that fall outside the normal happy path, including data quality problems, missing values, tool unavailability, and human timeout scenarios.

ID
Scenario
Condition
Expected Handling
Pass Criteria
E01
Duplicate prospect submitted in same campaign batch
Notion brief triggers Research Agent with a prospect handle already present in the Sheet for the same campaign_id
Agent detects duplicate by handle + campaign_id composite key; skips second write; logs 'duplicate skipped' with row reference
No duplicate Sheet row; no duplicate HubSpot contact; skip event in log with handle and campaign_id
E02
Prospect row missing niche field when Drafting Agent reads Sheet
Sheet row with name, email, handle present but niche column blank
Drafting Agent uses fallback niche label 'content creator' in draft body; flags row in Sheet as 'niche missing, fallback used'; draft still created
Draft created and present in Gmail; body contains fallback label; Sheet row has warning flag in status column
E03
Hunter.io API returns rate limit error (429) mid-batch
Hunter.io sandbox stub returns 429 after the 5th lookup request in a batch of 10
Orchestration layer pauses lookups for 60 seconds; resumes from the 6th row; completes remaining 5 lookups successfully
No rows skipped due to rate limit; pause event logged with timestamp; total batch completes with all 10 rows having a lookup result
E04
Notion webhook fires with an empty brief (no criteria populated)
Webhook payload with campaign_id but all criteria fields null or empty strings
Validation step halts workflow immediately; error written to orchestration log: 'Brief incomplete, workflow aborted'; no downstream steps triggered
Zero Sheet rows written; zero HubSpot records created; error log entry present with campaign_id and field list
E05
HubSpot API unavailable for 5 minutes during contact creation
HubSpot sandbox returns 503 Service Unavailable for all requests during a 5-minute window
Orchestration layer queues contact creation tasks with exponential backoff; retries automatically once HubSpot recovers; no data lost
All contacts eventually created after HubSpot recovery; retry log shows backoff intervals; no duplicate contacts from retry storm
E06
Gmail draft sits unreviewed for more than 72 hours
Draft created timestamp is more than 72 hours old with no approval or rejection action recorded
Orchestration layer sends a Slack reminder to the marketing channel with draft count and oldest draft age; no email sent without approval
Slack reminder message appears in marketing channel with correct draft count; no pitch emails dispatched; draft remains in Gmail drafts
E07
Prospect replies in a language other than English
Inbound reply detected by Follow-Up Agent; reply body is in a non-English language
Sequence cancelled correctly; deal stage updated to 'replied'; Slack alert fires with raw reply snippet and note 'reply language may require manual review'
Sequence cancelled; deal stage updated; Slack message contains language note; no automated response sent
E08
Prospect email address verified by Hunter.io but bounces on send
Gmail returns a bounce notification for a sent pitch email
Bounce event updates HubSpot contact status to 'bounced'; deal stage set to 'invalid contact'; no follow-up sequence enrolled; row flagged in Sheet
No follow-up emails sent to bounced address; HubSpot status is 'bounced'; Sheet row has 'bounced' in status column; bounce event in error log
Test and QA PlanPage 3 of 4
FS-DOC-06Quality

04Phase 3 — end-to-end production test

Important before running Phase 3: Use an internal test email address (for example a role address such as qa-test@[YourCompany.com]) as the prospect contact throughout all Phase 3 runs. Do not send to any real influencer or external contact. After all Phase 3 test cases pass, void the test HubSpot contact records by deleting them or marking them with a 'QA test - delete' tag, remove all test Gmail drafts and sent items, and archive the test Google Sheet rows. The process owner must confirm this cleanup has been completed before go-live is approved.
ID
Scenario
Steps Exercised
Expected Output
Pass Criteria
T25
Full production run: Notion brief to Gmail draft
Notion webhook fires on production instance; Research Agent runs with live Hunter.io credits; Drafting Agent creates draft in live Gmail account; HubSpot contact created in live pipeline
Google Sheet populated with real lookup results; Hunter.io credit consumed and email verified; Gmail draft present in live outreach account; HubSpot contact in live pipeline with correct campaign tag and 'draft' status
All four artefacts present and consistent; no sandbox credential used; Hunter.io account shows one credit consumed; campaign tag matches brief
T26
Draft approval and send via live Gmail
Marketing Manager approves the T25 draft in live Gmail; orchestration layer detects approval; send API called; HubSpot and Sheet updated
Email arrives in the internal test inbox; HubSpot contact record shows send_timestamp; Sheet row status updated to 'sent'; no error in orchestration log
Test inbox receives email; HubSpot send_timestamp non-null and within 60 seconds of approval action; Sheet status column reads 'sent'
T27
Follow-up sequence enrolled and day-4 follow-up dispatched
T26 contact enrolled in live HubSpot sequence; day-4 follow-up sent to internal test inbox (test data advanced to simulate day-4 interval)
Follow-up email 1 received in test inbox; HubSpot activity log shows sequence email sent; sequence remains active for day-9 follow-up
Test inbox contains follow-up 1 email; HubSpot activity entry dated and linked to correct contact; sequence status is active
T28
Reply detected: sequence cancelled and Slack hot lead alert fires on production
Internal test address replies to the T26 pitch email; Follow-Up Agent detects inbound reply on live Gmail account
HubSpot deal stage updated to 'replied'; sequence cancelled before follow-up 2; Slack hot lead alert posted to live marketing channel with prospect name and reply snippet
HubSpot deal stage is 'replied'; no follow-up 2 email dispatched; Slack message visible in live marketing channel within 2 minutes of reply; message content matches template
T29
Error log verification: all Phase 3 events traceable
Review of orchestration error and event log after T25 through T28 complete
Log contains timestamped entries for: trigger receipt, Sheet write, Hunter.io lookup, HubSpot contact creation, draft creation, approval event, send event, sequence enrolment, reply detection, deal stage update, and Slack alert
All 11 event types present in log; no unhandled exception entries; log is queryable by campaign_id and contact_id
T30
Process owner review and approval
Marketing Manager reviews all Phase 3 outputs: Gmail drafts quality, HubSpot pipeline state, Slack alert content, follow-up email copy, and error log completeness. Confirms each output meets operational expectations.
Process owner confirms all outputs are acceptable; FullSpec records approval in the confirmation document linked to this QA Plan; cleanup of test records completed and confirmed
Process owner sign-off recorded in the FullSpec confirmation record. This is the final gate before go-live is authorised. No separate signature block required.
Once T30 is recorded as passed and test record cleanup is confirmed, the FullSpec team will update the process status to go-live ready and issue the handover confirmation to the process owner. Any outstanding issues identified during Phase 3 are logged in the FullSpec tracker and must be resolved and re-tested before that confirmation is issued. Contact the FullSpec team at support@gofullspec.com for any questions during testing.
Test and QA PlanPage 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
Developer Handover Pack
Technical · Developer
View
Integration and API Spec
Technical · Developer
View