FS-DOC-06Quality
Test and QA Plan
Lead Magnet & Landing Page Follow-up
[YourCompany.com] · Marketing Department · Prepared by FullSpec · [Today's Date]
This document defines the structured test and quality assurance process for the Lead Magnet and Landing Page Follow-up automation. It covers three sequential test phases: unit testing of each individual agent, integration and edge-case testing across agent handoffs, and a final end-to-end run against the production environment. The FullSpec team executes Phases 1 and 2 in full; the process owner joins Phase 3 to verify the live outcome and record approval. No phase begins until the previous phase fully passes.
01Testing approach
Testing runs in three sequential phases: Unit, Integration, and End-to-end. Each phase has a defined pass condition that must be met in its entirety before the next phase is unlocked. A single failing test case blocks promotion to the next phase. The FullSpec team owns all test execution in Phases 1 and 2. The process owner joins Phase 3 to observe the live production run and record sign-off.
1Phase 1: Unit Testing
Each agent tested in isolation against sandbox credentials
Scope
Individual agent logic: Lead Capture and Enrichment Agent; Asset Delivery and Nurture Agent. Each agent is tested independently with mocked or sandboxed inputs.
Environment
Sandbox only. HubSpot sandbox portal, Mailchimp test audience, Typeform test responses, Google Sheets test tab, Slack test channel.
Credential rule
No production API keys are used. All credentials must be sandbox or test-account equivalents. Production credentials are not loaded until Phase 3.
Pass condition
All test cases T01 through T12 return the expected output with zero errors. Any failure must be resolved and re-run before Phase 2 begins.
Who runs it
FullSpec team only.
2Phase 2: Integration and Edge Case Testing
Agent handoffs and boundary scenarios tested end-to-end in sandbox
Scope
Cross-agent handoff from Lead Capture and Enrichment Agent to Asset Delivery and Nurture Agent; edge cases covering duplicates, missing data, tool unavailability, and human-timeout paths.
Environment
Sandbox only. Same sandbox set as Phase 1, with additional simulation of API failure states and duplicate record conditions.
Credential rule
Sandbox credentials continue. No production keys loaded. Error injection is performed via test payload manipulation, not live system interference.
Pass condition
All integration test cases T13 through T19 pass and all edge cases E01 through E06 return the expected handling behaviour with no unhandled exceptions.
Who runs it
FullSpec team only.
3Phase 3: End-to-End Production Test
Full live run verified by FullSpec and the process owner
Scope
A complete end-to-end run using the live Typeform form, live HubSpot portal, live Mailchimp account, live Google Sheets tracking log, and live Slack sales channel. One full submission traced through every step.
Environment
Production. All live credentials loaded. A designated internal test email address is used and all test records are voided after the run.
Credential rule
Production API keys active. Test submission must use an internal address that does not match any real prospect record in HubSpot.
Pass condition
All production test cases T20 through T23 pass, including process owner review and recorded approval in the FullSpec confirmation log.
Who runs it
FullSpec team executes; process owner (Marketing Manager or nominated delegate) observes and records approval on case T23.
Test and QA PlanPage 1 of 4
FS-DOC-06Quality
02Phase 1 — unit test cases
Sandbox credentials only. Do not load production API keys for any test in this phase. Use the HubSpot sandbox portal, the Mailchimp test audience (ID: test-audience-qa), a dedicated Typeform test workspace, and the Google Sheets QA tab. All Slack messages must route to #qa-test-channel, not the live sales channel.
Agent 1: Lead Capture and Enrichment Agent
ID
Scenario
Input
Expected Output
Pass Criteria
T01
Happy path: new contact
Valid Typeform webhook payload: email=new@test.com, first_name=Alex, last_name=Smith, lead_magnet=Guide A
New HubSpot contact created with all fields mapped; list tag 'Guide A' applied; lead source set to 'Typeform'; Google Sheets row appended
HubSpot contact ID returned; tagging confirmed via Contacts API; Sheets row count incremented by 1
T02
Happy path: field mapping accuracy
Payload includes company, phone, and custom field utm_source=google
All three fields written to the correct HubSpot contact properties (company, phone, utm_source__c)
GET /contacts/{id}/properties returns all three values matching input; no null fields
T03
Happy path: lead magnet label applied
Payload specifies lead_magnet=Checklist B
HubSpot contact property lead_magnet__c set to 'Checklist B'; contact added to HubSpot list 'Checklist B Downloads'
List membership confirmed via HubSpot Lists API; property value matches payload
T04
Happy path: Google Sheets log row
Valid new contact payload
Row appended to QA tab with columns: timestamp, email, first_name, lead_magnet, delivery_status=pending
Sheets API response status 200; row count +1; all five columns populated
T05
Duplicate contact: existing email
Payload email=existing@test.com already present in HubSpot sandbox
Existing record updated (upsert); no new contact created; lead_magnet__c updated to new value if different
HubSpot contact count unchanged; updated_at timestamp refreshed; no duplicate record ID created
T06
Missing required field: email absent
Payload with email field null or empty string
Workflow halts at capture step; error logged to workflow error log; no HubSpot write attempted
No HubSpot contact created; error log entry contains field_missing: email; Sheets row not appended
T07
Malformed email address
email=notanemail (no @ symbol)
Validation step rejects payload; error logged; contact flagged for manual review queue
No HubSpot write; error entry contains validation_error: email_format; manual review flag set
T08
HubSpot API unavailable
Valid payload; HubSpot sandbox API returns 503
Retry logic fires (3 attempts, 30-second intervals); after third failure, error logged and alert sent to #qa-test-channel
Retry count in log equals 3; final status is error; Slack alert received in #qa-test-channel within 5 minutes
Agent 2: Asset Delivery and Nurture Agent
ID
Scenario
Input
Expected Output
Pass Criteria
T09
Happy path: asset email delivered within 60 seconds
Confirmed HubSpot contact record for Guide A; Mailchimp transactional template ID = tmpl_guideA
Transactional email sent to test address within 60 seconds of agent trigger; email contains correct Google Drive link for Guide A
Mailchimp send API response 200; delivery timestamp minus trigger timestamp less than or equal to 60 seconds; link URL matches Drive asset map
T10
Happy path: correct template selected per magnet
Contact with lead_magnet__c = Checklist B
Transactional email uses template ID tmpl_checklistB, not tmpl_guideA
Mailchimp send payload template_id matches checklist B mapping; email subject line confirms correct template
T11
Happy path: nurture sequence enrolment
Confirmed new contact; asset email sent
Contact enrolled in Mailchimp automation sequence matching their lead magnet; Day-3 email scheduled
Mailchimp Automations API confirms subscriber added to correct automation ID; queue shows Day-3 email scheduled
T12
Mailchimp transactional send failure
Valid contact; Mailchimp test API returns 400 rejected
Error logged with Mailchimp rejection code; contact record flagged in HubSpot as delivery_failed; Google Sheets delivery_status updated to 'failed'
HubSpot contact property delivery_status__c = 'failed'; Sheets row delivery_status column = 'failed'; error log entry present
Test and QA PlanPage 2 of 4
FS-DOC-06Quality
03Phase 2 — integration and edge case tests
Integration tests validate the handoff between Agent 1 and Agent 2 and confirm that the full automated chain executes without breaks. Test IDs continue from T13.
ID
Scenario
Input
Expected Output
Pass Criteria
T13
Agent handoff: capture to delivery
New Typeform payload triggers Agent 1 successfully
Agent 1 completion event fires Agent 2 within 5 seconds; no manual intervention required
Agent 2 trigger timestamp is within 5 seconds of Agent 1 completion timestamp in the workflow execution log
T14
Full chain: new contact, asset delivery, sheet log, nurture enrolment
Valid new contact payload for Guide A
HubSpot contact created; asset email delivered; Sheets row appended; nurture sequence enrolled; all within one workflow execution
All four system states confirmed via respective APIs; execution log shows single unbroken run ID
T15
Warm-lead threshold: Slack alert fires
Simulate HubSpot engagement score reaching threshold (2 opens plus 1 click) on test contact
Slack message posted to #qa-test-channel containing contact name, company, and magnet downloaded
Slack message received within 2 minutes of threshold event; all three data fields present and correct
T16
Warm-lead threshold: alert not fired below threshold
Simulate 1 open, 0 clicks on test contact
No Slack alert posted; contact remains in nurture sequence
#qa-test-channel receives no new message within 5-minute observation window; nurture sequence status unchanged
T17
Duplicate submission: second magnet from same email
Existing contact submits for Checklist B after previously downloading Guide A
Contact record updated with new lead_magnet__c = Checklist B; new asset email sent for Checklist B; existing nurture for Guide A not interrupted; no duplicate record
HubSpot record count unchanged; lead_magnet__c updated; Checklist B asset email confirmed delivered; Guide A automation still active
T18
Nurture sequence re-enrolment guard
Same contact submits same magnet twice (Guide A, then Guide A again)
Second submission updates the record but does not re-enrol the contact in the Guide A automation; no duplicate Day-3 email
Mailchimp automation subscriber list for Guide A sequence shows single entry for the test email; no duplicate queue entries
T19
Agent 1 failure: Agent 2 does not fire
Inject a forced error into Agent 1 (HubSpot write blocked)
Agent 2 does not trigger; error is contained within Agent 1 execution context; error log captures the failed run ID
Agent 2 execution log shows no new run; Agent 1 log shows status = error; no orphaned partial records in HubSpot or Sheets
Edge case tests cover boundary and exception scenarios that fall outside the happy path. These use the E-series ID prefix.
ID
Scenario
Input
Expected Output
Pass Criteria
E01
Duplicate record: identical submission within 60 seconds
Same Typeform payload submitted twice with a 45-second gap (simulating double-click or form retry)
Second event detected as duplicate; only one HubSpot record created or updated; only one asset email sent
HubSpot deduplication log shows second event suppressed; Mailchimp send count for that email = 1
E02
Missing lead magnet field
Payload where lead_magnet field is absent or blank
Contact created in HubSpot with lead_magnet__c = 'Unassigned'; contact flagged for manual review; no asset email sent
HubSpot property lead_magnet__c = 'Unassigned'; manual review flag set; Mailchimp send not triggered; Sheets row delivery_status = 'review_required'
E03
Lead magnet value not in routing map
Payload where lead_magnet = 'Unknown Whitepaper XYZ' (no matching template ID)
Routing logic falls to default handler; contact tagged 'unrouted_magnet'; error logged; no delivery attempt with wrong template
Error log entry contains routing_error: no_template_match; HubSpot tag 'unrouted_magnet' applied; no Mailchimp send
E04
Mailchimp API rate limit hit
Simulate burst of 20 simultaneous delivery requests exceeding Mailchimp transactional rate limit
Requests queued and retried with exponential back-off; all 20 emails eventually delivered; no emails lost
Mailchimp send log shows all 20 messages delivered within 10 minutes; no failed_permanently status entries
E05
Google Sheets API unavailable
Valid contact payload; Sheets API returns 503 during log step
Sheets write retried up to 3 times; after third failure, error logged; HubSpot and Mailchimp steps not blocked; Sheets miss noted for reconciliation
HubSpot and Mailchimp steps complete successfully; Sheets retry count = 3 in log; reconciliation flag set in workflow metadata
E06
Bounced or flagged contact: manual review path
Asset email returns hard bounce from Mailchimp
HubSpot contact property email_status set to 'bounced'; contact removed from nurture sequence; flagged in the manual review queue for the Marketing Coordinator
Mailchimp automation subscription cancelled; HubSpot email_status__c = 'bounced'; manual review queue entry confirmed
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 that does not exist in the live HubSpot contact database (for example, qa-test-prod@[YourCompany.com]). Submit a real Typeform response via the live form URL. After the full run is confirmed, the FullSpec team will void the test record: delete the HubSpot contact, remove the Mailchimp subscriber entry, delete the Google Sheets row, and archive the Slack notification. Do not proceed if a real prospect email address is used by mistake.
Production credentials are active in this phase. The Typeform webhook, HubSpot Contacts API, Mailchimp transactional and automations APIs, Google Sheets API, and Slack Incoming Webhook all point to live accounts. Confirm with the FullSpec team that all sandbox credentials have been swapped out before the test run begins.
ID
Scenario
Input
Expected Output
Pass Criteria
T20
Full production run: new contact end-to-end
Submit live Typeform with internal test email, first name, and lead_magnet = Guide A
HubSpot contact created with all properties; asset email delivered to internal test inbox within 60 seconds; Google Sheets production tab row appended; Mailchimp nurture sequence active
All four system states confirmed via live API reads within 3 minutes of form submission; asset email received in internal test inbox with correct Drive link; Sheets row present with correct timestamp
T21
Production error log verification
Review workflow execution log immediately after T20 run
Execution log shows single completed run with status = success; no warnings or partial-failure entries; all step durations within expected ranges
Log entry count = 1 for the test run ID; status = success; no error or warning lines present; total execution time under 90 seconds
T22
Warm-lead Slack alert on live channel
Simulate warm-lead threshold on the test contact by manually setting HubSpot engagement properties to 2 opens and 1 click via the API
Slack message appears in the live sales channel containing the test contact name, company (if populated), and magnet name
Slack message received in the designated sales channel within 2 minutes of threshold update; message content matches template; no duplicate messages
T23
Process owner review and approval
Process owner (or nominated delegate) reviews all outputs from T20 through T22: HubSpot record, delivered email, Sheets log row, Slack alert
Process owner confirms all outputs meet expectations and records approval in the FullSpec confirmation log. FullSpec team voids the test record immediately after approval is recorded.
Approval recorded in FullSpec confirmation log by the process owner. Test record voided. Phase 3 marked complete. Automation cleared for go-live.
Once T23 approval is recorded in the FullSpec confirmation log, no separate sign-off document is required. The FullSpec team will archive the QA log, void the test data across all connected systems, and notify the process owner that the automation is cleared for production go-live. Contact the FullSpec team at support@gofullspec.com with any questions before or after the Phase 3 run.
Test and QA PlanPage 4 of 4