Back to Customer Testimonial Collection

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

Customer Testimonial Collection

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

This document defines the complete testing programme for the Customer Testimonial Collection automation. It is written for the FullSpec build team and covers every structured test case across three sequential phases: unit testing of individual agents in isolation, integration and edge-case testing of agent handoffs and failure paths, and end-to-end production validation. No phase begins until the previous phase fully passes. The process owner joins Phase 3 only, to confirm the final production run meets the agreed acceptance criteria before go-live.

01Testing approach

Testing is structured across three sequential phases. Each phase must fully pass before the next begins. Phase 1 validates each agent in isolation against sandbox data. Phase 2 validates agent-to-agent handoffs and edge-case resilience. Phase 3 validates the complete flow in production with real credentials and real data. A single failing test case in any phase blocks promotion to the next phase until the defect is resolved and the case re-run.

1
Phase 1: Unit Testing
Each agent tested independently against sandbox data
Scope
Individual agent logic: trigger detection, data parsing, email send, CRM logging, Typeform capture, Slack card formatting, Notion write, HubSpot update.
Environment
Sandbox only. HubSpot sandbox pipeline, Typeform test responses, Slack test workspace, Notion test database. No production records touched.
Credential rule
Sandbox API keys and OAuth tokens exclusively. Production credentials must not be loaded into the environment during this phase.
Pass condition
All test cases T01 through T14 return expected outputs with no errors. No test is skipped or deferred.
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 paths validated end-to-end in sandbox
Scope
Cross-agent handoffs, timing logic for follow-up reminders, Typeform-to-Slack routing, Slack approval routing to Notion and HubSpot, and all defined edge cases including duplicates, missing fields, tool unavailability, and human timeout.
Environment
Sandbox only. Same sandbox credentials as Phase 1. Clock-skipping or stub delays used to simulate 7-day and 14-day reminder windows without waiting real time.
Credential rule
Sandbox credentials only. Reminder timing logic must be tested using configurable delay stubs, not live wait periods.
Pass condition
All integration cases T15 through T22 pass and all edge cases E01 through E07 pass. Agent handoff data payloads match the agreed schema with no missing fields.
Who runs it
FullSpec team only. Process owner is not involved in Phase 2.
3
Phase 3: End-to-End Production Test
Full live flow validated with production credentials and real pipeline data
Scope
Complete flow from a real HubSpot deal stage change through to an approved Notion entry and an updated HubSpot contact record, using production credentials and a designated internal test contact.
Environment
Production. All production API keys, OAuth tokens, HubSpot pipeline, Slack marketing channel, and live Notion testimonial database in use.
Credential rule
Production credentials loaded. The test contact record and Typeform submission must be clearly labelled as test data and voided from the library immediately after the run.
Pass condition
All production cases T23 through T26 pass. The final case, T26, constitutes the process owner's review and approval, recorded in the FullSpec confirmation log.
Who runs it
FullSpec team executes T23 through T25. Process owner participates in T26 to confirm acceptance and record sign-off in the FullSpec confirmation log.
Test and QA PlanPage 1 of 4
FS-DOC-06Quality

02Phase 1 — unit test cases

Sandbox credentials only must be used throughout Phase 1. Do not load production HubSpot, Typeform, Gmail, Slack, or Notion credentials into the test environment at any point during this phase. All test contact records, deal entries, and Typeform responses must be created in the respective sandbox or test account. Any accidental write to a production system must be reported to the FullSpec team lead immediately and the affected record voided before testing continues.

The Outreach Sequence Agent is tested first across T01 through T08, covering its trigger detection, email personalisation, CRM logging, and follow-up cadence. The Submission Review and Library Agent is then tested across T09 through T14, covering Typeform capture, Slack card formatting, approval routing, Notion write, and HubSpot contact update.

Outreach Sequence Agent — unit test cases

ID
Scenario
Input
Expected output
Pass criteria
T01
Happy path: deal moves to Closed Won
HubSpot deal stage updated to 'Closed Won'; contact has first name, email, and project name populated.
Automation platform detects the stage change within 60 seconds and passes contact payload to email step.
Trigger fires once; payload contains contact_id, email, first_name, deal_name, and close_date with no null fields.
T02
Happy path: initial request email sent
Contact payload from T01 passed to Gmail send step.
Personalised request email delivered to the sandbox inbox; subject line and body contain the customer's first name and deal name; Typeform link is present and correctly parameterised.
Email arrives in sandbox inbox within 2 minutes; no merge-field placeholders visible; Typeform URL contains the correct contact_id query parameter.
T03
Happy path: CRM outreach note logged
Successful email send event from T02.
HubSpot contact record receives a new note with send timestamp, template name, and Typeform link.
Note appears on sandbox contact record within 30 seconds of send confirmation; all three fields populated correctly.
T04
Happy path: day-7 follow-up reminder
7-day delay stub fires; no Typeform submission received for the contact.
Follow-up reminder email sent to the sandbox inbox with a reminder subject line and the same Typeform link.
Email delivered to sandbox inbox; subject line distinct from initial request; Typeform link matches T02.
T05
Happy path: day-14 second reminder
14-day delay stub fires; still no Typeform submission received.
Second follow-up reminder email sent to the sandbox inbox.
Email delivered; subject line distinct from both T02 and T04; sequence halts after this send with no further emails queued.
T06
Failure: deal stage is not Closed Won or Completed
HubSpot deal stage updated to 'Proposal Sent'.
Automation does not trigger; no email sent; no CRM note created.
No workflow execution recorded; inbox empty; HubSpot contact record unchanged.
T07
Failure: contact email field is null
HubSpot deal moves to Closed Won; contact record has no email address.
Automation platform catches null email; sequence is halted; an error log entry is created with the contact_id and the reason 'missing_email'.
Error log entry present with correct contact_id and error code; no email send attempted; no CRM note written.
T08
Failure: Gmail send fails (SMTP error)
Contact payload valid; Gmail sandbox returns a 5xx error on send attempt.
Automation platform retries the send up to three times with exponential backoff; on final failure, an error log entry is written and the sequence is paused for that contact.
Three retry attempts logged with timestamps; final error log entry contains contact_id and error_code; no further send attempts made; CRM note not written.

Submission Review and Library Agent — unit test cases

ID
Scenario
Input
Expected output
Pass criteria
T09
Happy path: Typeform submission received
Sandbox Typeform webhook fires with a complete submission: quote_text, customer_name, customer_role, company, permission_checkbox=true, and contact_id parameter.
Automation platform receives the webhook payload; all fields parsed correctly; submission passed to Slack card step.
Payload parsed with no null fields; contact_id resolved to the correct HubSpot contact; execution advances to T10 step.
T10
Happy path: Slack approval card posted
Parsed submission payload from T09.
Formatted Slack Block Kit message posted to the test Slack channel containing the customer name, role, and full quote text, with two inline action buttons labelled 'Approve' and 'Flag for Review'.
Slack message appears in test channel within 30 seconds; both buttons functional; quote text matches Typeform submission exactly; no formatting errors.
T11
Happy path: Approve button clicked
Slack approver clicks 'Approve' on the T10 card.
Approval event received by the automation platform; testimonial data passed to Notion write step and HubSpot update step.
Approval event logged with approver Slack user_id and timestamp; execution advances to both Notion and HubSpot steps within 10 seconds.
T12
Happy path: Notion library entry created
Approved submission data from T11.
New page created in the sandbox Notion testimonial database with fields: customer_name, customer_role, company, quote_text, approval_date, and source='Typeform'.
Notion page created within 60 seconds; all six fields populated correctly; no duplicate page created; entry visible in database view.
T13
Happy path: HubSpot contact record updated
Approved submission data from T11; contact_id resolved.
HubSpot contact property 'Testimonial Collected' set to true; 'Testimonial Approval Date' populated with today's date.
Both properties updated on the sandbox contact record within 30 seconds; values match the approval event timestamp.
T14
Failure: Flag for Review button clicked
Slack approver clicks 'Flag for Review' on the T10 card.
Automation platform receives the flag event; testimonial is NOT written to Notion; HubSpot record is NOT updated; a flag log entry is created with the contact_id, submission_id, and flag timestamp.
No Notion page created; HubSpot properties unchanged; flag log entry present with all three fields; Slack card updated with a 'Flagged for Review' status indicator.
Test and QA PlanPage 2 of 4
FS-DOC-06Quality

03Phase 2 — integration and edge case tests

Integration tests validate the data handoffs between the Outreach Sequence Agent and the Submission Review and Library Agent, and confirm that the end-to-end sequence from HubSpot trigger to Notion entry behaves correctly across both agents in the sandbox environment. Test IDs continue the T sequence from Phase 1.

ID
Scenario
Input
Expected output
Pass criteria
T15
Handoff: Typeform submission stops the follow-up sequence
Contact has received the initial request email (T02); Typeform submission webhook fires before the 7-day stub.
Automation platform detects the submission and cancels any queued follow-up reminders for this contact_id; submission passed to Submission Review and Library Agent.
No day-7 or day-14 reminder emails sent; Submission Review Agent execution begins; outreach sequence status for the contact marked 'completed'.
T16
Handoff: contact_id propagated correctly from HubSpot to Typeform to Slack
Full flow from deal close through to Slack card; Typeform link includes contact_id query parameter.
The same contact_id present in the HubSpot trigger payload appears in the Typeform submission webhook and in the Slack card metadata.
contact_id value identical across HubSpot trigger log, Typeform webhook payload, and Slack message metadata; no ID mismatch at any step.
T17
Integration: Notion write and HubSpot update execute in parallel after approval
Slack Approve event from T11 scenario replayed in integration environment.
Notion page creation and HubSpot property update both complete independently; neither step blocks the other.
Both Notion page and HubSpot property update confirmed within 90 seconds of the approval event; execution logs show parallel branches with no dependency error.
T18
Integration: second deal close for the same contact
A contact whose first deal was already processed receives a second Closed Won deal.
A new outreach sequence is triggered for the second deal; a new CRM note is created; the existing 'Testimonial Collected' property on the contact is not overwritten.
Second email sequence initiated; second CRM note present with correct deal reference; 'Testimonial Collected' property value unchanged from the first approval.
T19
Integration: Slack bot token expires mid-flow
Submission received and parsed; Slack API returns 401 Unauthorized when posting the approval card.
Automation platform catches the 401 error; retries once after a token refresh attempt; if still failing, writes an error log entry and halts the Slack step without losing the submission payload.
Error log entry contains submission_id and error_code 'slack_auth_failure'; submission payload retained in the automation platform's execution state; no data lost.
T20
Integration: Notion API unavailable
Approval event fires; Notion API returns 503 Service Unavailable.
Automation platform retries the Notion write three times with exponential backoff; on final failure, error log entry created with submission_id, approval_timestamp, and error_code; HubSpot update still completes.
Three retry attempts logged; HubSpot contact updated successfully; Notion write error logged; submission payload retained for manual recovery.
T21
Integration: full 14-day sequence with no submission
Contact receives initial request; 7-day stub fires (no submission); 14-day stub fires (no submission).
Both follow-up emails sent; after the 14-day reminder the sequence closes for this contact with status 'no_response'; no further emails queued.
Two follow-up emails in sandbox inbox; sequence status record shows 'no_response'; no further execution scheduled for this contact_id.
T22
Integration: Typeform submission arrives after day-14 reminder
Contact submits Typeform after the 14-day reminder has already been sent.
Late submission accepted and passed to the Submission Review and Library Agent; approval card posted to Slack; full approval path executes normally.
Slack card posted with correct submission data; Notion entry created on approval; HubSpot updated; no errors resulting from the late submission timing.

Edge-case tests cover scenarios outside the happy path that the automation must handle gracefully without data loss, duplicate records, or silent failures.

ID
Scenario
Input
Expected output
Pass criteria
E01
Duplicate Typeform submission from the same contact
A contact submits the Typeform twice within 10 minutes (double-click or browser back scenario).
Automation platform detects the duplicate by matching contact_id and submission timestamp window; the second submission is discarded; only one Slack card is posted.
Only one Slack card posted; second submission logged as 'duplicate_discarded' with both submission_ids; Notion has no duplicate entries after approval.
E02
Typeform submission with permission checkbox unchecked
Typeform webhook fires with permission_checkbox=false.
Submission received but not passed to Slack; an error log entry is created with contact_id, submission_id, and reason 'no_permission'; no Slack card posted; no Notion entry created.
Error log entry present; Slack channel empty; Notion unchanged; HubSpot contact not updated.
E03
Typeform submission with quote_text field empty
Typeform webhook fires with quote_text as an empty string.
Submission halted at the parse step; error log entry written with contact_id, submission_id, and reason 'empty_quote'; no Slack card posted.
Error log entry present with correct fields; Slack channel empty; Notion unchanged; execution does not advance past the parse step.
E04
HubSpot deal fires the trigger twice in rapid succession (webhook retry)
HubSpot delivers the same deal stage-change webhook event twice within 5 seconds due to a platform retry.
Automation platform deduplicates by deal_id; only one outreach sequence is initiated for the contact.
Execution logs show one trigger processed and one marked 'duplicate_ignored'; contact receives only one initial request email; one CRM note created.
E05
HubSpot contact record deleted between trigger and email send
Deal moves to Closed Won; contact record is deleted from HubSpot before the Gmail send step executes.
Automation platform fails to resolve the contact_id; error log entry created with deal_id, contact_id, and reason 'contact_not_found'; no email sent.
Error log entry present; no email in sandbox inbox; no CRM note written; execution halted cleanly.
E06
Slack approval card not actioned within 72 hours
Slack card posted for an approved submission; no button click recorded after 72 hours.
Automation platform fires a reminder notification to the marketing Slack channel referencing the outstanding card; original card remains active.
Reminder message posted to Slack at the 72-hour mark containing the original submission_id and a direct link to the original card; original card still actionable.
E07
Typeform webhook payload contains an unrecognised contact_id
Typeform submission received with a contact_id query parameter that does not match any HubSpot contact.
Automation platform cannot resolve the contact; submission parked in an error queue with reason 'unresolved_contact_id'; Slack card is not posted; a FullSpec alert is raised.
Error queue entry present with submission_id and reason; Slack channel empty; alert logged for FullSpec team review; no data lost.
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 team member's email address as the test contact. Do not send the outreach sequence to a real customer. Create a dedicated HubSpot contact and deal record clearly labelled 'QA TEST — DO NOT USE' before starting. After the test run is complete, the FullSpec team must void the Typeform submission, delete or archive the Notion entry, reset the HubSpot contact properties, and confirm in the FullSpec run log that all test data has been removed. Phase 3 must not begin until Phase 1 and Phase 2 have fully passed and production credentials have been verified against the Integration and API Spec.

Phase 3 runs the complete automation flow in the live production environment, using production API credentials, the live HubSpot pipeline, the marketing team's Slack channel, and the live Notion testimonial database. Every step is traced and logged. The process owner joins for test case T26, which constitutes their formal acceptance of the automation and is recorded in the FullSpec confirmation log.

ID
Scenario
Input
Expected output
Pass criteria
T23
Full production run: deal close to email send and CRM note
A designated internal QA contact's HubSpot deal is moved to the production 'Closed Won' stage by a FullSpec team member.
Automation triggers within 60 seconds; personalised request email delivered to the internal test inbox from the production Gmail account; HubSpot contact note logged with send timestamp and Typeform link.
Email in production inbox within 60 seconds; Typeform link functional and parameterised with the correct contact_id; HubSpot note present with all required fields; CRM record shows no anomalies.
T24
Full production run: Typeform submission through to Slack card
FullSpec team member submits the production Typeform using the link from T23, completing all fields including the permission checkbox.
Follow-up sequence cancelled for the contact; Slack approval card posted to the live marketing channel within 60 seconds with full submission content and both action buttons active.
No follow-up reminders queued; Slack card present in the marketing channel; quote text matches the Typeform submission exactly; both buttons responsive.
T25
Full production run: approval, Notion entry, and HubSpot update
FullSpec team member clicks 'Approve' on the T24 Slack card.
Notion testimonial database receives a new entry with all six fields populated; HubSpot contact properties 'Testimonial Collected' and 'Testimonial Approval Date' updated; execution log records the full run from trigger to completion with no errors.
Notion entry present and correctly formatted; HubSpot properties updated within 90 seconds of approval; end-to-end execution log shows all steps green with timestamps; no error log entries for this run.
T26
Process owner review and acceptance
Process owner reviews the complete execution log from T23 through T25, the Notion entry, the HubSpot contact record, the Slack approval card history, and the production inbox.
Process owner confirms that each step behaves as described in the Process Runbook, that the testimonial data appears correctly in Notion and HubSpot, and that the Slack card functioned as expected. Process owner records their acceptance in the FullSpec confirmation log.
FullSpec confirmation log updated with the process owner's name, role, acceptance date, and a statement that the automation meets the agreed acceptance criteria. Test data voided by the FullSpec team and removal confirmed in the same log entry. No separate signoff block required.
After T26 is recorded, the FullSpec team will remove all Phase 3 test data: the QA HubSpot contact and deal, the Typeform submission, the Notion library entry, and any Slack messages from the test run. Confirmation of removal is appended to the T26 log entry. The automation is then cleared for go-live on the agreed date. For any questions about this test plan, contact support@gofullspec.com.
Test and QA PlanPage 4 of 4

More documents for this process

Every document generated for Customer Testimonial Collection.

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