Simple version:
- Track every field in a Google Sheet.
- Keep detailed decisions in a ticke.t
- Use AI to draft each row.
- Get the business rule approved.
- Use AI to verify 10 sample records.
- Update the tracker.
The core idea is:
one field -> one rule -> 10 sample records -> pass/fail -> tracker status
Use Google Sheets as the live tracker.
Use CSV exports when AI or scripts need to process a batch.
| Column | What it tracks |
|---|---|
| Field ID | Stable ID, such as F005. |
| Source Field | Field in the old system. |
| HubSpot Field | Target field in HubSpot. |
| Example Values | A few real source values. |
| Business Rule | Short approved rule. |
| Verification Test | How to prove it worked. |
| Status | Not started, Drafted, Blocked, Approved, Implemented, Tested, Imported. |
| Owner | Person who can approve the rule. |
| Ticket Link | Detail, questions, evidence. |
| Next Action | What needs to happen next. |
Example:
Field ID,Source Field,HubSpot Field,Example Values,Business Rule,Verification Test,Status,Owner,Ticket Link,Next Action
F001,first_name,firstname,Sarah,Use if present,Check 10 records match source,Approved,CRM owner,TICKET-101,Ready to import
F003,email_address,email,sarah@example.com,Use as primary email if valid,Check 10 emails match after trim/lowercase,Approved,CRM owner,TICKET-103,Ready to import
F005,product_code,primary_publication,"MAG_PRINT_001, MAG_OLD_99",Map product code to approved publication,Check 10 records map to one HubSpot option,Blocked,Publishing owner,TICKET-205,Confirm old product codes
F006,do_not_email,hs_email_optout,true,Opted-out contacts must stay opted out,Check 10 opted-out records are not marketable,In review,Legal owner,TICKET-301,Legal approvalUse a ticket or github issue when a row needs detail.
Keep it short.
# F005: product_code to primary_publication
## Rule
Product codes map to approved HubSpot publication names.
Unknown codes go to the exception report.
## Mapping
| Source Value | HubSpot Value | Status |
| --- | --- | --- |
| MAG_PRINT_001 | Magazine Print | Approved |
| MAG_DIGITAL_001 | Magazine Digital | Approved |
| MAG_OLD_99 | TBD | Needs review |
## Questions
- Should old product codes map to current publication names?
- If a contact has multiple product codes, which one is primary?
## Verification
Check 10 sample records.
Each HubSpot value must match the approved rule.
## Evidence
- Export checked:
- Test result:
- Exceptions:Use this when adding a new field.
Create a tracker row for this HubSpot migration field.
Source field:
[source field]
HubSpot field:
[HubSpot field]
Sample source values:
[sample values]
Known notes:
[notes]
Return one row with:
Field ID, Source Field, HubSpot Field, Example Values, Business Rule, Verification Test, Status, Owner, Ticket Link, Next Action
If the business rule is unclear, set Status to Blocked and write the question in Next Action.
Use this when a row is blocked, high risk, or needs a decision.
Create a short migration ticket from this tracker row:
[paste tracker row]
Include:
- Rule
- Mapping table, if useful
- Questions
- Verification
- Evidence needed
Keep it short.
If the rule is unclear, list the exact question for the business owner.
Use this after the mapping is implemented or test-imported.
Verify this HubSpot migration field.
Tracker row:
[paste tracker row]
Approved business rule:
[paste approved rule]
Here are 10 sample records:
[paste records]
Each sample has:
Record ID, Source Value, Transformed Value, HubSpot Value
For each sample:
1. Work out the expected HubSpot value from the business rule.
2. Compare it to the actual HubSpot value.
3. Mark Pass, Fail, or Needs review.
4. Explain the reason briefly.
Return:
1. A results table:
Record ID, Source Value, Expected Value, HubSpot Value, Result, Reason, Suggested Fix
2. Overall result:
Pass, Fail, or Needs review
3. Exceptions to log.
4. Evidence summary for the ticket.
5. Suggested tracker status.
Set status to Tested only if all 10 samples pass.
Sample input:
Record ID,Source Value,Transformed Value,HubSpot Value
C001,MAG_PRINT_001,Magazine Print,Magazine Print
C002,MAG_DIGITAL_001,Magazine Digital,Magazine Digital
C003,MAG_OLD_99,,Magazine PrintUse this when checking multiple fields.
Verify this migration batch.
Tracker rows:
[paste rows]
Sample records:
[paste samples]
Each sample has:
Field ID, Record ID, Source Value, Transformed Value, HubSpot Value
For each Field ID:
1. Check 10 samples against the business rule.
2. Count Pass, Fail, and Needs review.
3. List failed or unclear records.
4. Recommend the next tracker status.
Return two tables.
Table 1:
Field ID, Pass Count, Fail Count, Needs Review Count, Recommended Status, Notes
Table 2:
Field ID, Record ID, Problem, Suggested Fix, Owner
Use this after verification.
Update this tracker row from the verification result.
Current tracker row:
[paste row]
Verification result:
[paste result]
Return the updated row.
Only update:
- Status
- Verification Test
- Next Action
Rules:
- If all 10 samples passed, set Status to Tested.
- If any sample failed, keep Status as Implemented and put the fix in Next Action.
- If any sample needs review, set Status to Blocked and name the owner needed.
MCP is optional.
Start with the Google Sheet and CSV exports.
Add MCP when the AI needs to read HubSpot or Google Drive directly.
HubSpot:
- Use the HubSpot remote MCP server:
https://mcp.hubspot.com. - Create an MCP auth app in HubSpot.
- Authenticate with OAuth and PKCE.
- Start with read/review workflows.
- Keep human approval before writing anything back to HubSpot.
Google Drive:
- Use Google Sheets for the tracker.
- Use Google Docs for ticket docs if needed.
- Use the Google Drive MCP server:
https://drivemcp.googleapis.com/mcp/v1. - Authenticate with the Google account that has access to the tracker.
Useful MCP prompts:
Find the HubSpot property definition for this field:
[paste HubSpot field]
Return the property type, allowed values, and constraints.
Find the migration tracker.
Show rows where Status is Blocked and group them by Owner.
A field is done when:
- The business rule is approved.
- The mapping is implemented.
- 10 sample records pass.
- Exceptions are logged.
- Evidence is linked in the ticket.
- The tracker status is updated.