Tools And Systems
09 — Tools & Systems
Goal of this doc: Know what every tool does, where to find it, and which one to open for any given task. No hunting around.
Your daily stack
| Tool | What it’s for | Where to access |
|---|---|---|
| HubSpot | Migration pipeline tracking, deal records, activity logging | app.hubspot.com |
| Supabase Portal | Migration data, partner records, porting status | avaya.cloudmagicgroup.com/portal |
| n8n | Workflow automation — monitor, debug, re-trigger | n8n.cloudmagicgroup.com |
| Splunk | Event logging, health checks, alerting | Splunk on ThinkPad (SSH tunnel) |
| Slack | Real-time coordination, alerts | #migrations, #hot-leads, #sales-alerts |
| CLI scripts | Porting, compliance, feature mapping, health checks | execution/ directory |
| UCaaS admin consoles | Platform provisioning | Per-platform (see doc 05) |
HubSpot — your migration queue
HubSpot is the canonical record for every migration. The deal object is what n8n 903 reads to fire. If something is wrong in HubSpot, the automation breaks.
Fields you own on every migration deal
| Field | What it tracks | When to update |
|---|---|---|
| Deal Stage | Current migration stage (1–7) | Every stage transition — triggers n8n 903 |
| Amount | Contract value (annual MRR) | Confirm at handoff from sales — do not change |
| Close Date | Estimated go-live date | Update as soon as FOC date is confirmed |
| Target Supplier | UCaaS platform selected | Confirm at handoff |
| Seat Count | Number of seats (from assessment) | Update if assessment reveals different count than sales estimated |
| Compliance Flags | HIPAA/PCI/FedRAMP/FERPA or None | Set at assessment |
| Migration ID | Supabase UUID for this migration | Auto-populated by n8n 903; verify it matches Supabase |
| Notes | Current status summary | Update after every customer interaction |
HubSpot deal stage → n8n trigger mapping
| HubSpot Stage | n8n event |
|---|---|
| Closed Won | 903 fires (all 6 stages) |
| Go-Live | 904 fires (health check schedule) |
If a deal stage is changed and n8n doesn’t fire, check n8n execution history. The webhook trigger is https://n8n.cloudmagicgroup.com/webhook/migration-new.
Supabase — the migration data store
Supabase holds the technical record for every migration: porting status, compliance sign-offs, feature maps, health check results.
Accessing Supabase
Web portal (for data inspection):
https://avaya.cloudmagicgroup.com/portal→ migrations table
Direct Supabase dashboard:
https://supabase.com/dashboard/project/wjuavuucarznaioipitu(prod Avaya project)
Via CLI scripts:
The Python scripts in execution/ interact with Supabase directly through the REST API. The crm_client.py module handles all CRUD operations.
Key tables
| Table | What’s in it | Your read/write |
|---|---|---|
migrations | One row per migration — metadata (JSON), status, created_at | Read: daily. Write: via scripts. |
leads | Scored prospect pool | Read only for DEs |
partners | MSP partner accounts | Read only for DEs |
activities | Activity log (Splunk-mirrored) | Read: for debugging |
Inspecting a migration record
# Check Supabase REST API directly (requires SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY from .env)
curl -X GET "https://wjuavuucarznaioipitu.supabase.co/rest/v1/migrations?migration_id=eq.<uuid>" \
-H "apikey: <SUPABASE_SERVICE_ROLE_KEY>" \
-H "Authorization: Bearer <SUPABASE_SERVICE_ROLE_KEY>"
Or use the crm_client.py module:
from execution.crm_client import get_migration
migration = get_migration("<uuid>")
n8n — the automation backbone
n8n runs on the Surface at 10.1.50.206:5678. Accessible externally via https://n8n.cloudmagicgroup.com. All workflows are live and active.
Workflows you interact with as a DE
| Workflow | What it does | When to use it |
|---|---|---|
| 903 | Migration lifecycle (Stages 1–6) | Fires automatically on HubSpot Closed Won. Re-trigger manually if it didn’t fire. |
| 904 | Health checks (Day 1/7/30/60) | Fires automatically when deal moves to Go-Live. Monitor outputs in Splunk. |
| 902 | Lead intelligence + scoring | Sales team tool — you’ll rarely touch this |
Accessing n8n
- Browser:
https://n8n.cloudmagicgroup.com - Login: admin / (password in
/home/n8n/.envon Surface) - Direct SSH if external access is down:
ssh -J thinkpad n8n@10.1.50.206
Re-triggering workflow 903 manually
If n8n didn’t fire on a HubSpot stage change:
curl -X POST https://n8n.cloudmagicgroup.com/webhook/migration-new \
-H "Content-Type: application/json" \
-d '{
"migration_id": "MIG-XXXX",
"customer_name": "Acme Corp",
"customer_email": "it@acme.com",
"company_domain": "acme.com",
"seat_count": 45,
"target_supplier": "RingCentral",
"avaya_product": "Avaya IP Office 500",
"urgency_level": "high",
"avaya_contract_end": "2026-08-01",
"deal_value": 32400,
"partner_id": "CMTG-INTERNAL",
"msp_slack_webhook": "https://hooks.slack.com/services/..."
}'
Use exact field names — the workflow uses seat_count (not seats), target_supplier (not target_platform), customer_email (not contact_email).
CLI scripts — your execution toolkit
All scripts live in execution/. Run from the project root with the .env file sourced.
cd /home/stacksbyc/projects/avaya
source .env # or add to your shell profile
porting_tracker.py
# Create a new port order
python3 execution/porting_tracker.py --action create \
--migration-id <uuid> --numbers "415-555-0100,415-555-0101" --carrier "Spectrum Business"
# Check status
python3 execution/porting_tracker.py --action status --migration-id <uuid>
# Advance stage (when FOC received)
python3 execution/porting_tracker.py --action update \
--migration-id <uuid> --stage foc_received --foc-date "2026-06-15"
# Generate port-day checklist
python3 execution/porting_tracker.py --action checklist --migration-id <uuid>
Stage progression: loa_pending → loa_submitted → foc_received → port_day → complete
compliance_checker.py
# Detect vertical and initialize
python3 execution/compliance_checker.py --migration-id <uuid> --industry "healthcare"
# View current status
python3 execution/compliance_checker.py --migration-id <uuid> --check-status
# Sign off a requirement
python3 execution/compliance_checker.py --migration-id <uuid> \
--sign-off --requirement hipaa_baa_signed --signed-by "you@cloudmagicgroup.com"
# Stage gate check (0=pass, 2=blocked)
python3 execution/compliance_checker.py --migration-id <uuid> --can-advance --stage 5
feature_mapper.py
# Generate feature gap analysis
python3 execution/feature_mapper.py --source avaya --target ringcentral --output-format text
# Save to migration record in Supabase
python3 execution/feature_mapper.py --source avaya --target 8x8 --migration-id <uuid>
# Supported targets: ringcentral, teams, zoom, 8x8, dialpad, sangoma
health_check.py
# Run a health check with current metrics
python3 execution/health_check.py --migration-id <uuid> \
--metrics '{"mos":4.1,"jitter":15,"latency":80,"packet_loss":0.1,"nps":8,"adoption_pct":0.85}'
tco_calculator.py
# Generate TCO comparison for a migration proposal
python3 execution/tco_calculator.py --seats 75 --current-cost 4500 --target-platform ringcentral
# Export as HTML (shareable with customer)
python3 execution/tco_calculator.py --seats 75 --current-cost 4500 --target-platform ringcentral --export-html
generate_proposal.py
# Generate assessment questionnaire (Stage 2)
python3 execution/generate_proposal.py --stage assessment --migration-id <uuid>
# Generate proposal document (Stage 3)
python3 execution/generate_proposal.py --migration-id <uuid>
Splunk — monitoring and observability
Splunk runs in Docker on the ThinkPad at 10.1.50.132.
Accessing Splunk
- Web UI:
http://10.1.50.132:8000(if on the local network) - SSH to ThinkPad and port-forward if remote:
ssh -L 8000:localhost:8000 thinkpad - Default index for Avaya events:
avaya
Key searches
# All events for a specific migration
index=avaya migration_id="<uuid>"
# Compliance sign-offs for a migration
index=avaya action=compliance_signoff migration_id="<uuid>"
# Port order events
index=avaya (action=port_order_created OR action=port_stage_advanced)
# Health check results
index=avaya sourcetype=health_check
# Feature map completions
index=avaya action=feature_map_complete
# Any errors in the last 24h
index=avaya level=error earliest=-24h
The Splunk error monitor
A cron job (execution/splunk_error_monitor.py) runs every 5 minutes on the ThinkPad and sends Slack alerts for any critical errors. If you see an unexpected alert in #sales-alerts, search Splunk for the context.
Slack — real-time coordination
| Channel | Purpose | What to post there |
|---|---|---|
#migrations | Migration team coordination | Stage changes, port updates, go-live notifications, blockers |
#hot-leads | High-priority lead alerts | Read-only for DEs; escalation path if a customer in active migration has a sales question |
#sales-alerts | Platform alerts (Stripe, Splunk, n8n errors) | Monitor for system issues that affect your migrations |
#competitive-digest | Daily competitive intel | Background reading — not action items for DEs |
Standard Slack messages for migrations
Migration received (Stage 1):
@migration-team— received handoff for [CUSTOMER NAME] ([SEATS] seats, [SUPPLIER]). Migration ID: [UUID]. Starting assessment this week.
Go-live complete:
[CUSTOMER NAME] is live on [SUPPLIER]. All [N] sites confirmed. E911 tested. Migration ID [UUID] complete. Health check Day 7 is [DATE].
Blocker:
BLOCKER — [CUSTOMER NAME] [UUID]: [DESCRIBE ISSUE]. [IMPACT]. Working on resolution. ETA: [TIME/DATE].