Back to Outbound Prospecting & Cold Outreach Cadences

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

Outbound Prospecting and Cold Outreach Cadences

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

This document defines the full quality assurance process for the Outbound Prospecting and Cold Outreach Cadences automation. It is written for the FullSpec build team and covers every test case required to verify the three agents (Prospect Enrichment, Personalisation Drafting, and Cadence Execution and Logging) before any production traffic is introduced. Testing runs in three sequential phases: unit tests in sandbox, integration and edge-case tests in sandbox, and a final end-to-end run in the production environment. The process owner joins Phase 3 only. FullSpec runs all earlier phases internally.

01Testing approach

Testing is structured across three phases that must be completed in sequence. No phase begins until the previous phase has fully passed, meaning every test case in that phase has achieved its stated pass condition with no open failures or unresolved defects. Any failing test case blocks promotion to the next phase until a fix is applied and the case is re-run and confirmed as passing.

1
Phase 1: Unit Testing
Each agent tested in isolation against sandbox credentials
Scope
Each agent is tested independently. Triggers, API calls, field writes, and output values are verified for the Prospect Enrichment Agent, Personalisation Drafting Agent, and Cadence Execution and Logging Agent in isolation.
Environment
Sandbox only. HubSpot sandbox portal, Clearbit test API key, Apollo.io test account, Gmail test account (no live sending), Slack test workspace.
Credential rule
All sandbox credentials must be stored in the credential vault under the prefix SANDBOX_. No production API key or OAuth token may be loaded during Phase 1.
Pass condition
All cases T01 through T15 return expected outputs with no errors. Zero failures permitted before Phase 2 begins.
Who runs it
FullSpec team only. Process owner is not involved in Phase 1.
2
Phase 2: Integration and Edge Case Testing
Agent handoffs and failure-mode coverage in sandbox
Scope
Cross-agent handoffs, data passing between agents, and all identified edge cases: duplicate contacts, missing enrichment data, unavailable third-party tools, and rep inaction on the review task.
Environment
Sandbox only. Same credential set as Phase 1. Failure simulations are injected via mocked API responses and test contact records with deliberately incomplete data.
Credential rule
Sandbox credentials only. Any mock or stubbed response must be clearly labelled in the test log as MOCKED so it is not confused with a live API result.
Pass condition
All cases T16 through T22 pass and all edge cases E01 through E06 produce the expected fallback or error handling behaviour. No unhandled exceptions permitted.
Who runs it
FullSpec team only. Process owner is not involved in Phase 2.
3
Phase 3: End-to-End Production Test
Full production run with real credentials and live systems
Scope
A complete, traced run of the automation using production credentials and real HubSpot, Clearbit, Apollo.io, Gmail, and Slack connections. Covers the full flow from contact creation to Slack alert, plus error log verification.
Environment
Production. Live HubSpot portal, live Clearbit and Apollo.io API keys, live Gmail sending account, live Slack workspace. Test contacts must use an internal test email address and be voided after the run.
Credential rule
Production credentials loaded from the secure vault. Sandbox credentials must be fully swapped out before Phase 3 begins. Confirm the credential swap in the test log before initiating any trigger.
Pass condition
All cases T23 through T27 pass, including the process owner review-and-approval case (T27). Owner sign-off is recorded in the FullSpec confirmation record, not a separate signoff block.
Who runs it
FullSpec team runs T23 through T26. The process owner joins for T27 to review outputs and confirm sign-off.
Test and QA PlanPage 1 of 4
FS-DOC-06Quality

02Phase 1 — unit test cases

Sandbox credentials only. Do not load or reference any production API key, OAuth token, or live HubSpot portal ID during Phase 1. All test contacts must be created in the HubSpot sandbox portal. All email steps must route to the Gmail test account only. Confirm credential scope in the test log before running any case.

Prospect Enrichment Agent — unit test cases

ID
Scenario
Input
Expected output
Pass criteria
T01
Happy path: full enrichment returned
HubSpot sandbox contact created with status 'To Contact', valid business email, known company domain
Clearbit returns company size, tech stack, and industry. Apollo.io returns verified job title and LinkedIn URL. All fields written to HubSpot contact record within 60 seconds.
All five enrichment fields populated on the HubSpot contact. No API error in the run log.
T02
Trigger fires only on 'To Contact' status
HubSpot sandbox contact created with status 'Subscriber'
Agent does not trigger. No enrichment API call made. No HubSpot field update.
Workflow execution log shows no trigger event. HubSpot contact fields remain blank.
T03
Clearbit returns partial data
Contact with a valid email at a small private company where Clearbit coverage is limited
Clearbit fields populated where data exists. Unpopulated fields left blank (not null-overwritten). Apollo.io fills remaining fields if available.
No enrichment error thrown. At least one field populated. Blank fields recorded as empty string, not error state.
T04
Apollo.io returns no match
Contact email domain not found in Apollo.io database
Apollo.io step logs a 404 or empty-result response. Agent writes whatever Clearbit returned. A flag field 'Apollo Match: No' is written to HubSpot.
HubSpot flag field updated. Run log records Apollo.io no-match. No unhandled exception.
T05
Both enrichment sources return errors
Clearbit API key revoked (mocked 401). Apollo.io returns 500 (mocked).
Agent catches both errors. HubSpot contact status updated to 'Enrichment Failed'. Alert written to error log. No downstream agents triggered.
HubSpot status field shows 'Enrichment Failed'. Error log entry exists. Personalisation Drafting Agent not triggered.

Personalisation Drafting Agent — unit test cases

ID
Scenario
Input
Expected output
Pass criteria
T06
Happy path: draft line generated from full enrichment
HubSpot sandbox contact with all five enrichment fields populated (company size, tech stack, industry, job title, LinkedIn URL)
AI writing step produces a personalised opening line of 20 to 40 words referencing at least one enrichment field. Line written to custom HubSpot field 'Personalisation Draft'. Rep review task created and assigned.
HubSpot custom field 'Personalisation Draft' contains non-empty string. Rep review task exists in HubSpot with correct assignee and due date.
T07
Draft generated from partial enrichment
HubSpot contact with only job title and company name populated (all other enrichment fields blank)
AI step generates a shorter opener using available fields. Line written to HubSpot. Review task created.
HubSpot draft field populated. Task created. Draft does not contain placeholder tokens such as [COMPANY_SIZE] indicating a missing substitution.
T08
AI writing step timeout
Mocked: AI endpoint returns 504 after 30 seconds
Agent retries once after 10 seconds. If second attempt also fails, HubSpot field is set to 'Draft Failed'. Rep review task is still created with a note: 'AI draft unavailable, please write manually.'
HubSpot field value equals 'Draft Failed'. Task exists with manual-write note. Run log records two attempts and final failure.
T09
Agent does not trigger without completed enrichment
HubSpot contact with status 'Enrichment Failed' from T05 scenario
Personalisation Drafting Agent trigger condition evaluates to false. No AI call made. No task created.
Workflow log shows no trigger event for Personalisation Drafting Agent on this contact.

Cadence Execution and Logging Agent — unit test cases

ID
Scenario
Input
Expected output
Pass criteria
T10
Happy path: contact enrolled in HubSpot sequence after rep approval
Rep marks 'Personalisation Draft' as approved in HubSpot sandbox. Contact has a valid email address.
Agent triggers. Contact enrolled in the correct HubSpot sequence. Personalisation token inserted into touch one. Sequence start date set to today.
HubSpot contact shows active sequence enrolment. Touch one email content contains the approved personalisation draft. Enrolment timestamp logged.
T11
Touch one sent via Gmail sandbox account
Contact enrolled in sequence. Touch one scheduled for immediate send.
Gmail sandbox account sends touch one. HubSpot activity timeline records the send event with timestamp, subject line, and recipient.
Gmail sandbox outbox shows sent message. HubSpot activity log entry exists for touch one send.
T12
Follow-up touches scheduled at correct intervals
Contact enrolled. Cadence configured for touches on days 1, 3, 6, 10, 14, and 18.
HubSpot sequence task schedule shows six pending touch dates matching the configured intervals. No touches sent before their scheduled date.
Six scheduled tasks visible in HubSpot sequence. Task dates match the configured cadence interval in days.
T13
Slack alert fires on simulated reply
Mocked reply event injected: prospect email reply received on touch two.
Slack test workspace receives a message in the configured channel containing: contact name, company, last touch number, and a HubSpot deep link.
Slack message appears in test channel within 60 seconds of mock reply event. All four data fields present in the message.
T14
CRM activity logged for each touch event
Touches one through three sent in sequence during unit test.
HubSpot contact timeline shows three activity log entries, one per touch, each with send timestamp, subject line, and delivery status.
Three distinct activity entries on HubSpot contact timeline. No duplicate entries. Each entry has a non-null timestamp.
T15
Agent does not enrol contact if draft not approved
HubSpot contact where review task exists but rep has not marked the draft as approved.
Cadence Execution Agent does not trigger. No sequence enrolment. No email sent. Contact remains in 'Pending Review' state.
HubSpot contact shows no active sequence. Gmail sandbox outbox is empty. Workflow log shows no trigger event.
Test and QA PlanPage 2 of 4
FS-DOC-06Quality

03Phase 2 — integration and edge case tests

Integration tests — agent handoffs

ID
Scenario
Input
Expected output
Pass criteria
T16
Full handoff: Enrichment Agent to Personalisation Drafting Agent
Contact created with status 'To Contact'. Enrichment Agent completes successfully and writes all five fields.
Personalisation Drafting Agent trigger fires automatically within 30 seconds of HubSpot field update. Draft line generated and written. Review task created.
No manual intervention between agents. Personalisation Drafting Agent run log entry timestamp is within 30 seconds of Enrichment Agent completion timestamp.
T17
Full handoff: Personalisation Drafting Agent to Cadence Execution Agent
Rep marks personalisation draft as approved in HubSpot sandbox.
Cadence Execution Agent triggers within 60 seconds. Contact enrolled in HubSpot sequence. Touch one personalisation token confirmed as the approved draft text.
Cadence Execution Agent log entry exists. Token in touch one email body matches the exact string stored in the HubSpot 'Personalisation Draft' field.
T18
End-to-end sandbox run: single contact through all three agents
New contact added to HubSpot sandbox with status 'To Contact'. All APIs mocked to return full data.
Enrichment written. Draft generated. Task created. Rep approves. Sequence enrolled. Touch one sent to Gmail sandbox. Activity logged. Slack test message sent.
All seven output events recorded in the run log with no errors. Total elapsed time from trigger to Slack alert under 3 minutes in sandbox.
T19
HubSpot sequence enrolment with personalisation token substitution
Approved personalisation draft contains special characters: an ampersand and a comma.
Token is correctly URL-encoded or escaped before insertion into HubSpot sequence. Touch one email body renders the opening line correctly without encoding artefacts.
Touch one email body in Gmail sandbox inbox displays the opening line exactly as approved. No HTML entities visible.
T20
Slack deep link resolves to correct HubSpot record
Reply event mocked for contact with HubSpot ID HS-TEST-00123.
Slack message contains a URL in the format https://app.hubspot.com/contacts/[portal-id]/contact/HS-TEST-00123.
URL in Slack message resolves to the correct contact record when opened in the sandbox HubSpot portal.
T21
Re-trigger guard: contact already in active sequence is not re-enrolled
Contact with status 'To Contact' is updated again (simulating a duplicate import) while already enrolled in an active HubSpot sequence.
Enrichment Agent may re-run but Cadence Execution Agent checks for existing active sequence enrolment and skips re-enrolment. No duplicate sequence started.
HubSpot contact shows only one active sequence. Workflow log shows re-enrolment skipped with reason: 'Already enrolled'.
T22
Correct sequence selected based on contact properties
Two sandbox contacts: one with industry 'SaaS' and one with industry 'Professional Services'. Two separate HubSpot sequences configured.
Each contact is enrolled in the sequence mapped to their industry. SaaS contact in Sequence A. Professional Services contact in Sequence B.
HubSpot sequence name on each contact matches the expected mapping. No cross-enrolment.

Edge case tests

ID
Scenario
Input
Expected output
Pass criteria
E01
Duplicate contact submitted
A contact with an email address already existing in HubSpot is added again with status 'To Contact'.
The automation detects the existing HubSpot record by email match. The existing record is updated rather than a new contact created. Enrichment runs on the existing record only.
HubSpot shows one contact record for the email address. No duplicate contact created. Run log records 'Duplicate detected, updating existing record'.
E02
Missing email address on contact
HubSpot contact created with status 'To Contact' but no email address field populated.
Enrichment Agent runs but Cadence Execution Agent halts at the enrolment step. Contact status updated to 'Missing Email'. Error written to log. No sequence enrolment. No Gmail send attempted.
HubSpot status field equals 'Missing Email'. No active sequence on contact. Error log entry with field name 'email' noted as missing.
E03
Clearbit rate limit hit (429 response)
Mocked: Clearbit API returns HTTP 429 with a Retry-After header of 60 seconds.
Enrichment Agent reads the Retry-After header and pauses for 60 seconds before retrying. If the retry succeeds, enrichment completes normally. Run log records the rate limit event and retry.
Run log shows a 429 event followed by a retry attempt. If retry succeeds, HubSpot fields are populated. Total elapsed time reflects the 60-second pause.
E04
Apollo.io service unavailable (503 response)
Mocked: Apollo.io returns HTTP 503 for all requests during the test window.
Enrichment Agent proceeds with Clearbit data only. Apollo.io step logged as 'Service Unavailable'. HubSpot flag field 'Apollo Match: Unavailable' written. Process continues to Personalisation Drafting Agent using available data.
HubSpot flag field updated. Clearbit fields populated where data exists. Apollo.io fields left blank. Personalisation Drafting Agent still triggered.
E05
Rep does not action the review task within 48 hours
HubSpot review task created for a contact. Simulated time advance of 48 hours with no rep action.
An automated reminder is sent to the rep via Slack: 'Personalisation draft awaiting your review for [Contact Name]. Task is 48 hours old.' No sequence enrolment occurs until the task is actioned.
Slack reminder message appears in the test channel at the 48-hour mark. Contact has no active sequence. HubSpot task remains open.
E06
Gmail daily sending limit reached
Mocked: Gmail API returns a 'dailyLimitExceeded' error when Cadence Execution Agent attempts to send touch two for a batch of contacts.
Agent logs the Gmail error. Affected touches are queued and rescheduled for the next available sending window. HubSpot activity log records the send as 'Queued, limit reached'. Rep is not notified unless the delay exceeds 24 hours.
HubSpot activity entry shows 'Queued' status. Run log records 'dailyLimitExceeded' error and next scheduled retry time. No email dropped silently.
Test and QA PlanPage 3 of 4
FS-DOC-06Quality

04Phase 3 — end-to-end production test

Important before running Phase 3: All test contacts must use an internal test email address (e.g. qa-test@[YourCompany.com]) that is monitored by the FullSpec team. Do not use a real prospect's email address. Any HubSpot contact records, sequence enrolments, Gmail sends, and Slack messages created during Phase 3 must be voided and deleted immediately after the test run is confirmed as passing. Confirm the credential swap from sandbox to production in the test log before initiating the trigger. Do not proceed if any Phase 2 case is unresolved.
ID
Scenario
Input
Expected output
Pass criteria
T23
Production trigger: contact added with correct status
HubSpot production portal: internal test contact created with email qa-test@[YourCompany.com], status 'To Contact', and a known company domain.
Prospect Enrichment Agent triggers within 60 seconds. Live Clearbit and Apollo.io API calls made. All available enrichment fields written to the production HubSpot contact record.
HubSpot production contact record shows enrichment fields populated with real API data. Run log records live API calls (not mocked). Timestamp within 60 seconds of contact creation.
T24
Production personalisation draft generated and task assigned
Enrichment completed on the test contact from T23.
Personalisation Drafting Agent fires. AI-generated opening line written to the 'Personalisation Draft' custom field on the production HubSpot contact. Rep review task created and assigned to the correct HubSpot user.
HubSpot custom field contains a non-empty, human-readable opening line. Task appears in the assigned rep's HubSpot task queue with correct due date.
T25
Production sequence enrolment and touch one send via Gmail
FullSpec team member marks the personalisation draft as approved in the production HubSpot portal.
Cadence Execution Agent triggers. Test contact enrolled in the production HubSpot sequence. Touch one email sent from the production Gmail account to qa-test@[YourCompany.com]. Activity logged to HubSpot timeline.
Touch one email arrives in the qa-test inbox. Email body contains the approved personalisation draft as the opening line. HubSpot timeline shows one activity log entry for the send event.
T26
Error log verification across all three agents
Review all automation platform run logs generated during T23 through T25.
All three agent run logs are accessible in the automation platform dashboard. No unhandled exceptions. Any warnings (e.g. a partial enrichment field) are logged with severity level 'warn' and do not appear as errors.
Zero error-level entries in the run logs for T23 through T25. All log entries are timestamped and contain agent name, step name, and outcome. Log retention confirms entries will be available for at least 30 days.
T27
Process owner review and approval of full production run
Process owner is given access to the HubSpot production contact record from T23, the qa-test inbox showing the touch one email, the HubSpot activity timeline, and the Slack alert channel.
Process owner reviews enrichment data quality, personalisation draft quality, email formatting, activity log accuracy, and Slack alert content. Process owner confirms all outputs meet the agreed acceptance criteria and records sign-off in the FullSpec confirmation record.
Process owner sign-off recorded in the FullSpec confirmation record. No outstanding objections or defects raised. Phase 3 marked as complete. Automation cleared for full go-live.
After T27 is confirmed as passing: delete the qa-test HubSpot contact, remove it from any active sequence, delete the sent email from the Gmail sent folder, and clear the Slack test messages. Record the deletion actions in the test log with timestamps. The FullSpec team will issue the go-live confirmation to your team once the log is complete. Contact support@gofullspec.com with any questions.
Test and QA PlanPage 4 of 4

More documents for this process

Every document generated for Outbound Prospecting & Cold Outreach Cadences.

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