Overview
21
Items to Migrate
12
Complete & Live
0
In Progress
1
Blocked / Awaiting Info
8
Not Started
Live HubSpot views:
New Workflows Migrated to Custom Code
·
Workflows to Migrate to Custom Code
Saved filters in HubSpot — canonical source-of-truth for what is replaced vs. still pending.
Saved filters in HubSpot — canonical source-of-truth for what is replaced vs. still pending.
Insycle
12 / 13
Zapier
0 / 2
Apps Script
0 / 3
Box 1.0
0 / 3
Recent progress (05/08/2026): Dedup on MOID is now live as a HubSpot Custom Code Action
replacing Insycle recipe
022e736c. Validated against a 3-record fixture; sequential merge handles HubSpot's
canonical-id reassignment and writes a summary note on the surviving master. A scheduled-batch variant is in progress
(Greenbox-built) to mirror Insycle’s weekly Sat run. Two new lessons captured in
hubspot-playbook #47 and #48.
Still needed: Match + master rules for the remaining Insycle recipes
(
248b5e9d Broker Dedup, d973b95b + 11f8a81d State/Region copy). Pattern from
Dedup on MOID (capture from Insycle UI → Custom Code Action with same logic) is now proven and reusable.
Phase 1 — Replace Insycle High Priority
| Workflow / Automation | ID | Object | Replacement Approach | Status | Owner | Est. Hrs | Actual Hrs | ETA |
|---|---|---|---|---|---|---|---|---|
| Dedup on MOID DEPRECATED & REPLACED Old: Insycle recipe 022e736c (4-template chain) — turned off 05/08/2026, renamed to “Dedup on MOID (Insycle) - Deprecated 05/08/2026”New: HubSpot Custom Code Action with master-rule selection, canonical-id-following merge, and inline summary note on master |
Old: 248342288 OFF New: 1818402338 |
Contact | functions/hubspot-dedup/dedup-on-moid.js — deployed to action 103 of new workflow. Source rules captured from Insycle UI; tested with 3-record fixture (1 master + 2 losers including a no-email loser). |
✅ Cutover Complete | Goodwood | 3.0 | 4.0 | Done 05/08/2026 |
| Dedup on MOID — Weekly Scheduled Run REPLACED CRON Old: Insycle scheduled automation, template 538b0c72 (weekly Sat)New: HubSpot list-based workflow enrolling all contacts with known MOID, sharing the same Custom Code Action source as 1818402338 |
Old: 538b0c72 (Insycle) New: 1818352528 |
Contact | Same dedup-on-moid.js source; enrollment trigger is merchantsownersid IS_KNOWN (list-based, batch enrollment) instead of per-record. Insycle template 538b0c72 ready to deactivate. |
✅ Cutover Complete | Greenbox | 0.5 | 0.5 | Done 05/08/2026 |
| Dedup on SubID REPLACED Old: Insycle template 1d7c3cdd (weekly Sat scheduled, only)New: HubSpot Custom Code Action with master-rule (latest createdate wins), canonical-id-following merge, summary note on surviving deal. Sales Pipeline only. |
Old: 1d7c3cdd (Insycle) New: 1818248059 |
Deal | functions/hubspot-dedup/dedup-on-subid.js — deployed to action 103. Trigger: loan_request_id IS_KNOWN. Tested with 3 deals sharing a SubID in Sales Pipeline; latest-createdate master rule confirmed. |
✅ Tested & Activated | Goodwood | 2.0 | 1.5 | Done 05/08/2026 |
| Dedup on SubID — Weekly Scheduled Run REPLACED CRON Old: Insycle scheduled run on template 1d7c3cdd (weekly Sat)New: HubSpot list-based workflow enrolling all deals with known SubID in Sales Pipeline, sharing the same Custom Code Action source as 1818248059 |
Old: 1d7c3cdd (Insycle) New: 1818163032 |
Deal | Same dedup-on-subid.js source; list-based enrollment of all SubID-known deals in Sales Pipeline. Insycle template 1d7c3cdd ready to deactivate. |
✅ Cutover Complete | Greenbox | 0.5 | 0.5 | Done 05/08/2026 |
| Dedup on Broker ID (Companies) REPLACED Old: Insycle recipe 248b5e9d → template 3f22b3c7 "GBox Broker DeDupe" (per-record via HS WF 252497174, 15-min delay)New: HubSpot Custom Code Action with simple master rules: broker_id exists → earliest createdate. Operates on Companies-with-broker_id (brokerage entities). |
Old: 252497174 (Insycle) OFF New: 1818443075 |
Company | functions/hubspot-dedup/dedup-on-broker-id.js — deployed to action 2. Validated indirectly: when test broker companies were created, the legacy Insycle workflow 252497174 ran first (15-min delay) and merged them, confirming dedup behavior is in place. Insycle workflow 252497174 ready to deprecate. |
✅ Tested & Activated | Goodwood | 2.5 | 2.0 | Done 05/08/2026 |
| Dedup on Broker (Custom Object 2-4171901) N/A Investigated — HubSpot enforces uniqueness on broker_id_unique at the property level. Duplicates structurally cannot exist; dedup is unnecessary. Insycle's recipe for this object was empty for the same reason. Code archived in functions/hubspot-dedup/dedup-broker-object.js as documentation. |
— | Broker (2-4171901) | No workflow needed — HubSpot property-level uniqueness handles it | Not Required | — | 0.5 | 0.5 | Investigated 05/08/2026 |
| Contact: Known State/Region copies into unknown state or province Two Insycle steps: state → state_region; state → province |
273473097 | Contact | Inline HubSpot Custom Code Action (no Cloud Function) — copy or normalize via lookup table | Not Started | Goodwood | 1.5 | — | Phase 1a |
| Step 2 - Associate Broker (Partner of Exclusivity) Marked “No longer used” — replaced by workflow 1704811958 |
452741668 | Company | Confirm with Kris — likely no rebuild required | Disabled | Kris | 0.0 | — | Confirm |
| Dedup on Merchant ID (Companies) REPLACED Old: Insycle template 4c505332 "GBox Company DeDupe" (weekly Sun)New: HubSpot Custom Code Action with master rules: num_associated_deals highest → owner exists → earliest createdate |
Old: 4c505332 (Insycle) New: 1818450555 |
Company | functions/hubspot-dedup/dedup-on-merchant-id.js — deployed to action 2. Workflow created from scratch via v4 API. Tested with 3-company fixture; merged + summary note confirmed. |
✅ Tested & Activated | Goodwood | 2.5 | 2.0 | Done 05/08/2026 |
| Dedup on Merchant ID (Companies) — Weekly Scheduled Run REPLACED CRON Old: Insycle scheduled run on template 4c505332 (weekly Sun)New: HubSpot list-based workflow enrolling all companies with known Merchant ID, sharing the same Custom Code Action source as 1818450555 |
Old: 4c505332 (Insycle) New: 1818461546 |
Company | Same dedup-on-merchant-id.js source; list-based enrollment of all Merchant-ID-known companies. Insycle template 4c505332 ready to deactivate. |
✅ Cutover Complete | Greenbox | 0.5 | 0.5 | Done 05/08/2026 |
| Dedup on Phone (Contacts) — Weekly Schedule Run REPLACED CRON Old: Insycle template 2d0947d6 "GBox Contact DeDupe - Phone" (weekly Sat)New: HubSpot Custom Code Action matching on First Name + Last Name + Phone (compound exact match), bounded to records created in last 60 days, same master rules as MOID |
Old: 2d0947d6 (Insycle) New: 1818451370 |
Contact | functions/hubspot-dedup/dedup-on-phone.js — deployed to action 2. Workflow created from scratch via v4 API. Tested with 3-contact fixture; merged + summary note confirmed. Insycle template 2d0947d6 ready to deactivate. |
✅ Cutover Complete | Goodwood | 2.0 | 1.5 | Done 05/08/2026 |
| Dedup on Name + Company (Contacts) REPLACED Old: Insycle template fa71a1c7 "My 2. Deduplicate by same name, similar company" (weekly Sun)New: HubSpot Custom Code Action with compound match on First Name + Last Name + normalized Company Name (strips LLC/Inc/Corp/Co/the/etc. before comparing). Bounded to last 60 days. |
Old: fa71a1c7 (Insycle) New: 1818425780 |
Contact | functions/hubspot-dedup/dedup-on-name-company.js — deployed to action 2. Workflow created from scratch via v4 API. HubSpot search has no “common-terms-ignored” operator, so company normalization is done locally. Master rules: MOID exists → deal count highest → email exists → lifecycle ladder → earliest createdate. |
✅ Tested & Activated | Goodwood | 3.0 | 2.0 | Done 05/08/2026 |
| Dedup on Name + Company (Contacts) — Weekly Schedule Run REPLACED CRON Old: Insycle scheduled run on template fa71a1c7 (weekly Sun)New: HubSpot list-based workflow sharing the same Custom Code Action source as 1818425780 |
Old: fa71a1c7 (Insycle) New: 1818463667 |
Contact | Same dedup-on-name-company.js source. Insycle template fa71a1c7 ready to deactivate. |
✅ Cutover Complete | Greenbox | 0.5 | 0.5 | Done 05/08/2026 |
| Remove fake email addresses CRON Insycle template aa8d1edd — weekly Sat, Bulk Update purging the 324+ known invalid emails (per Roque’s ETL spec) |
aa8d1edd (Insycle) | Contact | Custom Code Action; canonical fake-email pattern list (need source from Greenbox) maintained in Firestore or as a const list, scheduled enrollment | Blocked — need pattern list | Goodwood | 2.5 | — | Need 324+ list |
Phase 1c — Daily Insycle Transforms CRON
Three daily Insycle "Transform Data" recipes — title-case / normalize property values. Lower priority than dedup; can stay on Insycle until last.
| Workflow | ID | Object | Replacement Approach | Status | Owner | Est. Hrs | Actual Hrs | ETA |
|---|---|---|---|---|---|---|---|---|
| Format Companies (name, address, phone) REPLACED CRON Old: Insycle template d5c478ae "GBox Company Formatting Recipe" (daily)New: HubSpot Custom Code Action — Title Case for name/dba/address/city, UPPER for state, XXX-XXX-XXXX for phone. Idempotent (no-op when already formatted). Insycle template d5c478ae ready to deactivate. |
Old: d5c478ae (Insycle) New: 1818501923 |
Company | functions/hubspot-format/format-company.js — deployed to action 1. List-based enrollment for daily scheduled run. |
✅ Cutover Complete | Goodwood | 1.5 | 1.0 | Done 05/08/2026 |
| Format Contacts (name, address, phone, sub_lead_source) REPLACED CRON Old: Insycle templates 9dae83fb "GBox Contact Formatting Recipe" + 3f9efbd5 "Sub Lead Source Proper Case" (both daily)New: single HubSpot Custom Code Action handling firstname/lastname/address/city/sub_lead_source (Title Case), state (UPPER), phone+mobilephone (XXX-XXX-XXXX). Idempotent. Two Insycle templates collapsed into one workflow. Both Insycle templates ready to deactivate. |
Old: 9dae83fb + 3f9efbd5 (Insycle) New: 1818455336 |
Contact | functions/hubspot-format/format-contact.js — deployed to action 1. List-based enrollment for daily scheduled run. |
✅ Cutover Complete | Goodwood | 2.5 | 1.5 | Done 05/08/2026 |
Phase 2 — Replace Zapier Medium
| Workflow | ID | Object | Replacement Approach | Status | Owner | Est. Hrs | Actual Hrs | ETA |
|---|---|---|---|---|---|---|---|---|
| Company: Get Company Owner via Zap Deal/Broker/RAM | 397047062 | Company | Native HubSpot workflow (or Custom Code Action) reading associated Deal/Broker/RAM and setting Company owner | Not Started | Goodwood | 2.5 | — | Phase 2 |
| Deal: Set RAM Zapier Trigger Flag to Re-enroll | 451439239 | Deal | Native re-enrollment trigger; remove Zapier dependency | Not Started | Goodwood | 1.5 | — | Phase 2 |
Phase 3 — Replace Google Apps Scripts Medium
| Workflow | ID | Object | Replacement Approach | Status | Owner | Est. Hrs | Actual Hrs | ETA |
|---|---|---|---|---|---|---|---|---|
| TEST — Lead Assignment Custom Allocation (HS Webhook + Google Sheet + App Script) | 592953110 | Contact | Cloud Function (functions/lead-routing/customAllocation.js) — round-robin / weighted allocation; Firestore for state |
Not Started | Goodwood | 4.0 | — | Phase 3 |
| TEST — New Lead Flow Custom Allocation (HS Webhook + App Script) | 1672541470 | Contact | Cloud Function — shares allocation logic with above | Not Started | Goodwood | 2.0 | — | Phase 3 |
| Contacts: Retargeting Expired Opportunities — Sequences (Custom Allocation Script) | 589795957 | Contact | Cloud Function — retargeting allocation | Not Started | Goodwood | 3.0 | — | Phase 3 |
Phase 4 — Box 1.0 Integration Lower / depends on Box API
| Workflow | ID | Object | Replacement Approach | Status | Owner | Est. Hrs | Actual Hrs | ETA |
|---|---|---|---|---|---|---|---|---|
| Deals: MASTER Set Deal Stage from Box Processing Status | 246274200 | Deal | Cloud Function consuming Box webhook → updates Deal stage. Coordinate with Sarah Lackey’s team. | Not Started | Goodwood + GBX Tech | 4.0 | — | Phase 4 |
| Deal: Create Box Submission URL | 291732615 | Deal | Custom Code Action constructs URL from Deal properties — lift logic from current workflow | Not Started | Goodwood | 1.5 | — | Phase 4 |
| Deal: TEST — Webhook to Box | 297128822 | Deal | Production-grade Cloud Function replacing the test webhook | Not Started | Goodwood + GBX Tech | 3.0 | — | Phase 4 |
Cross-Cutting Requirements (from Roque’s ETL spec, 2026-04-28)
Every dedup / merge / ingestion replacement must natively handle these three traps before Insycle can be cancelled:
| Requirement | Description | Status |
|---|---|---|
| Secondary Decision Makers | Un-flatten the secondary owners from the legacy Box export and attach them to the Deal. | Not Started |
| Pipeline Spam Prevention | Pre-ingestion filter for the 324+ known invalid emails. Maintain canonical list in Firestore. | Not Started |
| Rep Collisions / Merged Accounts | Exception logic to associate a single owner across multiple distinct companies without HubSpot improperly merging records. | Not Started |
QA & Cutover Plan
- Parallel-run window: Run new Cloud Functions alongside Insycle for at least two Friday legacy Box batches. Roque manually validates Data Hub output against legacy Box output.
- Audit trail: Every dedup decision is written to Firestore (
dedup_runs/{objectId}-{timestamp}) with: trigger record, candidate matches, master-record decision, merged result, and timing. - Cancellation gate: Insycle subscription terminates only after zero data collisions across both parallel-run weeks.
- Slack notifications: Per-run summary posted to a Greenbox-internal channel for both Goodwood and Greenbox tech to review.
Open Questions
- Insycle recipe configs — need exports or screenshots of all 4 referenced templates (match rules + master rules).
- Broker object type — confirm
objectTypeId: 0-2on the Broker dedup workflow is a custom object vs. a Company subtype. - Workflow 452741668 (disabled Partner of Exclusivity) — rebuild or skip?
- Box 1.0 API access — coordinate with Sarah’s team (5/13–5/15 meeting) on credentials + endpoint surface.
- Cancellation date target — Kris wants subscription costs killed; need explicit cutover date once parallel-run validates clean.
Source of truth: This tracker is published from
public/greenbox/reports/migration-tracker.html in the
greenbox-core-apps repo. Update statuses by editing the badges and re-deploying.
Workflow inventory & phased plan: docs/GREENBOX_WORKFLOWS_INVENTORY.md.