VTG · Lead → Invoice Process Map
E-Rate + Commercial tracks · All swim lanes · Workers included · Sep 2026 · vtg-process-map.pages.dev ↗
Live
In Progress
Planned
Manual
Gap
Decision
Flow Diagram
Written SOP
Gap Analysis
Workers
Glossary
Automations
Dashboards
0 · CRM Setup
1 · Lead / Intake
2 · Bid Building
3 · Post-Sale
4 · Delivery
5 · Invoice
E-RATE TRACK (VTG-06)
Automation
Account + Contact Created
El Nova pushes on own timing · dedup logic
Live
⚡ El Nova integration
Salesforce Account Sync
Account + Contact upserted to SF · UID written back to monday
Live
⚡ vtg-sf-account-sync
ScopeStack Proposal + SOW
Blueprint in intake form → proposal + SOW auto-generated + delivered to Bids #3
Live
⚡ ScopeStack API
⚡ vtg-scopestack-doc-sync
El Nova → Bids #3 Item
Intake form submit → Account/Contact linked → item created
Live
⚡ vtg-bid-intake (patched Sep 3)
Accepted Monitor Board
El Nova creates item · polls USAC funding on schedule
LiveParallel
⚡ El Nova polling
Deal Reg Automation
Playwright → manufacturer portal
In Progress
⚡ dealreg.py
SOV Builder
SOV PDF → Bids #3 Files column
Live
⚡ vtg-sov-builder
Salesforce Sync
Every Bids #3 stage change → SF Opportunity
Live
⚡ vtg-monday-sf-sync
CS Order Form + 6 Post-Sale Subitems
Post-Sale stage → CSOP PDF + 6 task subitems auto-created
Live
⚡ vtg-cs-form
⚡ automation 482374746
⬦ CPQ or Direct to NS?
Decision point: CW Sell vs. NS quote
Decision
PO Sync
NS PO # + status → Projects #4
Live
⚡ vtg-po-sync
Materials Log → Ready to Invoice
PM submits → stage auto-advances + email
Live
⚡ vtg-materials-log
⚡ vtg-billing-ready
NS Invoice Creation
Manual today → vtg-ns-mcp-sync planned
Manual→ Planned
⚡ vtg-ns-mcp-sync
Sales Rep
Click accept_470
Opens vtg-bid-intake form in new tab
Manual
Fill Intake Form
Sales Exec · Blueprints · delivery · partner · mfr · due date · bond
Manual
Fill Bid Intake Form
Delivery, partner, mfr, due date, bond
Manual
Confirm PO / Award
FCDL received; moves Bid to Post-Sale
Manual
Bid Team
Deal Registration
Branden → manufacturer portals
Manual → Auto
Bid Build + Compile
Mark (BOM/cabling) → Dylan (compile + submit) · 23 auto-subitems with due-date countdown
Manual
Jon (PM)
Projects #4 Setup + Delivery
New → Installing stages; oversees field
Manual
Finance
Billing Notification Received
eratebilling@vtgus.com via vtg-billing-ready
Live
Create NS Invoice
Cari / Kevin — manual today
ManualGap
E-RATE OP SYSTEM (Deals + Projects · Financial / Scheduling Layer)
Automation
E-Rate Deals Item Created
Post-Monday → item on E-Rate Deals board
Live
⚡ automation 559103546
E-Rate Projects Item Created
E-Rate Deals Status: Pipeline → Awarded
Live
⚡ automation 7917669964
Status → Booked · Booking Date Stamped
E-Rate Deals Status → Booked → today's date auto-set
Live
⚡ automation 7917670450
Jon (PM)
Manage E-Rate Projects Execution
Execution Status · Billing Status · Risk Flag · Planned Start
Manual
COMMERCIAL TRACK (VTG-10 Cabling + Non-E-Rate)
Automation
MSP Portal CSOP → Projects #4
Form submission → item + task list created directly in Projects #4
Live
⚡ vtg-msp-csop
No Bids #3 step
Bypasses bid workflow
Task List Built by CSOP Form
Subitems auto-created on Projects #4 item
Live
⚡ vtg-msp-csop
Install → Ready for Invoicing
Stage advance → billing notification fires
Live
⚡ vtg-billing-ready
NS Invoice Creation
Manual today → vtg-ns-mcp-sync planned
Manual→ Planned
⚡ vtg-ns-mcp-sync
Jon (PM)
Manage Delivery + Task List
Works subitems in Projects #4; advances stage when complete
Manual
Finance
Billing Notification Received
eratebilling@vtgus.com · same flow as E-Rate
Live
Create NS Invoice
Manual today
ManualGap

Click any step to see detail · Scroll right if needed · Two tracks share the same invoicing lane

Click any step above to see triggers, inputs, outputs, and automation notes.
E-Rate Track · VTG-06
El Nova Leads → Bids #3 → Projects #4 → NetSuite
0
CRM Setup — Account & Contact Creation
Runs independently · El Nova integration + vtg-sf-account-sync · E-Rate only
0.1 · El Nova Pushes Account + Contact RecordsAutomation (El Nova)Live
On its own schedule — not tied to the accept_470 click — El Nova pushes district and contact data into the CRM. It checks for existing records first; new Accounts (board 18176632844) and Contacts (board 18176633260) are only created if they don't already exist (dedup logic). Sales reps never manually create these records.
⚡ El Nova integration · Austin Novakowski's original webhook automations
0.2 · vtg-bid-intake Waits for These RecordsAutomationLive
When vtg-bid-intake fires after accept_470, it performs a district name search to auto-link the Account and Contact to the new Bids #3 item. The 5-second retry loop in vtg-bid-intake exists specifically because El Nova may not have written the Account/Contact yet at the exact moment the bid item is being created. This is the dependency between Phase 0 and Phase 1.
⚠ Note: Commercial / MSP portal track does not create Accounts or Contacts — E-Rate only
0.3 · vtg-sf-account-sync Upserts Account + Contact to SalesforceAutomationLive — Sep 8 2026
When an Account or Contact is created or updated on their respective monday.com boards, vtg-sf-account-sync fires via webhook. It upserts both the Account and Contact objects into Salesforce using Monday_Item_ID__c as the external ID — creating new SF records or updating existing ones idempotently. After the SF upsert, the Worker writes the Salesforce Account ID back to the UID column (text_mm6s8adk) on the monday.com Accounts board, completing the cross-system link. A backfill script (backfill.mjs) ran against all 791 existing accounts to populate Salesforce and stamp the UID column. Complements vtg-monday-sf-sync which syncs Bids — this Worker handles the CRM Account/Contact layer.
⚡ vtg-sf-account-sync · SF Client Credentials OAuth · Monday_Item_ID__c external ID · KV: SF_ACCOUNT_TOKEN_KV
1
Lead Intake
El Nova Leads Board → Bids #3 · Sales Rep + Automation
1.1 · 470# Arrives on El Nova Leads BoardAutomationLive
El Nova pushes inbound Form 470 opportunities to the El Nova Leads board (ID 18181651809). Each lead carries a district name, 470#, and Opportunity Score extracted from the USAC PDF via two-layer decode (ASCII85 + FlateDecode).
1.2 · Rep Clicks accept_470 → vtg-bid-intake Form OpensSales Rep (Alan / Jake / Kevin)Manual
Rep clicks accept_470. A monday.com automation sets Status → Accepted, which fires a webhook to vtg-bid-intake. The Worker opens the intake form in a new browser tab. Rejected leads simply close the lead — no webhook fires, no Bids item created.
⚡ Automation 7920733007 → Status → Accepted → webhook 608965294 → vtg-bid-intake
1.3 · Rep Fills Intake Form (incl. Sales Exec + Blueprints)Sales Rep (Alan / Jake / Kevin)Manual
The vtg-bid-intake form now includes all intake fields in one place: Sales Executive, ScopeStack Blueprint(s), delivery method, partner, manufacturer, distributor, bid due date, and bond required. Blueprint selection inside the form triggers the ScopeStack API to auto-create a proposal. On submit, the Worker patches all columns to Bids #3, writes the SOV Builder link to link_mm591mdg, and creates a bond subitem + email if bond is required. The accept also sends a trigger to El Nova, which creates the Accepted Monitor board item.
⚡ ScopeStack API · Blueprint → proposal auto-created · live end-to-end
⚡ vtg-scopestack-doc-sync (LIVE Sep 8 2026) · ScopeStack document_status_changed webhook → .docx SOW auto-uploaded to Bids #3 SOW Document column (file_mm6wm4hn) · Generate SOW button (button_mm70vvrb) on Bids #3 triggers programmatic generation
1.3b · Accepted Monitor Board (Parallel)El Nova / AutomationLiveParallel Track
The accept trigger sent to El Nova causes El Nova to create an item on the Accepted Monitor board. This board runs in parallel to the main bid flow — it polls USAC automatically on a schedule to watch whether the 470 is funded. It is an FYI / watchdog board; the main Bids #3 flow does not gate on it. Rejected leads do not appear here — reject simply closes the lead.
⚡ El Nova · USAC funding polling · parallel to main flow · does not block Bids #3 progression
1.4 · vtg-bid-intake Creates Bids #3 ItemAutomationLive
Worker creates a new item in Bids #3 (board 18176633000) under New Bid Folder Creation. Auto-links Account (18176632844) and Contact (18176633260) via district name search with 5s retry. Writes "📋 Open Intake Form" link to the bid item.
⚡ vtg-bid-intake · vectorfi-admin.workers.dev
1.5 · Rep Fills Bid Intake FormSales RepManual
Rep opens the form link and completes: delivery method, partner, manufacturer, distributor, bid due date, bond required. Worker patches all columns. If bond required, subitem created and email fires to bonds@vtgus.com + CHC-Surety@alliant.com.
⚡ vtg-bid-intake · dual jsPDF (intake + Alliant bond forms)
2
Bid Building
Bids #3 stages: Deal Reg → Bid Building → Bid Compilation → Bid Submittal → Awaiting Results
2.1 · Deal RegistrationBrandenAutomating
Branden submits to manufacturer portals (Ruckus, Cisco, etc.). dealreg.py (Playwright) is built and field-mapped but not fully live — dynamic portal elements on Ruckus are causing failures.
⚠ Gap: dealreg.py not yet live · Branden still submitting manually
2.2 · Subitem Task System Activated on New BidAutomationLive
When a bid item is created, automation 482374765 immediately creates 23 subitems covering every stage from Folder Creation through Awaiting Results. Each task is pre-tagged with its Bid Stage, pre-assigned to the relevant person, and given a due date calculated as a countdown from the bid due date. Tasks are never re-created per stage — the full lifecycle checklist exists from day one, with future tasks in "Still To Do" or "Create Item" status until needed. The three per-person parent columns (Alan / Jake / Dylan Subitem Status) are driven by automations: they flip to Due Today at 11am ET when a task's date arrives, and clear when the task is marked Complete.
⚡ automation 482374765 · subitem board 18176633598 · Task Due Date Formula: SUBTRACT_DAYS(bid_due_date, days)
2.3 · Bid Build — Cabling, Disty, SOVMarkManual
Mark pulls distribution pricing and builds cabling scope. vtg-sov-builder is available for multi-tab SOV creation — generates a jsPDF SOV and uploads to Bids #3 Files column. SOV payload includes vendorPOs array pre-grouped by vendor for future NS PO creation.
⚡ vtg-sov-builder · KV: SOV_FORMS + SKU_CATALOG
2.4 · Bid Compile + SubmittalDylanManual
Dylan compiles all components and submits on the USAC EPC portal. Each stage change syncs to Salesforce via vtg-monday-sf-sync (upsert on Monday_Item_ID__c).
⚡ vtg-monday-sf-sync · Bids #3 stage → SF Opportunity
2.5 · Award DecisionSales RepManual
USAC issues FCDL. Won bids → Post-Sale. Lost bids → Lost sub-board. Wins also archived in Wins Archive sub-board.
3
Post-Sale
Bids #3 stage: Post-Sale · Sales Rep + Automation
3.1 · CS Order Form GeneratedAutomationLive
When Bids #3 → Post-Sale (webhooks 562741747 + 483153616), vtg-cs-form generates a CSOP PDF, emails to erateops@vtgus.com (CC: sales@vtgus.com) with KV deduplication, and auto-creates a monday subitem checklist. Simultaneously, automation 482374746 creates 6 Post-Sale subitems on the bid item: (1) Letter of Intent signed + uploaded to SharePoint (Jon), (2) Create Contract in ConnectWise Sell — gap: dead task, CPQ direction uncertain, (3) If SPI: FCDL uploaded to SharePoint or N/A if BEAR (Alan+Jake), (4) If SPI: FCDL templated email sent or N/A if BEAR (Alan+Jake), (5) Purchase Order issued by customer + uploaded to SharePoint (Alan+Jake), (6) Update SOV, get Disty quote to match, upload to SharePoint (Alan+Jake).
⚡ vtg-cs-form · SMTP2GO via noreply@vtgus.com · automation 482374746 (6 Post-Sale subitems)
⚠ Gap: "Create Contract in ConnectWise Sell" subitem is unassigned and N/A — dead task while CPQ direction is unresolved
3.2 · CPQ / Quoting — Decision PointTBDDecision
Two paths currently under evaluation:
⬦ Path A — ConnectWise Sell (CPQ) · Current direction
vtg-cs-form fires vtg-monday-cpq → clones E-Rate Contract template (c0f2a401…) → patches customer + project details. Quote # + CPQ Status write back to Bids #3. Line item population from SOV KV not yet built. Fire-and-forget call not consistently triggering — needs wrangler redeploy.
⬦ Path B — Direct to NetSuite · Planned direction
Skip CPQ entirely. vtg-ns-mcp-sync Bid Win → Sales Order flow handles quoting and order creation directly in NetSuite. Eliminates the CW Sell integration dependency. Auth is live; Sales Order flow is one of the six coded flows.
3.3 · PO / Funding ConfirmedSales Rep / KevinManual
Rep or Kevin confirms customer PO and E-Rate funding. vtg-po-sync (live Aug 25 2026) syncs NS PO number and approval status back to Projects #4 via cron every 4h + webhook on NS SO# column change.
⚡ vtg-po-sync · KV: PO_SYNC_KV (2c487e21…)
4
Project Delivery
Projects #4 stages: New → Installing → Ready for Invoicing · Jon (PM) + Field Crew
4.1 · Project Setup on Projects #4JonManual
Jon creates the Projects #4 item (board 18176626554) linked to the winning bid. Project Year dropdown auto-set by vtg-set-project-year. Stages advance: New → In Process → Waiting for Product → All Product Received → Kick Off → Pre-Install Staging → Installing.
⚡ vtg-set-project-year · dropdown_mkqz1ay (1=2024, 2=2025, 3=2026)
4.2 · Field InstallationField Crew / JonManual
Field crew installs. When stage → Installing, automation (ID 7922447604) auto-populates the Materials Log link column (link_mm6mhdcx). Jon or PM opens vtg-materials-log, selects fiber/copper parts from SKU_CATALOG, and submits.
⚡ vtg-materials-log · 81 fiber SKUs loaded · copper SKUs pending from Mark
4.3 · Stage → Ready for InvoicingAutomationLive
Materials log submission advances stage to Ready for Invoicing, stamps date_mm54qwps, posts thread update, and triggers vtg-billing-ready → email to eratebilling@vtgus.com. Automations: 7920569056, 7920172789, 7917999463, 7920230690.
⚡ vtg-billing-ready · vtg-materials-log · SMTP2GO
5
Invoicing
Ready for Invoicing → Closed · Finance (Cari / Kevin)
5.1 · Manual NS Invoice (Current State)Cari / KevinManualGap
Finance receives billing notification email and manually creates the NetSuite invoice. No automated handoff from monday.com to NS for invoice creation today.
⚠ Gap: no automated monday → NS invoice creation
5.2 · Planned: vtg-ns-mcp-sync Invoice FlowAutomationPlanned
When Projects #4 → Ready for Invoicing, vtg-ns-mcp-sync fires the Ready to Invoice → NS Invoice flow. Auth is live (prod cert ID _Xm9jPsUb1H7DXPj5SmbJQNNKy3l7VU05MVPgGG4TSk). Blocked by: customer ID mapping (vtg-ns-compare paused post sandbox refresh) + NS service item internal ID needed from Kevin/Cari.
📋 vtg-ns-mcp-sync · cron every 15 min · 6 flows coded
5.3 · Project ClosedJon / FinanceManual
Once invoiced and paid, Projects #4 → Closed. Stage-change automation populates Actual Revenue Month (date_mm4tatyy) feeding the Forecast vs. Actual widget on the Pipeline dashboard (board 18419943586).
E-Rate Op System · Financial & Scheduling Layer
E-Rate Deals (18406412794) + E-Rate Projects (18406413755) · Workspace: E-Rate Operating System (14860884)
1
Post-Monday → E-Rate Deals Item Created
Runs in parallel to Projects #4 · Automation
1.1 · Bids #3 Post-Monday Fires E-Rate Deals CreationAutomationLive
When a Bids #3 item enters the Post-Monday group, automation 559103546 creates an item on the E-Rate Deals board (18406412794) in the E-Rate Operating System workspace. Fields populated: District, FRN, Contract Value, Funding Year, Category, Sales Owner. Status starts at Pipeline. This is the current active flow — the older automations that created a Projects #4 item directly (482374713) and notified CS/PM (482374738) are both inactive.
⚡ automation 559103546 · E-Rate Deals board 18406412794
1.2 · E-Rate Deals Status MaintainedUnknown / GapGap
The E-Rate Deals status (Pipeline → Submitted → Awarded → Booked) is not consistently maintained — it's unclear who updates it and when. This status is the trigger for the next step, so inconsistent updates mean the E-Rate Projects item may not be created reliably.
⚠ Gap: no defined owner or automation for E-Rate Deals status progression
2
Awarded → E-Rate Projects Item Created
E-Rate Deals Status: Pipeline → Awarded · Automation
2.1 · E-Rate Projects Item Auto-CreatedAutomationLive
When E-Rate Deals Status changes from Pipeline → Awarded, automation 7917669964 creates an item on the E-Rate Projects board (18406413755). The item mirrors data from both Bids #3 (Account, Contact, Bid Value, 470#, SharePoint Link, Projects #4 link, Bid Name) and E-Rate Deals (District, Booking Date, Contract Value, Funding Year).
⚡ automation 7917669964 · E-Rate Projects board 18406413755
2.2 · Jon Manages Execution in E-Rate ProjectsJonManual
Jon maintains the E-Rate Projects item as the financial and scheduling view of the project — distinct from Projects #4 which tracks physical delivery. Fields managed: Execution Status (In Execution / Ready / Substantial Completion / Complete / Billed), Billing Status (Ready / Sent / Paid / Not Ready), Planned Start Window (Q1/Q2/Q3/Q4/Summer/Post-Funding), Planned + Actual Start Dates, Completion Date, Risk Flag (Delayed / At Risk / Missing Start / None), PM, Project Owner, Notes.
2.3 · Status → Booked Stamps Booking DateAutomationLive
When E-Rate Deals Status → Booked, automation 7917670450 automatically stamps today's date into the Booking Date column, which mirrors into E-Rate Projects via the Linked Deal relation.
⚡ automation 7917670450 · Booking Date column (date_mm1ye0md)
Commercial Track · VTG-10 Cabling + Non-E-Rate
MSP Portal CSOP Form → Projects #4 directly → NetSuite
1
Lead Intake via MSP Portal
Bypasses El Nova and Bids #3 entirely · Automation
1.1 · CSOP Form Submitted via MSP PortalAutomationLive
Commercial leads come through the MSP portal, which triggers the vtg-msp-csop Worker. Unlike E-Rate, this flow bypasses Bids #3 entirely and lands directly in Projects #4. The CSOP form auto-builds the task list (subitems) for the project.
⚡ vtg-msp-csop · Projects #4 item created with task list subitems
1.2 · No Deal Reg or Bid Build PhaseN/A
Commercial track skips the entire Bid Building phase. Task list built by the CSOP form serves as the project scope and work order from day one.
2
Project Delivery
Projects #4 stages: New → Installing → Ready for Invoicing · Jon (PM)
2.1 · Jon Manages Delivery via Task ListJonManual
Jon works the subitems in Projects #4 as a task checklist. No separate bid compilation or SOV step. Stage advances through the same Projects #4 stages as E-Rate (New → Installing).
2.2 · Stage → Ready for InvoicingAutomationLive
Same flow as E-Rate: stage → Ready for Invoicing fires vtg-billing-ready → billing email to eratebilling@vtgus.com. Ready for Invoicing Date stamped (date_mm54qwps).
⚡ vtg-billing-ready · same automations 7920569056 + chain
3
Invoicing
Same as E-Rate track · Finance (Cari / Kevin)
3.1 · Manual NS Invoice → Planned AutoCari / KevinManual→ Planned
Finance receives billing notification and manually creates the NS invoice. Same planned automation path as E-Rate: vtg-ns-mcp-sync Ready to Invoice → NS Invoice flow once unblocked.
⚠ Same gap as E-Rate: customer ID mapping + NS service item ID needed
🔴 Active Gaps — Need Resolution
No automated monday → NS invoice creation
High
vtg-billing-ready fires but finance still creates the NS invoice manually. vtg-ns-mcp-sync has auth live and the invoice flow coded — needs to be wired to the Ready for Invoicing stage-change webhook. Blocked by: customer ID mapping (vtg-ns-compare paused) + NS service item internal ID from Kevin/Cari.
vtg-ns-mcp-sync · Ready to Invoice → NS Invoice flow
CPQ / quoting path not decided or stable
High
Two paths in play: CW Sell (vtg-monday-cpq, fire-and-forget not consistently triggering, line items not built) vs. direct NS (vtg-ns-mcp-sync Bid Win → Sales Order). Decision needed to avoid building dead-end automation. Recommend: decide, then either fix vtg-monday-cpq or formally deprecate it.
vtg-monday-cpq · vtg-ns-mcp-sync · vtg-cs-form (fire-and-forget)
vtg-sf-account-sync: SF Account ID write-back needs verification at scale
Low
Backfill.mjs ran against 791 accounts. UID column (text_mm6s8adk) should now be populated on all Accounts board items. Verify spot-check that SF Account IDs are correctly written back and that no items were skipped due to MONDAY_TOKEN auth issues (backfill.mjs requires MONDAY_TOKEN env var set explicitly before running).
vtg-sf-account-sync · backfill.mjs · Accounts board text_mm6s8adk
vtg-monday-cpq fire-and-forget not reliable
High
vtg-cs-form's server-side call to vtg-monday-cpq is not consistently triggering — likely caused by CF dashboard paste deployment. CPQ quotes not being reliably created. Fix: redeploy vtg-monday-cpq via wrangler CLI. Only relevant if Path A (CPQ) is chosen.
vtg-monday-cpq · vtg-cs-form
CPQ line items not populated from SOV
Medium
vtg-monday-cpq creates the quote shell only. SOV Builder KV payload already has vendorPOs pre-grouped by vendor — the line item POST calls to CW Sell are just not built yet. Only relevant if CPQ path is kept.
vtg-monday-cpq · SOV_FORMS KV · CW POST /quotes/{id}/lineitems
Deal reg still manual (Ruckus)
Medium
dealreg.py is built and field-mapped but not live. Ruckus portal dynamic elements are causing Playwright failures. Branden still submitting manually. Needs targeted debugging of the Ruckus portal form flow.
dealreg.py · Playwright
E-Rate Deals status has no defined owner or automation
High
The E-Rate Deals board (18406412794) status (Pipeline → Submitted → Awarded → Booked) drives creation of the E-Rate Projects item and stamps the Booking Date. No one is consistently updating it and there's no automation to advance it. If Awarded is never set, the E-Rate Projects item is never created.
E-Rate Deals board · automation 7917669964 (blocked by this)
"Create Contract in CW Sell" subitem is a dead task
High
Automation 482374746 creates a "Create Contract in ConnectWise Sell for order processing" subitem on every Post-Sale bid. It's unassigned, marked N/A, and has no owner — a dead task while CPQ direction is unresolved. Should be either removed, reassigned to NS, or left as a reminder pending the CPQ/NS decision.
automation 482374746 · Bids #3 subitem board 18176633598
vtg-materials-log copper SKUs not loaded
Medium
81 fiber SKUs (F- prefix) loaded. Copper SKUs (C- prefix) pending from Mark. No Worker changes needed — provide the CSV to import-catalog.mjs and push to SKU_CATALOG KV.
vtg-materials-log · import-catalog.mjs · SKU_CATALOG KV
customworkflow42 not in NS production
Medium
Item receipt email workflow is fully built and tested in NS sandbox. Not deployed to production. Nobody gets an automated notification when product arrives. Needs Joe Trecokas / Cari to deploy.
NetSuite · customworkflow42
vtg-ns-compare paused post sandbox refresh
Low
Customer name reconciliation Worker is coded. NS sandbox refresh wiped the integration config. Needs: new EC cert, new CLIENT_ID, recreate integration record "VTG Monday Sync", re-embed key. This also unblocks vtg-ns-mcp-sync invoice flow.
vtg-ns-compare · NS OAuth 2.0 M2M
vtg-scopestack-doc-sync: multiple button clicks create duplicate SOW docs
Medium
Each click of the Generate SOW button on Bids #3 triggers a new ScopeStack document generation — no idempotency or deduplication logic yet. A rep clicking twice creates two documents in ScopeStack. Fix: write a KV lock key on first /generate call per item, clear after webhook confirms delivery.
vtg-scopestack-doc-sync · /generate endpoint · KV lock needed
DKIM not configured for vtgus.com
Low
All Workers send via SMTP2GO / noreply@vtgus.com. DKIM not set up — deliverability risk on billing notifications, CSOP emails, bond emails as volume grows.
SMTP2GO · vtgus.com DNS
🟣 Planned / Not Yet Started
SharePoint folder auto-creation on bid stage
Low
vtg-sp-folders scoped but not built. Would create per-client SharePoint folders in ERATE-Projects on bid stage change.
vtg-sp-folders · SharePoint ERATE-Projects list
TD Synnex P&A API — Resolved
Resolved
✅ Resolved Sep 3 2026. vtg-tdsynnex Worker deployed with OAuth 2.0 client credentials, TOKEN_CACHE KV, live pricing integrated into vtg-sov-builder with LIVE badges, markup on contracted cost, and category filter bar.
vtg-tdsynnex · vtg-sov-builder env binding
Cloudflare Access + Azure AD for portal
Low
vtg-portal admin route is password-gated. Cloudflare Access + Azure AD Entra ID SSO scoped but on hold pending IT. Also needs monday.com plan upgrade for Azure AD SSO on CRM side.
vtg-portal · Cloudflare Access · Azure AD
🟢 Live Workers
vtg-bid-intake
vtg-bid-intake.vectorfi-admin.workers.dev
Live
Triggered when a rep clicks accept_470 on the El Nova Leads board. Opens the intake form in a new browser tab. Rep fills: Sales Executive, ScopeStack Blueprint(s), delivery method, partner, manufacturer, distributor, bid due date, bond required — all in one form. Blueprint selection triggers ScopeStack API to auto-create a proposal. On submit: patches all bid columns to Bids #3, auto-links Account and Contact via district name search, writes the SOV Builder link to link_mm591mdg, and creates a bond subitem + email if required. Patched Sep 3 2026: fixed Account/Contact lookup (items_page + contains_text — previously used unreliable items_by_multiple_column_values), fixed SOV Builder link not being written, bond section redesigned (Surety bond read-only), retries bumped 3→4.
Triggeraccept_470 → Status → Accepted → monday webhook 608965294
OutputsBids #3 item, Account/Contact linked, SOV Builder link written, ScopeStack proposal created, bond subitem + email (if needed)
Bug fixSep 3 2026 — Account/Contact lookup API call replaced; SOV link write added; bond type locked to Surety bond
Emailbonds@vtgus.com + CHC-Surety@alliant.com (bond only)
FilesVTG Flows tg-bid-intake\
vtg-sov-builder
vtg-sov-builder.vectorfi-admin.workers.dev
Live
Excel-like Scope of Value (SOV) quoting tool for the sales team. Opened from a link column on Bids #3 with ?item={monday_item_id}. Supports multi-tab buildings, ADD-ALTS tab, Summary tab, section type picker (Wired/Wireless/Firewall/UPS/Cable/MIBS/Fiber/Other), SKU dropdown, per-row labor, markup overrides, and bond toggle. Save & Submit generates a jsPDF SOV PDF and uploads it to the Bids #3 Files column. Saved payload includes a vendorPOs array pre-grouped by vendor — ready for future NetSuite PO creation.
TriggerManual — rep opens from Bids #3 link column (link_mm591mdg)
KVSOV_FORMS (7a5b99d8bc134fd6959cc481752ede56) · SKU_CATALOG (17083b01a7524801a236dd4a71f50164) · TOKEN_CACHE via vtg-tdsynnex
Live pricingTD Synnex contracted prices fetched in background via vtg-tdsynnex service binding; LIVE badge shown; markup applied on top of contracted cost
Category filterFilter bar (All / Switches / Wireless / Transceivers / Cables / Licensing / Accessories / Labor) narrows SKU dropdown per section
Admin UI/admin/skus — vendor cards, browse/filter SKUs, add single SKU, JSON upload, wrangler push commands; N1C UPS (62 SKUs) + Ruckus catalogs loaded
OutputsSOV PDF → Bids #3 Files column + thread update; SOV Builder link stamped to new link_mm6vbks column
FilesVTG Flows tg-sov-builder\ · worker-combined.js
vtg-cs-form
vectorfi-admin.workers.dev
Live
Fires when a Bids #3 item enters Post-Sale stage (webhooks 562741747 + 483153616). Generates a CS Order Processing (CSOP) PDF and emails it to erateops@vtgus.com (CC: sales@vtgus.com). Uses KV-based deduplication to prevent double-fires. Also fires a server-side call to vtg-monday-cpq (unreliable — see gap). Creates a monday subitem as a checklist task.
TriggerBids #3 stage → Post-Sale (webhooks 562741747 + 483153616)
Emailerateops@vtgus.com · CC: sales@vtgus.com via SMTP2GO
GapFire-and-forget call to vtg-monday-cpq not consistently triggering
vtg-monday-sf-sync
vectorfi-admin.workers.dev
Live — Aug 13 2026
Syncs every Bids #3 stage change to Salesforce as an Opportunity upsert. Uses Monday_Item_ID__c as the external ID for idempotent creates/updates. Runs on any change to deal_stage, deal_value, or deal_creation_date. SF token cached in KV. Stage map: Folder Creation→1, Deal Reg→2, Bid Building→3, Bid Compilation→4, Bid Submittal→5, Awaiting Results→6.
TriggerBids #3 stage / value / date change → webhook
AuthSF Client Credentials OAuth · integration@vtgus.com.prod · VTG Integration Permissions permission set
KVSF_TOKEN_KV (afcf72c9f5ed44ff97adced0f714ad93) · key: sf_token
FilesVTG Flows\worker.js + wrangler.toml
vtg-po-sync
vectorfi-admin.workers.dev
Live — Aug 25 2026
Syncs NetSuite PO numbers and approval status back to the Projects #4 board. Runs on a webhook triggered by changes to the NS Sales Order # column, plus a cron every 4 hours as a safety net. Writes "Customer PO #" (text) and "PO Status" (status) columns to the Projects #4 item.
TriggerNS SO# column change webhook + cron every 4h
KVPO_SYNC_KV (2c487e21b1324f5b8dbfc754db7b2622)
OutputsProjects #4: Customer PO # (text) + PO Status (status) columns
FilesVTG Flows tg-po-sync\
vtg-materials-log
vtg-materials-log.vectorfi-admin.workers.dev
Live — Aug 27 2026
Cabling materials accounting tool for Projects #4. PM opens via a link column on a Projects #4 item (auto-populated when stage → Installing by automation 7922447604). PM selects fiber/copper parts and quantities from the SKU catalog and submits once — locked after. On submit: saves log to KV, advances stage to Ready for Invoicing, writes link back, posts thread update, and sends billing notification email.
TriggerManual — PM opens from Projects #4 link column (link_mm6mhdcx)
KVMATERIALS_LOG (7694ae82ef4540799e64aa3ade3ad10e) · SKU_CATALOG (17083b01a7524801a236dd4a71f50164, key: catalog:cabling)
Emaileratebilling@vtgus.com via SMTP2GO
GapCopper SKUs (C- prefix) not yet loaded — pending from Mark
FilesVTG Flows tg-materials-log\ · worker.js + import-catalog.mjs + backfill-links.mjs
vtg-billing-ready
vectorfi-admin.workers.dev
Live
Sends a billing notification email to finance when a Projects #4 item reaches the Ready for Invoicing stage. Triggered by monday.com stage-change automations (IDs: 7920569056, 7920172789, 7917999463, 7920230690). Stamps the Ready for Invoicing Date column (date_mm54qwps). Used by both E-Rate and Commercial tracks.
TriggerProjects #4 stage → Ready for Invoicing (4 monday automations)
Emaileratebilling@vtgus.com via SMTP2GO / noreply@vtgus.com
GapDKIM not configured for vtgus.com — deliverability risk
vtg-set-project-year
vectorfi-admin.workers.dev
Live
Sets the Project Year dropdown (dropdown_mkqz1ay) on Projects #4 items. Label mapping: 1 = 2024, 2 = 2025, 3 = 2026. Runs on new item creation in Projects #4.
TriggerProjects #4 new item creation
OutputsProject Year dropdown set on Projects #4 item
vtg-msp-csop
vectorfi-admin.workers.dev
Live
Handles commercial / non-E-Rate lead intake via the MSP portal CSOP form. Bypasses Bids #3 and El Nova entirely — creates a Projects #4 item directly with a task list (subitems) auto-built from the CSOP form fields. The task list serves as the project scope and work order from day one.
TriggerMSP portal CSOP form submission
OutputsProjects #4 item + task list subitems
NoteCommercial track only — no Accounts/Contacts created
vtg-account-logo
vectorfi-admin.workers.dev
Live
Scrapes the district website for a logo, falls back to Clearbit, and uploads to the Account logo file column. Sets logo_status to Logo Found / Needs Manual Logo / No Website. Triggered on Account creation. Companion script vtg-logo-backfill (backfill.mjs) ran against all 786 existing Accounts.
Triggermonday.com automation on Account creation
Outputslogo (file column) + logo_status (status column) on Accounts #1
vtg-ns-so-backfill
vectorfi-admin.workers.dev
Live
Backfills NetSuite Sales Order numbers into the NS SO# column (text_mm6hv20b) on existing Projects #4 items. One-time utility Worker used to populate historical records.
Target boardProjects #4 (18176626554) · column: text_mm6hv20b
FilesVTG Flows tg-ns-so-backfill\
vtg-portal
vtg-portal.vectorfi-admin.workers.dev
Live
Internal staff portal with sections for Tools (sales/finance/field/admin), Docs (replacing OneNote), and Admin. Admin route is password-gated temporarily until Cloudflare Access + Azure AD is configured. GitHub repo vtg-portal/vtg-portal (private) — config/tools.json is source of truth for tool entries. Docs backed by GitHub markdown files.
Plannedtools.vtgus.com CNAME + Cloudflare Access + Azure AD SSO
FilesGitHub: vtg-portal/vtg-portal
vtg-tdsynnex
vtg-tdsynnex.vectorfi-admin.workers.dev
Live — Sep 3 2026
TD Synnex Partner API integration. Authenticates via OAuth 2.0 client credentials against sso.us.tdsynnex.com, caches the token in KV with auto-refresh, and exposes a /api/lookup?pn=PARTNUMBER endpoint. Handles both numeric part numbers (synnexSKU) and alphanumeric (mfgPN). Falls back to SKU_CATALOG KV for VTG-specific items (labor, Cloudpath). Called internally by vtg-sov-builder via a [[services]] binding — never exposed directly to the browser. Key bug fixed at build: TD Synnex returns HTTP 200 with status: "Not found" for unknown SKUs (not a 404), requiring an explicit status-string check to trigger the KV fallback.
TriggerInternal service binding from vtg-sov-builder /api/price endpoint
AuthOAuth 2.0 client credentials · sso.us.tdsynnex.com · secrets: TDSYNNEX_CLIENT_ID + TDSYNNEX_CLIENT_SECRET (never in files)
KVTOKEN_CACHE (8f111c8118014937b77d42c62c521fe9) · TTL = expires_in − 60s
FallbackSKU_CATALOG KV for labor rates, Cloudpath, and any non-TD Synnex items
Health/health endpoint shows token cache state
AccountTD Synnex account #132973
vtg-sf-account-sync
vtg-sf-account-sync.vectorfi-admin.workers.dev
Live — Sep 8 2026
Syncs monday.com Accounts (#1) and Contacts (#2) to Salesforce as Account and Contact objects. Uses Monday_Item_ID__c as the external ID for idempotent upserts on both objects. After upserting, writes the Salesforce Account ID back to the UID column (text_mm6s8adk) on the Accounts board. A backfill script (backfill.mjs) ran against all 791 existing accounts to populate Salesforce and stamp the UID column. Complements vtg-monday-sf-sync which syncs Bids — this Worker handles the CRM Account/Contact layer.
Triggermonday.com webhook on Account/Contact creation or change
AuthSF Client Credentials OAuth · integration@vtgus.com.prod · VTG Integration Permissions permission set
KVSF_ACCOUNT_TOKEN_KV — token cache for SF OAuth
SF fieldsMonday_Item_ID__c (External ID, Text 20, Unique) on both Account and Contact objects
Write-backSF Account ID → Accounts board UID column (text_mm6s8adk)
Backfillbackfill.mjs ran against all 791 accounts — requires MONDAY_TOKEN env var set before running
FilesVTG Flows tg-sf-account-sync\ · worker.js + wrangler.toml + backfill.mjs
🟡 In Progress
vtg-scopestack-doc-sync
vtg-scopestack-doc-sync.vectorfi-admin.workers.dev
Live — Sep 8 2026
Two-endpoint Worker that fully automates ScopeStack SOW delivery into monday.com Bids #3. Endpoint 1 (POST /): catches ScopeStack document_status_changed webhook when a SOW finishes generating, downloads the .docx, and routes by template name — "ScopeStack eRate Template V2" uploads to Bids #3 SOW Document column (file_mm6wm4hn); anything else goes to El Nova Leads Customer Summary (file_mkw7hy4z). Endpoint 2 (POST /generate): triggered by a "Generate SOW" button click on a Bids #3 item — reads the 470# from the item, finds the matching ScopeStack project, and triggers programmatic SOW generation; the webhook then auto-delivers the doc. 470# extracted from filename or via project API lookup when filename is null.
Webhook triggerScopeStack Settings → Webhooks → Document Status Changed
Button triggerBids #3 Generate SOW button (button_mm70vvrb) → monday.com automation → POST /generate
TemplateScopeStack eRate Template V2 (ID: 5270) → Bids #3 file_mm6wm4hn; other templates → El Nova Leads file_mkw7hy4z
AuthScopeStack service account: worker-service@vtgus.com · Client ID: SH0E9m3bedl_efy_QWjXICH3… · slug: vector
New Bids #3 colsSOW Document (file_mm6wm4hn) · Generate SOW button (button_mm70vvrb)
ConfirmedFirst end-to-end delivery confirmed: North Branch Area Schools, 470# 260005778 — .docx uploaded to Bids #3 SOW Document column successfully
GapMultiple button clicks create multiple ScopeStack documents — idempotency/dedup not yet built
FutureAI executive summaries · vtg-sow-builder pricing sheet integration · blueprint → datasheet auto-selection
FilesVTG Flows tg-scopestack-doc-sync\
vtg-ns-mcp-sync
vtg-ns-mcp-sync.vectorfi-admin.workers.dev
In Progress
Bidirectional monday.com ↔ NetSuite sync. Auth is live in production as of Aug 13 2026. Six flows coded: (1) Bid Win → NS Sales Order, (2) Ready to Invoice → NS Invoice, (3) NS Invoice Paid → monday Closed, (4) NS SO Created → monday SO#, (5) NS PO → monday PO#, (6) NS Customer → monday Account. Cron every 15 min + webhook triggers. Blocked on customer ID mapping (vtg-ns-compare paused) and NS service item internal ID.
AuthOAuth 2.0 M2M · CLIENT_ID: d7bb3d03… · Cert ID: _Xm9jPsUb1H7DX…
CronEvery 15 min + webhook on stage changes
Blocked byvtg-ns-compare paused (customer ID mapping) + NS service item ID from Kevin/Cari
FilesVTG Flows tg-ns-mcp-sync\ · wrangler.toml + worker.js
vtg-monday-cpq
vectorfi-admin.workers.dev
Partially Live
Creates a ConnectWise Sell (CPQ) quote by cloning the E-Rate Contract template (ID: c0f2a401…) and patching customer and project details. Quote # and CPQ Status are written back to Bids #3. Fired by vtg-cs-form as a server-side call. Direction uncertain — may be replaced by direct NetSuite quoting (vtg-ns-mcp-sync Bid Win → Sales Order flow).
TriggerFire-and-forget call from vtg-cs-form on Post-Sale
GapCall not consistently triggering — needs wrangler redeploy; line items from SOV KV not yet built
DecisionCPQ path vs. direct NS path unresolved — avoid further investment until decided
dealreg.py
Playwright script (not a CF Worker)
In Progress
Playwright automation to submit deal registrations to manufacturer portals (Ruckus, Cisco, etc.) directly from Bids #3 field data. Field map is built. Dynamic portal elements on the Ruckus form are causing failures — Branden is still submitting manually.
TriggerBids #3 stage → Deal Reg
GapRuckus portal dynamic element handling not resolved
🔵 Planned / Scaffolded
vtg-ns-compare
vectorfi-admin.workers.dev
Paused
NetSuite ↔ monday.com customer name reconciliation. Code complete. Paused because a NetSuite sandbox refresh will wipe the integration config. Needs: new EC cert, new CLIENT_ID, recreate "VTG Monday Sync" integration record, re-embed key. Unblocking this also unblocks vtg-ns-mcp-sync invoice flow (customer ID mapping dependency).
AuthOAuth 2.0 M2M · EC P-256 · SuiteQL customer query
Blocked byNS sandbox refresh — all integration config will be wiped
vtg-sp-folders
vectorfi-admin.workers.dev
Planned
Would auto-create per-client SharePoint folders in the ERATE-Projects list (vtgus.sharepoint.com/sites/cust_<ClientName>) on bid stage change. Not yet built.
TriggerBids #3 stage change
vtg-tdsynnex
env binding in vtg-sov-builder
Planned
TD Synnex Price & Availability API integration. Binding declared in vtg-sov-builder but not built. Would pull live pricing into SOV rows automatically. Needs Client Secret from TD Synnex Developer Portal (account #132973).
DependencyTD Synnex Client Secret — admin credentials needed
vtg-cw-sync
vectorfi-admin.workers.dev
Scaffolded
ConnectWise Sell sync Worker. Scaffolded — pending API credentials from Josh. May be superseded if CPQ is phased out in favor of direct NetSuite quoting.
Blocked byAPI credentials from Josh + CPQ/NS direction decision
vsz-lldp-neighbors.py
Local Python script (not a Cloudflare Worker)
Live — Sep 4 2026
Local Python script that SSHes into a Ruckus SmartZone controller and runs LLDP neighbor discovery across all APs in a selected zone. Queries all APs via SmartZone REST API, runs remote ap-cli <MAC> "get lldp neighbors" on each via SSH, parses output to extract switch hostname, port, chassis MAC, and management IP, displays as a formatted console table, exports to a timestamped CSV, and optionally writes LLDP data back to each AP's description field via controller CLI. Built to run locally because remote sites lack public-facing IPs on the controller. Uses prompt-based SSH waiting (_wait_for()) rather than blind sleeps. Added to VTG portal as tool #23.
RuntimeLocal Python — requires SSH access to SmartZone controller
AuthSmartZone SSH credentials + separate enable password + REST API credentials entered at runtime
Pagination fixFetches all APs with no zone filter using start/limit as URL query params, then filters client-side by zoneId
Write-backAP description field updated via controller CLI (config → ap <MAC> → description → exit); REST API PATCH returns 403
Portalvtg-portal tool #23 — listed as local script with GitHub repo link
📋 E-Rate Program Terms
E-Rate E-Rate
The Schools and Libraries Program of the Universal Service Fund, administered by USAC. Provides funding to eligible schools and libraries for broadband connectivity, networking equipment, and related services. VTG's primary government funding vertical (VTG-06).
USAC USAC
Universal Service Administrative Company. The non-profit that administers the E-Rate program on behalf of the FCC. USAC issues funding decisions, maintains the EPC portal, and processes reimbursements.
Form 470 470
The Description of Services Requested and Certification Form. Filed by a school or library to announce they are seeking competitive bids for E-Rate eligible services. VTG discovers these via El Nova and responds with a Form 471. The 470# is the unique identifier for each opportunity.
Form 471 471
The Services Ordered and Certification Form. Filed by the applicant (school/library) after selecting a vendor. It requests the actual E-Rate funding and references a specific 470. VTG helps applicants file the 471 after a bid is awarded.
FCDL FCDL
Funding Commitment Decision Letter. Issued by USAC to notify applicants whether their funding request has been approved, denied, or modified. Receiving an FCDL for an approved bid is the trigger for moving a Bids #3 item to Post-Sale and beginning project execution.
FRN FRN
Funding Request Number. A unique identifier assigned by USAC to each funding request within a Form 471. Tracked on the E-Rate Deals board as a reference for reporting and reimbursement.
EPC EPC
E-Rate Productivity Center. USAC's online portal where applicants and service providers submit forms, manage applications, and track funding status. Dylan submits bids here during the Bid Submittal stage.
SPI SPI
Service Provider Invoice. One of two E-Rate payment methods. Under SPI, the service provider (VTG) invoices USAC directly for the E-Rate-funded portion, and separately invoices the customer for their co-pay. VTG then gets paid by both parties. Contrast with BEAR.
BEAR BEAR
Billed Entity Applicant Reimbursement. The alternative E-Rate payment method. Under BEAR, the customer pays VTG the full invoice amount upfront, then files a BEAR form with USAC to be reimbursed for the E-Rate-funded portion. VTG signs off on the BEAR. Post-Sale subitems are marked N/A for BEAR bids where SPI-specific tasks don't apply.
Funding Year FY
E-Rate funding is allocated in annual cycles running July 1 – June 30. A project funded in FY2025 covers July 2025–June 2026. VTG tracks funding year on both the E-Rate Deals board and the E-Rate Historical Awards board (FY2017–FY2025 imported).
Co-pay / Non-discounted Share
The portion of the project cost the customer pays themselves. E-Rate covers a discount percentage (based on poverty level and urban/rural status); the customer's co-pay is the remainder. Affects bid pricing and SOV structure.
LOI LOI
Letter of Intent. A signed document from the customer confirming they intend to proceed with VTG as their vendor post-award. Collected in Post-Sale and uploaded to SharePoint. First subitem in the Post-Sale checklist (assigned to Jon).
PO PO
Purchase Order. Issued by the customer authorizing VTG to proceed with the project and invoice for services. PO issuance and upload to SharePoint is a Post-Sale subitem (Alan/Jake). PO numbers are synced from NetSuite to Projects #4 via vtg-po-sync.
🏗️ VTG Process & Board Terms
SOV SOV
Schedule of Values. The itemized pricing document submitted with a bid, listing every line item (equipment, labor, cabling, etc.) with quantities, unit costs, and extended costs. Built using the vtg-sov-builder Worker. Required for bid submittal and Post-Sale SOV reconciliation.
SOW SOW
Statement of Work. Describes the scope of services VTG will perform — installation, configuration, testing, etc. Paired with the SOV in the bid package. Created during Bid Building by the sales rep.
BOM BOM
Bill of Materials. A detailed list of hardware components required for a project, used for deal registration with manufacturers. Created by the sales rep as a Deal Reg subitem task when the bid is hardware-based.
CSOP CSOP
Customer Service Order Processing form. Generated automatically by vtg-cs-form when a bid moves to Post-Sale. Emailed to erateops@vtgus.com to initiate the order processing workflow.
Deal Reg DR
Deal Registration. The process of registering a sales opportunity with a manufacturer (e.g. Ruckus, Cisco) to protect pricing and partner status. Handled by Branden; being automated via dealreg.py. Registration # is tracked in Bids #3.
Disty
Short for Distributor. The wholesale distribution partner VTG purchases equipment through (TD Synnex, Ingram Micro, N1C, WAV, etc.). Selected during bid intake; appears on the SOV vendor column and drives PO routing.
Post-Monday
The final stage in Bids #3 after a project has been handed off to delivery. Indicates a Projects #4 item exists and the E-Rate Operating System has been notified (via automation 559103546 → E-Rate Deals board). The bid stays in Post-Monday as a permanent reference; all active work moves to Projects #4 and the E-Rate Op System.
Wins Archive
A Bids #3 group for historical won bids. Items are moved here (with a completion update) when stage → Wins Archive. Separate from Post-Monday — Wins Archive is for fully closed/billed historical records; Post-Monday is for active post-award projects.
You're Up!
A subitem status label in Bids #3. When set, triggers a monday.com automation (482374707) that sends a notification to the task assignee: "You're Up! [task] is due [date] for [bid name]. You're not waiting on anyone." Used to signal sequential handoffs in the bid task checklist.
Bid Stage Subitem
A status column on Bids #3 subitems that tags each task with the bid stage it belongs to (Folder Creation / Deal Reg / Bid Building / etc.). All 23+ tasks are created on new item creation and tagged from day one — the tag indicates when in the lifecycle each task should be worked, not when it was created.
SPI / BEAR Subitem (N/A)
Several Post-Sale subitems are conditionally applicable depending on payment method. For BEAR bids, tasks related to FCDL filing and SPI invoicing are marked N/A — this triggers the N/A automation (482374711) which clears the assignee and due date, effectively removing the task from the active queue.
UID (Salesforce Account ID)
The Salesforce Account ID written back to the monday.com Accounts board UID column (text_mm6s8adk) by the vtg-sf-account-sync Worker after a successful Account upsert. Serves as the permanent cross-system identifier linking a monday.com Account record to its Salesforce counterpart. The external ID field Monday_Item_ID__c on the SF Account object is the join key used for idempotent upserts — UID is what comes back.
Ready for Invoicing Date RFID
The date column (date_mm54qwps) on Projects #4 automatically stamped when a project reaches Ready for Invoicing stage. Used to populate the Forecast vs. Actual Revenue dashboard and feed the billing notification email to finance.
⚙️ Technical & Integration Terms
Cloudflare Worker
VTG's primary middleware layer. Serverless JavaScript functions deployed at the edge via Cloudflare. All Workers live under vectorfi-admin.workers.dev. Deployed via wrangler deploy from Command Prompt (not PowerShell — blocked by Norton). Source files at OneDrive\VTG Flows\<worker-name>\.
KV Store KV
Cloudflare Workers KV — a global key-value store used by Workers for persistent data: form state (SOV_FORMS), SKU catalogs (SKU_CATALOG), materials logs (MATERIALS_LOG), PO sync state (PO_SYNC_KV), Salesforce token cache (SF_TOKEN_KV). KV reads are eventually consistent globally; writes propagate within seconds.
Webhook
An HTTP POST sent by monday.com to a Worker URL when a specific event occurs (status change, item creation, etc.). monday.com webhooks must be registered in Integrations before being available as Automation actions. VTG uses webhooks to trigger all real-time Worker flows.
SMTP2GO
VTG's email relay service. All Worker-sent emails go through SMTP2GO using the noreply@vtgus.com sender address. Used for CSOP emails, billing notifications, bond emails, and task notifications. DKIM for vtgus.com is not yet configured — deliverability risk.
OAuth 2.0 M2M M2M
Machine-to-Machine OAuth flow used for NetSuite integration. Uses EC P-256 JWT client credentials (no user login). VTG generates an EC cert/key pair, uploads the cert to NetSuite, and embeds the private key in the Cloudflare Worker secret. Token endpoint: https://{accountId}.suitetalk.api.netsuite.com/…/oauth2/v1/token.
SuiteQL
NetSuite's SQL-like query language for reading data via the REST API. Used by vtg-ns-compare and vtg-ns-mcp-sync to query customers, sales orders, and invoices. Requires SuiteAnalytics Workbook to be enabled at the account level AND in the API role's Reports subtab.
Mirror Column
A monday.com column type that displays a value from a connected board without duplicating data. VTG uses mirrors extensively: Bids #3 mirrors Account region, Project Stage from Projects #4, and Blueprint name from El Nova Leads. E-Rate Projects mirrors most of its data from Bids #3 and E-Rate Deals.
El Nova
VTG's E-Rate opportunity discovery and lead management platform. Monitors USAC for new Form 470 filings and pushes them to the monday.com El Nova Leads board. Also creates Account and Contact records with dedup logic. VTG's accept/reject actions are sent back to El Nova, which creates the Accepted Monitor board item on accept.
ScopeStack
A scoping and proposal platform. Reps select Blueprints (pre-built scope templates) during the El Nova lead review — before clicking accept_470. Blueprint selection triggers the ScopeStack API to auto-create a proposal. The proposal stays in ScopeStack and is pulled manually when needed downstream (e.g. for bid building or quoting).
Wrangler
Cloudflare's CLI tool for deploying and managing Workers. Used to deploy all vtg-* Workers (wrangler deploy), manage KV keys (wrangler kv key put/get/delete), and set secrets (wrangler secret put). Must be run from Command Prompt (not PowerShell — blocked by Norton AV).
jsPDF
A JavaScript library for generating PDF files in the browser or in a Worker. Used by vtg-bid-intake (intake form + Alliant bond form) and vtg-sov-builder (SOV PDF). PDFs are generated client-side and either downloaded or uploaded to monday.com via the Files column API.
TD Synnex TDSYNNEX
VTG's primary hardware distributor and Partner API integration. The vtg-tdsynnex Worker connects to the TD Synnex Partner API via OAuth 2.0 to pull live contracted pricing into the SOV Builder. Account #132973. Contracted prices (not list prices) are fetched per SKU and displayed with a green LIVE badge in the SOV tool. Fallback to SKU_CATALOG KV for non-TD Synnex items (labor, Cloudpath).
SKU Catalog Admin /admin/skus
A browser-based admin UI built into the vtg-sov-builder Worker at /admin/skus. Lets Jon manage the product catalog without touching code or running wrangler commands: browse all vendor SKUs, add individual parts, upload JSON catalog files, and see the wrangler CLI commands for bulk pushes. Vendor catalogs loaded: Ruckus switches/APs, N1C UPS (62 SKUs at 2026-27 Platinum pricing), VTG cabling (shared with Materials Log).
monday.com File Upload (multipart spec)
Uploading files to monday.com requires the GraphQL multipart spec with exactly four form fields: query (the GraphQL mutation), variables (JSON with {"file": null}), map (JSON with {"0": ["variables.file"]}), and the file itself as field "0". The simpler variables[file] form-append approach silently returns a 200 OK but does not actually persist the file. Endpoint: https://api.monday.com/v2/file (not the standard /v2 endpoint). Used by vtg-scopestack-doc-sync to attach SOW .docx files to board items.
Idempotent
An operation that produces the same result no matter how many times it runs. VTG Workers use idempotency to prevent double-fires: vtg-cs-form checks a KV key before creating the CSOP, vtg-materials-log sets a lock key (materials_lock:{item_id}) after first submission. Critical for webhook-triggered Workers that may fire more than once.
🏢 Accounts — #1
ID: 18176632844
2 automations · 0 workflows
IDTriggerActionNotes
615242921 When an item is created Send a webhook Fires vtg-account-logo Worker on Account creation to scrape + upload district logo
615244207 When column text_mkxpgyv6 (website URL) changes Send a webhook Re-triggers logo fetch when El Nova website URL is updated on an existing Account
SF sync webhook When Account created or updated Send webhook → vtg-sf-account-sync LIVE Sep 8 2026 — upserts Account + Contact to Salesforce via Monday_Item_ID__c external ID; writes SF Account ID back to UID column (text_mm6s8adk)
👥 Contacts — #2
ID: 18176633260
0 automations · 0 workflows
No automations. Contact records are created and managed entirely by El Nova — no monday-native automation is needed.
⚡ El Nova Leads Board
ID: 18181651809
11 legacy + 1 workflow automations
IDTriggerActionNotes
7920733007 When "Accept 470" button clicked Set Status column (color_mm599ptd) → Accepted The first step in the accept chain — status change then triggers the webhook below
608965294 When Status → Accepted (color_mm599ptd) Send webhook Fires vtg-bid-intake Worker to create the Bids #3 item; also sends El Nova accept trigger
615218876 / 615223909 When "Accept 470" button (button_mkw37e4e) changes Send webhook (×2) El Nova integration webhooks registered via API (source: API, app 1573784) — El Nova listens for these to update its own system on accept
617748761 When file column (file_mkw7hy4z) changes Send webhook Fires when a USAC PDF or addendum is uploaded — used by the Opportunity Score extraction Worker (CAM Leads)
490861922 When "Accept 470" button clicked Move item to group (Accepted group) Austin's original El Nova automation — physically moves the lead item to the Accepted group on the board
490862005 When "Reject 470" button clicked Move item to Rejected group Routes rejected leads off the active list — rejected leads do NOT go to Accepted Monitor
493350968 / 493351900 / 493355183 / 493355373 When addendum file column changes + item is in specific group Move item to group + notify assigned person Four automations covering two file columns × two group contexts — notifies the assigned sales person: "New addendum for {District} - 470#: {name}"
566810401 / 566810403 When item created / When item name changes AI: extract "470 #" from item name → text_mm2f36c column monday AI automation — parses the 470# out of the lead item name and writes it to a dedicated text column for downstream useAI
ScopeStack webhook (Sep 8)ScopeStack document_status_changed (status=finished, type=sow)Download .docx → upload to Bids #3 file_mm6wm4hn or El Nova Leads file_mkw7hy4zvtg-scopestack-doc-sync · LIVE Sep 8 2026
🏆 Bids — #3
ID: 18176633000 · Subitem board: 18176633598
37 legacy + 2 workflows · 3 integrations
📋 Planned: Blueprints column to be added to Bids #3 for projects that originate directly on the board (not via El Nova) — will enable Generate SOW button to work without a Leads board blueprint selection.
IDTriggerActionNotes
482374702New item createdSet Bid Creation Date (deal_creation_date) to todayTimestamps every new bid automatically
482374703New item createdSet Bid Stage → Folder CreationAll new bids start at stage Folder Creation (index 15)
482374765New item createdCreate 23 subitems (full bid lifecycle task list)The backbone of the bid task system — creates all tasks from Folder Creation through Awaiting Results in one shot, each pre-tagged by stage and pre-dated from Bid Due Date
483152942New item createdMirror Bid Due Date to subitem "Bid Due Date Mirror" columnKeeps subitem task due date formula in sync from the parent bid due date
483296416New item createdRefresh Bid Name Formula column (formula_mkwrhcw)Forces the formula "District - 470#: XXXXXXXXX" to populate on creation
482374704Stage → Deal RegCreate linked item on Deal Reg board (18176632827)Auto-creates the Deal Reg record when stage changes; links back via connect_boards1 relation
482374714Stage → Deal RegMove item to Deal Reg groupGroup = physical location of the item in the board view
482374721Stage → Bid BuildingMove item to Bid Building group
482374719Stage → Bid CompilationMove item to Bid Compilation group
482374720Stage → Bid SubmittalMove item to Bid Submittal group
482374739Stage → Awaiting ResultsMove item to Awaiting Results group
482374746Stage → Post-SaleCreate 6 Post-Sale subitems + move to Post-Sale groupLOI, CW contract (dead task), FCDL/SPI tasks, PO, SOV update
482374740Stage → Post-MondayMove item to Post-Monday group
559103546Item enters Post-Monday groupCreate item on E-Rate Deals board (18406412794)The active Post-Monday handoff — replaces the inactive 482374713 (Projects #4) and 482374738 (CS/PM notification)
482374717Stage → Wins ArchivePost completion update + move to Wins Archive groupMessage: "This Bid has been completed and billed in full! Congrats! Bid Creation Date: {date} Bid Close Date: {date}"
482374723Stage → LostPost update + move to Lost group + rename itemMessage: "This Bid was lost. Please update all attached Boards, and fill in final amounts and results."
562741747Stage → Post-Sale (status index 12)Send webhook to vtg-cs-formOne of two vtg-cs-form webhook triggers
483153616Stage → Post-Sale (secondary trigger)Send webhook to vtg-cs-formRedundant webhook for vtg-cs-form reliability
482374706Subitem status → ARCHIVEArchive the subitemManual archive — hides completed/irrelevant tasks from the active subitem view
482374707Subitem status → You're Up!Notify assignee"You're Up! {task} is due {date} for {bid name}. You're not waiting on anyone."
482374711Subitem status → N/AClear assignee, due date, and Bid Stage SubitemEffectively removes the task from the active queue; used for inapplicable BEAR/SPI tasks
482374715Subitem due date set + Sales Rep = JakeAuto-assign Jake to subitemWatches deal_owner column — assigns Jake (92155649) to his subitems automatically
482374716Subitem due date set + Sales Rep = AlanAuto-assign Alan to subitemWatches deal_owner column — assigns Alan (92155651) to his subitems automatically
482374722Subitem due date = today (noon ET)Notify subitem assignee"Task due today: {task} is due {date} for {bid name}"
482374728 / 482374735 / 482374751Subitem due date = today (11am ET) + not completeSet parent status (Jake/Alan/Dylan Subitem Status) → Due TodayThree automations, one per person — highlights bids that need same-day attention on the parent item view
482374745 / 482374748 / 482374755Subitem status → Complete + assignee = Dylan/Alan/JakeClear parent Subitem Status column (remove Due Today)Clears the parent highlight once the person's task is done
482374724InactiveBid Due Date - 5 daysNotify assigned reps"Bid due in 5 days: {bid name} is due {date}. Delivery Method: {method}"
482374730InactiveSubitem due date + 3 days (overdue)Notify subitem assignee3-day overdue task reminder — currently off
482374713InactiveItem enters Post-Monday groupCreate item on Projects #4 + link via connect_boards6Replaced by 559103546 (E-Rate Deals creation). Left inactive as reference.
482374738InactiveStage → Post-MondayNotify CS/PM team"Hello CS and PM, this project now has a PO and is ready for processing." Replaced by E-Rate Deals flow.
7917794784 (workflow)When Bid Stage status changes to somethingCreate a subitemGeneral-purpose workflow used to add subitems on specific stage transitions beyond the initial 23-task creation
7917866595 (workflow)When subitem column changesChange parent item Bid Stage column to matchKeeps parent Bid Stage in sync when a subitem's Bid Stage Subitem column is manually changed
566854668 / 566856009 / 566856718 (integrations)Blueprint column → Wireless/Fiber Optic/BMICOverwrite item with matching item templateThree project-type templates applied when Blueprint is set on Bids #3 itemsApp
545905802 / 545905803 (AI)New item created / Item name changesAI: extract "470#:" from item name → text_mkqz3hwwmonday AI extraction automationAI
578063979 / 578063986 (AI)Item created (if Project Year empty) / text_mkqz3hww changesAI: categorize into Project Year dropdown (dropdown_mkqz1ay)Sets Project Year dropdown by AI-categorizing the 470# text columnAI
591750313Stage → Ready for Invoicing (lead_status index 3)Send webhook to vtg-billing-readyTriggers billing notification email to eratebilling@vtgus.com
628087115NS Sales Order # column (text_mm6hv20b) changesSend webhook to vtg-po-syncLive Aug 25 2026 — triggers PO sync back from NetSuite
Generate SOW button (Sep 8)Generate SOW button (button_mm70vvrb) clicked on Bids #3 itemSend webhook to vtg-scopestack-doc-sync /generate endpointTriggers programmatic SOW generation in ScopeStack; webhook auto-delivers the .docx back to Bids #3 SOW Document column (file_mm6wm4hn)
👷 Projects — #4
ID: 18176626554
21 legacy + 11 workflows · incl. AI + app integrations
IDTriggerActionNotes
482368826New item createdSet Project Stage → New (index 6)All new Projects #4 items start at New stage automatically
482368825Stage → Kick OffMove to Kick Off group
482368827Stage → All Products ReceivedMove to All Products Received group
482368829Stage → Pre-Install Staging (index 7)Move to Construction Hold / Phased Install groupGroup is "Construction Hold or Phased install" — covers hold and staging scenarios
482368831Stage → Pre-Install Staging (index 11)Move to Equipment Only groupEquipment-only projects route to the Equipment Only group on pre-install staging
482368832Stage → Installing (index 8)Move to Installing group
482368830Stage → Closeout (index 9)Move to Closeout group
482368834Stage → Ready for Invoicing (index 3)Move to Ready for Invoicing group
482368833Stage → Closed (index 4)Move to Closed group
482368828ErrorStage → Waiting for ProductMove to Waiting for Product groupError: "missing_group" — target group no longer exists. Group was likely deleted or renamed.
591750313 (Projects webhook)Stage → Ready for InvoicingSend webhook to vtg-billing-readyFires billing notification email to eratebilling@vtgus.com via vtg-billing-ready Worker
628087115 (Projects PO webhook)NS Sales Order # column (text_mm6hv20b) changesSend webhook to vtg-po-syncLive Aug 25 2026 — fires vtg-po-sync when SO# is manually entered or backfilled
545905802 / 545905803 (AI)New item created / Item name changesAI: extract "470#" from item name → text_mkqz3hwwAI extracts 470# for reporting and linkingAI
545919569 / 545919570ErrorNew item / name changeAI: extract Company → lead_company columnError: "The chosen column no longer exists." Column was deleted; automations broken.AI
578063979 / 578063986 (AI)Item created (if Project Year empty) / text changesAI: categorize into Project Year dropdownSets dropdown_mkqz1ay (Project Year) by AI categorization of the 470# textAI
566854668 / 566856009 / 566856718 (integrations)Blueprint column (color_mm2frt9j) → Wireless / Fiber Optic / BMICOverwrite item with matching item templateThree blueprint templates: "Wireless deployment - VectorFi - Wired", "Fiber Optic Cabling", "BMIC"App
7917221940 (workflow)Stage → Accept (index 6)Move item to Construction Hold / Phased Install group
7917971701 (workflow) InactiveSubitem status → Done (from anything)Move parent item to Ready for Invoicing groupAn older subitem-driven billing trigger — now superseded by vtg-materials-log stage advancement
7917999463 (workflow)Stage → Ready for InvoicingNotify Accounting team"This project is complete and ready to bill in full" — notifies the Accounting team (team ID 1424500) in monday.com
7918015674 (workflow)Blueprint column changes + contains BMICCreate subitem assigned to Engineer team"Insert the first row here" + "This might be a spot for the task" — a partially-configured placeholder; may need refinement
7918629648 (workflow)Stage → Equipment Only (index 11)Move to Equipment Only group
7918731761 (workflow)Blueprint column changes + Blueprint = Equipment Only (label 8)Move to Equipment Only groupRoutes equipment-only projects to the correct group when Blueprint is selected
7920172789 (workflow)Stage → Ready for InvoicingSet Actual Revenue Month (date_mm4tatyy) = todayStamps the revenue date for Forecast vs. Actual dashboard
7920172818 (workflow)Stage → ClosedSet Actual Revenue Month (date_mm4tatyy) = todayAlso stamps revenue date on Closed — covers projects that skip Ready for Invoicing
7920230690 (workflow)Stage → ClosedNotify Branden Sumerix + Dylan Lindhout"Performance Bond Complete — notify the bonding company that this project is complete."
7920569056 (workflow)Stage → Ready for InvoicingSet Ready for Invoicing Date (date_mm54qwps) = todayTimestamps the Ready for Invoicing date for billing SLA tracking
7922447604 (workflow)Stage → InstallingSet Materials Log link column (link_mm6mhdcx) = vtg-materials-log URL for this itemLive Aug 27 2026 — auto-populates the PM's one-click link to the materials log tool
backfill (Sep 3)One-timePopulate new 📊 SOV Builder column (link_mm6vbks) for all 156 existing bidsManual backfill completed Sep 3 2026; vtg-bid-intake now stamps both link_mm6vbks and link_mm591mdg on new bid creation going forward
📊 CRM Workspace Dashboards (Workspace 12853770)
E-Rate Pipeline Dashboard
CRM Workspace · Board 18419943586
Executive
The primary E-Rate revenue visibility tool. Shows the full pipeline from active bids through to billed projects — forecast vs. actual revenue by month, stage distribution across Bids #3, and project counts by status. Used by Jon and Greg to understand where revenue stands and what's pending in the pipeline at any given time.
Bids #3 (18176633000) — bid values, stage counts, deal owner breakdown
Projects #4 (18176626554) — Actual Revenue Month (date_mm4tatyy), Ready for Invoicing Date (date_mm54qwps)
E-Rate Revenue Forecast board (18419943586) — monthly forecast targets vs. actuals
⚠ Actual Revenue Month is auto-stamped by automations 7920172789 (Ready for Invoicing) and 7920172818 (Closed) — accuracy depends on those stages being set correctly
Bids #3 Views (Per-Person)
CRM Workspace · Board 18176633000
Sales / Bid Team
Not a separate dashboard — each team member has a dedicated Table View on Bids #3 filtered and column-ordered for their role: Alan's View, Jake's View, Dylan's View, Mark's View, plus a "My Kanban" and "My Timeline" view filtered to items assigned to the logged-in user. Each view hides irrelevant columns and surfaces what that person needs for their day-to-day bid work.
Bids #3 (18176633000) — all columns, role-filtered
Subitem board (18176633598) — task status, due dates per person
Bid Deadline View
CRM Workspace · Board 18176633000 · App: 18657380
Ops / Bid Team
A dedicated feature board view (Vibe app 18657380) on Bids #3 that surfaces bids sorted by deadline. Gives a quick at-a-glance view of what's due soonest — used during bid rush periods to prioritize workload across Dylan, Branden, Alan, and Jake.
Bids #3 (18176633000) — sorted by Bid Due Date DESC
E-Rate Historical Awards Board
CRM Workspace · Board 18424893495
Executive / Sales
Houses 1,107+ FRN records imported from nine years of USAC QuickBase exports (FY2017–FY2025), grouped by funding year. Used for win-rate analysis, territory planning, and pre-bid research — "have we won in this district before, and at what value?" Also serves as a historical reference for which 470s VTG has bid on and won over time.
USAC QuickBase export CSVs — imported via API import script
15 columns: District, FRN, Funding Year, Category, Award Amount, etc.
Projects #4 — Stage Group Views
CRM Workspace · Board 18176626554
PM / Jon
Projects #4 is organized into stage-based groups that function as a kanban board: New → Waiting for Product → All Products Received → Kick Off → Pre-Install Staging → Installing → Equipment Only → Construction Hold → Ready for Invoicing → Closed. Each group move is automated by stage changes. Jon uses this as his primary delivery management view — seeing what's installing, what's ready to bill, and what's waiting on product at a glance.
Projects #4 (18176626554) — all delivery stages, linked to Bids #3 via connect_boards6
Blueprint column drives item template overlays (Wireless/Fiber/BMIC)
⚠ "Waiting for Product" group automation (482368828) is in error state — group may have been renamed or deleted
Deal Reg Board
CRM Workspace · Board 18176632827
Branden / Deal Reg
Tracks deal registration records linked to Bids #3 items. A deal reg item is auto-created on Bids #3 when a bid moves to Deal Reg stage (automation 482374704). Branden uses this board to track registration numbers, manufacturer, status, and submission dates. Linked back to Bids #3 via the "🤝 Deal Reg's" board relation column.
Bids #3 (18176633000) — linked via connect_boards1
Auto-populated by automation 482374704 on Deal Reg stage
Bid Bonds Board
CRM Workspace · Board 18176632761
Dylan / Branden / Bonding
Tracks bid bond requirements for bids that require performance or bid bonds. A bond subitem is created on Bids #3 and a linked item is created on this board when the intake form indicates "bond required." vtg-bid-intake emails Alliant and CHC-Surety automatically. Bond status is tracked here and mirrored via the "🅱️ Bid Bonds" relation on Bids #3. When a project closes, automation 7920230690 notifies Branden and Dylan to release the bond.
Bids #3 (18176633000) — linked via board_relation0
vtg-bid-intake — creates bond email + subitem on intake form submit
Accepted Monitor Board
CRM Workspace · El Nova Leads (18181651809)
Ops / Jon
A parallel watchdog board created by El Nova when a rep clicks accept_470. Polls USAC automatically on a schedule to monitor whether the corresponding Form 470 receives funding. Purely informational — does not gate or block the Bids #3 flow. Used to catch situations where USAC denies or modifies funding on a bid already in progress. Rejected leads do not appear here.
El Nova system — creates item on accept_470 trigger
USAC API — polled on El Nova's schedule
📊 E-Rate Operating System Dashboards (Workspace 14860884)
E-Rate Deals Board
E-Rate OS Workspace · Board 18406412794
Finance / Jon
The financial deal-tracking layer for post-award E-Rate projects. Items are auto-created here when a Bids #3 item enters Post-Monday stage. Tracks: District, FRN, Contract Value, Funding Year, Category, Sales Owner, and Status (Pipeline → Submitted → Awarded → Booked). Status progression triggers E-Rate Projects creation (Pipeline→Awarded) and stamps Booking Date (→Booked). Currently has no defined owner for status updates — a documented gap.
Bids #3 (18176633000) — created by automation 559103546 on Post-Monday
E-Rate Projects (18406413755) — linked via Linked Deal relation
⚠ Gap: no defined owner or automation for status progression Pipeline → Submitted → Awarded → Booked
E-Rate Projects Board
E-Rate OS Workspace · Board 18406413755
Finance / Jon / PM
The financial and scheduling view of post-award E-Rate project execution. Mirrors data from Bids #3 (Account, Contact, Bid Value, 470#, SharePoint, Projects #4 link) and E-Rate Deals (District, Booking Date, Contract Value, Funding Year). Jon manages Execution Status, Billing Status, Planned Start Window, Risk Flag, PM/Project Owner, and timeline dates here. This board is the source of truth for when projects start and complete — complementing Projects #4 which tracks what is happening on the ground.
E-Rate Deals (18406412794) — created by automation 7917669964 when Status → Awarded
Bids #3 (18176633000) — mirrored via board_relation_mm1yt0xa
Projects #4 (18176626554) — mirrored via lookup_mm1ydhb5
📊 VTG Portal — Tool & Doc Hub
VTG Staff Portal
vtg-portal.vectorfi-admin.workers.dev
All Staff
A Cloudflare Worker-hosted internal hub with four sections: Home (quick links), Tools (sales, finance, field, admin — links to all Workers and tools), Docs (markdown-backed documentation replacing OneNote — covers VES, integrations, troubleshooting, automation, E-Rate), and Admin (manage tool entries, doc pages). Config lives in GitHub: vtg-portal/vtg-portal (private repo), config/tools.json. Admin is currently password-gated; Azure AD SSO is planned.
GitHub vtg-portal/vtg-portal — tools.json + docs/ markdown files
All vtg-* Workers — linked from Tools section
Monthly Review Deck Builder
vtg-deck-builder Worker · KV: DECK_DATA
Executive / Division Leads
A Cloudflare Worker that generates monthly division review PowerPoint decks by pulling data from Bids #3, Projects #4, and the E-Rate Revenue Forecast board. Ten division leads each get a tailored deck. The pipeline: KV-stored deck template → pull board data → fill slides → export PPTX. Used for monthly leadership reviews.
Bids #3 (18176633000) — active bid pipeline, stage counts
Projects #4 (18176626554) — delivery status, Ready for Invoicing
E-Rate Revenue Forecast board (18419943586) — forecast vs. actual