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
Click any step to open detail panel →
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.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.vtg-sf-account-sync pushes Accounts and Contacts, and vtg-monday-sf-sync pushes Bids as Opportunities, both keyed on Monday_Item_ID__c. Written up in full in the VTG Salesforce SOP (VTG_Salesforce_SOP.html, v2.1 — Sep 9 2026).formula8 computes every subitem's due date correctly, but date3 "Task Due Date - Manual" — the column seven active automations actually trigger on — is empty on every subitem. monday formula columns cannot fire automations, so the due-today notification, the three per-person row highlights and the three auto-assign rules can never run. Fix without touching Dylan's automations: one more Autoboost recipe writing the computed date into date3, mirroring what 483152942 already does for Bid Due Date Mirror. Backfilling in bulk would trigger the three auto-assigns, so apply to new subitems first.CloseDate from deal_creation_date, the day the bid was created — so every E-Rate Opportunity is created with an expected close date that has already passed. Bids #3 has an unused date_mm2c6t1k "Expected Award Date" column which is exactly this field. Amount is likewise taken straight from Bid Value, so a placeholder bid value becomes a real forecast number. Quietly wrong on every Opportunity the sync has touched, not just the test bid.HMAC mismatch — sig received: <empty> and is processed regardless, so the public Workers URL will write to a Salesforce Opportunity for anyone who knows it. Either monday's plain webhook action never signs the body, or the secret is unreachable — check the latter first, since vtg-sf-account-sync has a binding named WEBHOOK_SECRETvtg-sf-sync-2026-xK9mQpL3 that looks like a secret pasted into the name field.StageName: "Stage 3: Bid Building", but Folder Creation, Deal Reg and Bid Compilation send no stage at all — they log active: false and the field is omitted. So the Opportunity keeps reporting the last mapped stage while monday has moved on. If sales reads stage off Salesforce, they are looking at a bid one or more steps behind reality. Separately, skip: true only suppresses StageName; the Opportunity is still written on every column change, which produced 14 writes in one morning.link_mm6vbks is described as auto-populated, but nothing in the current creation path writes it — Ionia arrived with its intake link set and no SOV link. The ten older bids that have one look backfilled. Format is …/?item=<itemId>, note ?item= where vtg-cs-form uses ?bid=. vtg-bid-intake already writes the intake link at the same moment, so this is a small addition to a function that is already running.N/A, n.a., N / A, TBD, pending, XXXX and 0000 are all refused. A PO of "N/A" is worse than an empty one — it looks like a value and verifies nothing. The PO is the human-readable key finance reconciles the NetSuite order against, alongside UID matching.custentity_acs_unique_entity_identifier and falls back to fuzzy name; vtg-po-sync reads back from whatever it finds. That is a stopgap, and it is only as good as the name and UID data on both sides. Planned direction: create the order in NetSuite from monday at order time, so the NS record carries the monday item and UID identity from creation. Matching then becomes 100% accurate by construction, the backfill and reconciliation Workers drop back to being a safety net rather than the mechanism, and the customer ID mapping that currently blocks the invoice flow stops being a separate problem. Pairs with making the customer PO # required on the CS Order form as the verification key./api/lookup live. That half shipped Sep 3 2026. The consuming half never did: vtg-sov-builder declares the [[services]] TDSYNNEX binding and never calls it. Verified Sep 17 against worker-combined.js — zero references to tdsynnex, TDSYNNEX or /api/price, and no LIVE badge exists. Step 6 of the vtg-tdsynnex deploy guide ("Update vtg-sov-builder") is the outstanding work; prefer env.TDSYNNEX.fetch() over the public URL that guide suggests.file_mm5bhcw7, writes the SOV Builder link to link_mm591mdg, and creates a bond subitem + email if required. Patched Sep 19–20 2026: the Account/Contact lookup declared its GraphQL variable as [ItemsQuery!] where monday expects [ItemsQueryRule!] — every lookup failed validation, an empty catch swallowed it, and bids were created with both relations blank. Contact selection was then rewritten to draw candidates from the Account's own Contacts relation, drop billed_entity placeholders, collapse duplicate emails keeping the most recently updated, and score the rest. The E-Rate Primary Contact dropdown now reads its options live from the Bids #3 column instead of a hardcoded list.?item={monday_item_id}. Supports multi-tab buildings, ADD-ALTS tab, Summary tab, section type picker (Wired/Wireless/Firewall/UPS/Cable/MIBS/BMIC/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.logo file column, setting logo_status to Logo Found / Needs Manual Logo / No Website. Fires on Account creation and when website_url changes, so an account that arrives without a website gets a second attempt once El Nova fills it in. Rewritten Sep 20 2026 — the original only read <img src>, which Finalsite and ParentSquare sites never emit (the URLs sit in data-image-sizes as percent-encoded JSON), and its Clearbit fallback had been dead since 8 Dec 2025. In two months it had found 6 logos. The replacement reads lazy-load attributes, scores candidates, prefers a wordmark over an icon mark, and only writes at 70+ — anything less confident is flagged Needs Manual Logo rather than guessed at./api/inventory/all and displays all NS locations: 41 Cabling Warehouse (blue), 42 Secondary Warehouse (green), 4 Grand Rapids Office (yellow). Password protected (VTG2026 — Azure AD SSO planned). Features: search, location filter pills, sortable columns, light/dark mode toggle, CSV export.config/tools.json is source of truth for tool entries. Docs backed by GitHub markdown files.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.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.document_status_changed webhook when a SOW finishes generating, downloads the .docx, and routes by template name — routes "Vector eRate SOW" (ID 7085) to Bids #3 SOW Document column (file_mm6wm4hn); generates as PDF (generate-pdf: trueemplate name once V3 is uploaded to ScopeStack. 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. ⚠ Pending: template routing update to V3; vtg-cs-form needs 6 PM task subitems added (Project Kickoff, Site Access, Install Scheduling, Weekly Status, Documentation, Closeout).file_mm739vxe). Updates a Proposal Status column (orange → green/red) so reps can see progress without re-clicking.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.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.wrangler deploy from Command Prompt (not PowerShell — blocked by Norton). Source files at OneDrive\VTG Flows\<worker-name>\.https://{accountId}.suitetalk.api.netsuite.com/…/oauth2/v1/token.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)./admin/skus route — and the vtg-sku-catalog project folder is empty, so the serving source has not been located. 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).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.| ID | Trigger | Action | Notes |
|---|---|---|---|
| 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) |
| ID | Trigger | Action | Notes |
|---|---|---|---|
| 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_mkw7hy4z | vtg-scopestack-doc-sync · LIVE Sep 8 2026 |
| ID | Trigger | Action | Notes |
|---|---|---|---|
| 482374702 | New item created | Set Bid Creation Date (deal_creation_date) to today | Timestamps every new bid automatically |
| 482374703 | New item created | Set Bid Stage → Folder Creation | All new bids start at stage Folder Creation (index 15) |
| 482374765 | New item created | Create 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 |
| 483152942 | New item created | Mirror Bid Due Date to subitem "Bid Due Date Mirror" column | Keeps subitem task due date formula in sync from the parent bid due date |
| 483296416 | New item created | Refresh Bid Name Formula column (formula_mkwrhcw) | Forces the formula "District - 470#: XXXXXXXXX" to populate on creation |
| 482374704 | Stage → Deal Reg | Create linked item on Deal Reg board (18176632827) | Auto-creates the Deal Reg record when stage changes; links back via connect_boards1 relation |
| 482374714 | Stage → Deal Reg | Move item to Deal Reg group | Group = physical location of the item in the board view |
| 482374721 | Stage → Bid Building | Move item to Bid Building group | |
| 482374719 | Stage → Bid Compilation | Move item to Bid Compilation group | |
| 482374720 | Stage → Bid Submittal | Move item to Bid Submittal group | |
| 482374739 | Stage → Awaiting Results | Move item to Awaiting Results group | |
| 482374746 | Stage → Post-Sale | Create 6 Post-Sale subitems + move to Post-Sale group | LOI, CW contract (dead task), FCDL/SPI tasks, PO, SOV update |
| 482374740 | Stage → Post-Monday | Move item to Post-Monday group | |
| 559103546 | Item enters Post-Monday group | Create item on E-Rate Deals board (18406412794) | The active Post-Monday handoff — replaces the inactive 482374713 (Projects #4) and 482374738 (CS/PM notification) |
| 482374717 | Stage → Wins Archive | Post completion update + move to Wins Archive group | Message: "This Bid has been completed and billed in full! Congrats! Bid Creation Date: {date} Bid Close Date: {date}" |
| 482374723 | Stage → Lost | Post update + move to Lost group + rename item | Message: "This Bid was lost. Please update all attached Boards, and fill in final amounts and results." |
| 562741747 | Stage → Post-Sale (status index 12) | Send webhook to vtg-cs-form | One of two vtg-cs-form webhook triggers |
| 483153616 | Stage → Post-Sale (secondary trigger) | Send webhook to vtg-cs-form | Redundant webhook for vtg-cs-form reliability |
| 482374706 | Subitem status → ARCHIVE | Archive the subitem | Manual archive — hides completed/irrelevant tasks from the active subitem view |
| 482374707 | Subitem status → You're Up! | Notify assignee | "You're Up! {task} is due {date} for {bid name}. You're not waiting on anyone." |
| 482374711 | Subitem status → N/A | Clear assignee, due date, and Bid Stage Subitem | Effectively removes the task from the active queue; used for inapplicable BEAR/SPI tasks |
| 482374715 | Subitem due date set + Sales Rep = Jake | Auto-assign Jake to subitem | Watches deal_owner column — assigns Jake (92155649) to his subitems automatically |
| 482374716 | Subitem due date set + Sales Rep = Alan | Auto-assign Alan to subitem | Watches deal_owner column — assigns Alan (92155651) to his subitems automatically |
| 482374722 | Subitem due date = today (noon ET) | Notify subitem assignee | "Task due today: {task} is due {date} for {bid name}" |
| 482374728 / 482374735 / 482374751 | Subitem due date = today (11am ET) + not complete | Set parent status (Jake/Alan/Dylan Subitem Status) → Due Today | Three automations, one per person — highlights bids that need same-day attention on the parent item view |
| 482374745 / 482374748 / 482374755 | Subitem status → Complete + assignee = Dylan/Alan/Jake | Clear parent Subitem Status column (remove Due Today) | Clears the parent highlight once the person's task is done |
| 482374724Inactive | Bid Due Date - 5 days | Notify assigned reps | "Bid due in 5 days: {bid name} is due {date}. Delivery Method: {method}" |
| 482374730Inactive | Subitem due date + 3 days (overdue) | Notify subitem assignee | 3-day overdue task reminder — currently off |
| 482374713Inactive | Item enters Post-Monday group | Create item on Projects #4 + link via connect_boards6 | Replaced by 559103546 (E-Rate Deals creation). Left inactive as reference. |
| 482374738Inactive | Stage → Post-Monday | Notify 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 something | Create a subitem | General-purpose workflow used to add subitems on specific stage transitions beyond the initial 23-task creation |
| 7917866595 (workflow) | When subitem column changes | Change parent item Bid Stage column to match | Keeps 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/BMIC | Overwrite item with matching item template | Three project-type templates applied when Blueprint is set on Bids #3 itemsApp |
| 545905802 / 545905803 (AI) | New item created / Item name changes | AI: extract "470#:" from item name → text_mkqz3hww | monday AI extraction automationAI |
| 578063979 / 578063986 (AI) | Item created (if Project Year empty) / text_mkqz3hww changes | AI: categorize into Project Year dropdown (dropdown_mkqz1ay) | Sets Project Year dropdown by AI-categorizing the 470# text columnAI |
| 591750313 | Stage → Ready for Invoicing (lead_status index 3) | Send webhook to vtg-billing-ready | Triggers billing notification email to eratebilling@vtgus.com |
| 628087115 | NS Sales Order # column (text_mm6hv20b) changes | Send webhook to vtg-po-sync | Live Aug 25 2026 — triggers PO sync back from NetSuite |
| Generate SOW button (Sep 8) | Generate SOW button (button_mm70vvrb) clicked on Bids #3 item | Send webhook to vtg-scopestack-doc-sync /generate endpoint | Triggers programmatic SOW generation in ScopeStack; webhook auto-delivers the .docx back to Bids #3 SOW Document column (file_mm6wm4hn) |
| ID | Trigger | Action | Notes |
|---|---|---|---|
| 482368826 | New item created | Set Project Stage → New (index 6) | All new Projects #4 items start at New stage automatically |
| 482368825 | Stage → Kick Off | Move to Kick Off group | |
| 482368827 | Stage → All Products Received | Move to All Products Received group | |
| 482368829 | Stage → Pre-Install Staging (index 7) | Move to Construction Hold / Phased Install group | Group is "Construction Hold or Phased install" — covers hold and staging scenarios |
| 482368831 | Stage → Pre-Install Staging (index 11) | Move to Equipment Only group | Equipment-only projects route to the Equipment Only group on pre-install staging |
| 482368832 | Stage → Installing (index 8) | Move to Installing group | |
| 482368830 | Stage → Closeout (index 9) | Move to Closeout group | |
| 482368834 | Stage → Ready for Invoicing (index 3) | Move to Ready for Invoicing group | |
| 482368833 | Stage → Closed (index 4) | Move to Closed group | |
| 482368828Error | Stage → Waiting for Product | Move to Waiting for Product group | Error: "missing_group" — target group no longer exists. Group was likely deleted or renamed. |
| 591750313 (Projects webhook) | Stage → Ready for Invoicing | Send webhook to vtg-billing-ready | Fires billing notification email to eratebilling@vtgus.com via vtg-billing-ready Worker |
| 628087115 (Projects PO webhook) | NS Sales Order # column (text_mm6hv20b) changes | Send webhook to vtg-po-sync | Live Aug 25 2026 — fires vtg-po-sync when SO# is manually entered or backfilled |
| 545905802 / 545905803 (AI) | New item created / Item name changes | AI: extract "470#" from item name → text_mkqz3hww | AI extracts 470# for reporting and linkingAI |
| 545919569 / 545919570Error | New item / name change | AI: extract Company → lead_company column | Error: "The chosen column no longer exists." Column was deleted; automations broken.AI |
| 578063979 / 578063986 (AI) | Item created (if Project Year empty) / text changes | AI: categorize into Project Year dropdown | Sets dropdown_mkqz1ay (Project Year) by AI categorization of the 470# textAI |
| 566854668 / 566856009 / 566856718 (integrations) | Blueprint column (color_mm2frt9j) → Wireless / Fiber Optic / BMIC | Overwrite item with matching item template | Three 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) Inactive | Subitem status → Done (from anything) | Move parent item to Ready for Invoicing group | An older subitem-driven billing trigger — now superseded by vtg-materials-log stage advancement |
| 7917999463 (workflow) | Stage → Ready for Invoicing | Notify 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 BMIC | Create 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 group | Routes equipment-only projects to the correct group when Blueprint is selected |
| 7920172789 (workflow) | Stage → Ready for Invoicing | Set Actual Revenue Month (date_mm4tatyy) = today | Stamps the revenue date for Forecast vs. Actual dashboard |
| 7920172818 (workflow) | Stage → Closed | Set Actual Revenue Month (date_mm4tatyy) = today | Also stamps revenue date on Closed — covers projects that skip Ready for Invoicing |
| 7920230690 (workflow) | Stage → Closed | Notify Branden Sumerix + Dylan Lindhout | "Performance Bond Complete — notify the bonding company that this project is complete." |
| 7920569056 (workflow) | Stage → Ready for Invoicing | Set Ready for Invoicing Date (date_mm54qwps) = today | Timestamps the Ready for Invoicing date for billing SLA tracking |
| 7922447604 (workflow) | Stage → Installing | Set Materials Log link column (link_mm6mhdcx) = vtg-materials-log URL for this item | Live Aug 27 2026 — auto-populates the PM's one-click link to the materials log tool |
| backfill (Sep 3) | One-time | Populate new 📊 SOV Builder column (link_mm6vbks) for all 156 existing bids | Manual backfill completed Sep 3 2026; vtg-bid-intake now stamps both link_mm6vbks and link_mm591mdg on new bid creation going forward |
config/tools.json. Admin is currently password-gated; Azure AD SSO is planned.A record of all process changes, new Workers, and infrastructure updates to the VTG Lead → Invoice system.
| Date | Version | Type | Change |
|---|---|---|---|
| September 21, 2026 | |||
| Sep 21 | v2.5 | Fix | SOV Builder — a building could not be renamed — Renaming was implemented, as a double-click on the tab label, but nothing advertised it: no tooltip, no pencil, no affordance. The only tab control carrying a title was the harmless duplicate button; the × that deletes a building had none. Worse, the handler called window.prompt(), which browsers suppress in sandboxed and embedded contexts and which Chrome disables for the rest of a page's life once "prevent additional dialogs" is ticked — so for some users the double-click did nothing at all. It now reuses the in-page modal that Add building already used, prefilled and selected, with the mode and heading reset on cancel. Both tab buttons gained tooltips. |
| Sep 21 | v2.5 | Infrastructure | vtg-sov-builder deploys worker-combined.js, not index.js — Recorded because three patch attempts changed nothing before this was noticed. wrangler.toml sets main = "worker-combined.js" in the folder root (~108 KB); index.js is a dead file from 14 Aug that nothing deploys, and two further stale copies of worker-combined.js sit under files\ (20 Aug) and Archive\files\ (14 Aug). Patch scripts for this worker must resolve the target from wrangler's main rather than guessing filenames. The first failure was initially misread as a line-ending problem, which cost four no-op deploys. |
| Sep 21 | v2.5 | Update | Bid Building walked end to end on a real bid — Ionia Public Schools (470# 270000574, bid 13089254247) taken from Folder Creation through Bid Compilation with a live tail running. SharePoint folder linked, deal reg created by automation 482374704, and all three artifacts produced: SOW (asset 3261375108), SOV PDF (3261392198) and Proposal PDF (3261481236). Fourteen Bid Building subitems closed. Every finding below came out of that walk. |
| Sep 21 | v2.5 | Gap | The subitem task schedule is computed and then ignored — formula8 "Task Due Date Formula" correctly derives each subitem's due date (FORMAT_DATE(SUBTRACT_DAYS({date},{numbers0}))), but date3 "Task Due Date - Manual" is empty on every subitem — and date3 is what seven active automations trigger on: the due-today notification, the three per-person row highlights, and the three auto-assign rules. monday formula columns cannot trigger automations, so the whole subitem reminder system is inert, which is almost certainly why the overdue reminder was switched off rather than fixed. Autoboost recipe 483152942 already writes a formula result into a real date column, so one more recipe of the same shape fixes it without editing anyone's automations. Caution: the three auto-assigns fire on that column changing, so a bulk backfill would trigger a wave of reassignments. |
| Sep 21 | v2.5 | Gap | Salesforce receives almost nothing, fourteen times — One morning's walkthrough produced 14 updates to Opportunity 006aZ00000jC0OvQAK, every payload identical but for the timestamp. None of the work reached Salesforce: not the SOW, the SOV, the Proposal, the SharePoint folder, the deal reg, the 470 number, the account or the contact. Three separate problems sit behind that. skip: true only suppresses StageName — the Opportunity is still written on every column change at every stage. The stage map is incomplete, so Folder Creation, Deal Reg and Bid Compilation send no stage at all and Salesforce reads one or more steps behind monday. And CloseDate is populated from deal_creation_date, so every E-Rate Opportunity is created with a close date already in the past — Bids #3 has an unused date_mm2c6t1k "Expected Award Date" column that is the correct source. |
| Sep 21 | v2.5 | Gap | vtg-monday-sf-sync accepts unsigned requests — Every invocation logs HMAC mismatch — sig received: <empty> and then processes the request anyway, so the public endpoint will write to a Salesforce Opportunity for anyone who knows the URL. The signature arriving empty has two plausible causes: monday's plain "send a webhook" action does not HMAC-sign its body, so the check may be for something that never arrives; or the secret is unreachable. The second is worth checking first — vtg-sf-account-sync carries a binding named WEBHOOK_SECRETvtg-sf-sync-2026-xK9mQpL3, which looks like a secret value pasted into the name field, leaving WEBHOOK_SECRET undefined and the comparison unable to succeed. |
| Sep 21 | v2.5 | Gap | Generate SOW runs silently for three and a half minutes — Generate Proposal sets its status column to Working on it, produces the PDF and sets Done, the whole run taking nine seconds. Generate SOW has no status column at all: it goes quiet and a file appears some minutes later, which is indistinguishable from a failure and was in fact mistaken for one during this walkthrough. It needs a SOW Status column and the same pattern. Its filename also doubles the district name — Ionia-Public-Schools-Ionia-Public-Schools-470_-270000574-… — because the account name is prepended to a bid name that already starts with it. Separately, neither generator closes its own Create SOW / Create SOV subitem, so the artifact exists while the task still says it does not. |
| Sep 21 | v2.5 | Gap | The SOV Builder link is not written at bid creation — link_mm6vbks is described on the board as auto-populated, but nothing in the current creation path writes it. Ionia arrived through vtg-bid-intake with its Customer Intake Form link set and no SOV Builder link; the ten older bids that have one most likely got it from a one-off backfill. Every new bid this season will arrive without it. The format is https://vtg-sov-builder.vectorfi-admin.workers.dev/?item=<itemId> — note ?item=, where vtg-cs-form uses ?bid=. The intake worker already writes the intake link at the same moment, so this is a couple of lines in a function that is already running. |
| Sep 21 | v2.5 | Infrastructure | Board mechanics worth knowing before touching a bid — There is no group-move automation for Bid Stage → Folder Creation; every other stage has one, because the first stage was only ever reached at item creation. Sending a bid back to the start leaves stage and group disagreeing until someone drags it. Subitem status Create Item is the starting state for the five steps that produce an artifact, not a decoration. Setting a subitem's Status to N/A triggers automation 482374711, which clears its columns and deletes it — the intended way to strip Post-Sale subitems off a bid that was sent back. And monday's API will not return webhook target URLs, so a worker's name has to come from wrangler or the automation UI. |
| September 20, 2026 | |||
| Sep 20 | v2.4 | Gap Resolved | Customer PO # is now required on the CS Order form — Closes the Medium gap logged Sep 18. A hard block: no PO, no submission. Placeholders are refused too — the value is normalised to letters and digits, so N/A, n.a., TBD, pending, XXXX and 0000 all bounce, because a PO of "N/A" looks like a value and verifies nothing against NetSuite. Both required fields on the form now show an asterisk; previously nothing indicated that Target / Deadline Date was mandatory either. |
| Sep 20 | v2.4 | Fix | vtg-bid-intake — every bid was being created with no Account and no Contact — The lookup declared its GraphQL variable as [ItemsQuery!] where monday expects [ItemsQueryRule!], so the query failed validation before it ever ran. An empty catch (_) {} swallowed the error, the function retried four times with 5-second sleeps and returned nulls, and the bid was created successfully with both relations blank. The tell was a consistent 17-second gap between form submit and the bid appearing — three sleeps of five seconds. Reproduced on two controlled runs, fixed, and verified in production on bid 13089254247. |
| Sep 20 | v2.4 | Update | Contact selection rewritten and scored — Candidates now come from the Account's own Contacts relation rather than a board-wide name search, which had been returning the USAC billed_entity placeholder — a record named after the district, with no email and no person behind it. Duplicate emails collapse to the most recently updated record (El Nova creates a fresh contact per bid instead of updating the existing one, so 8% of accounts carry duplicates). Survivors are scored on email domain vs the Account website, Customer status, USAC technical type and job title, with consultants penalised heavily. Below the bar the field is left blank on purpose — a blank gets noticed, a confidently wrong contact does not. |
| Sep 20 | v2.4 | Fix | Automatic district logos — 6 found in two months, now 242 of 331 — vtg-account-logo and vtg-logo-backfill shared a scraper that only read <img src>. Finalsite, ParentSquare and similar K-12 platforms emit no src at all in served HTML; the real URLs sit in data-image-sizes as percent-encoded JSON. Its Clearbit fallback had been dead since HubSpot shut the free Logo API on 8 Dec 2025, and its favicon guard didn't work — a favicon scored 14 and passed. The replacement reads lazy-load attributes, scores candidates by filename, alt text, CSS class and position, prefers a wordmark over an icon mark, and writes only at 70+. Measured read-only across all 331 addressable accounts before anything was written. |
| Sep 20 | v2.4 | New | Completed Intake Form PDF on Bids #3 — The intake form now builds a PDF of everything submitted and attaches it to file_mm5bhcw7 on the new bid, using the same client-side jsPDF approach as vtg-cs-form. PDF generation can never block a submission; if it fails the bid is still created and the failure is logged. Note add_file_to_column appends rather than overwrites, so a future resubmit path would stack PDFs. |
| Sep 20 | v2.4 | Fix | E-Rate Primary Contact dropdown and the blueprint mirror — The intake form's contact dropdown was a hardcoded ['Jake','Alan','Ruckus'] that had drifted from the monday column, so "John" could never be selected. It now reads the column's labels live and honours deactivated ones, meaning the list is managed in monday and cannot drift again. Separately, blueprint_name on Bids #3 was a mirror pointing at a Leads column that no longer exists (dropdown_mkw331zh); repointed to ScopeStack Blueprint(s). The Worker was never at fault there — it links the lead correctly. |
| Sep 20 | v2.4 | Infrastructure | Silent failure treated as the real defect — Every bug above shared one cause: the failing path was the only one with no logging. The Account/Contact lookup, the logo scraper and the logo upload all swallowed their errors into empty catch blocks, which is why a 100%-reproducible bug survived months of production. Each now emits a tagged line — [contact-match], [intake-pdf], [logo-match] — naming what it chose, what it scored and why. vtg-account-logo already has observability with persisted logs enabled, so its output is visible in the Cloudflare dashboard, not only in a live tail. |
| September 18, 2026 | |||
| Sep 18 | v2.3 | Infrastructure | monday → NetSuite order push adopted as the direction — The monday ↔ NS record link is today reconstructed after the fact (UID-exact match with a fuzzy-name fallback in vtg-ns-so-backfill, read-back in vtg-po-sync). That is now formally a stopgap. The direction of travel is to create the order in NetSuite from monday at order time, so the NS record carries the monday/UID identity from creation and matching is accurate by construction. Added as a High item under Planned; the customer ID mapping blocker on the invoice flow is expected to fall out of it. |
| Sep 18 | v2.3 | Update | Customer PO # to be required on the CS Order form — The form and the Projects #4 item it creates already carry a customer PO number, but it is optional. Plan: make it required and use it as the verification key against the NetSuite order, alongside UID matching. Logged as a Medium gap. |
| Sep 18 | v2.3 | Infrastructure | UID confirmed as the cross-system source of truth · two new gaps logged — The UID (Salesforce Account ID, produced by the reliable monday ↔ Salesforce sync) is the standard going forward for every cross-system link; name matching is fallback only. Two consequences written onto the map: legacy monday records predate the standard and still need cleanup (Medium), and NetSuite data cleanup has no owner (Medium) — NS needs significant cleanup but is not a program Jon owns, so it needs an owner on the finance/NS side. |
| Sep 18 | v2.3 | Update | Salesforce system-of-record rule added to the Commercial track — New step 1.0: Salesforce is the system of record for commercial (non-E-Rate) pipeline — "if it's not in Salesforce, it didn't happen." Routing rule documented: no E-Rate/FCC funding → Salesforce; E-Rate → monday.com; the non-E-Rate portion of a split-funded deal is tracked in Salesforce separately. vtg-sf-account-sync and vtg-monday-sf-sync are what keep reps from double-entering. Source: VTG Salesforce SOP v2.1 (Sep 9 2026). |
| September 17, 2026 | |||
| Sep 17 | v2.2 | Update | vtg-cs-form — tax exemption certificate capture — Section 1 gains a Tax Exempt Yes/No radio (defaults Yes) with certificate upload. New Tax Exempt Certificate file column on 🏢 Accounts #1 (file_mm79y1x5): an existing cert is auto-pulled and attached to the order and the email; a cert uploaded through the form replaces the Account copy (column cleared first, since add_file_to_column appends). Status and cert state land in the monday update body and the CSOP PDF. Blank-mode orders email the cert but write nothing to Accounts. |
| Sep 17 | v2.2 | Update | vtg-cs-form — Licensing Order email prefill + bug fix — The Licensing Order checkbox handler read sm7 ("Create work order with the attached SOW") instead of sm9, so the email field could never be revealed. Fixed. New Licensing Email column on 📡 Controller Serials (email_mm799qya) prefills the field from a prior order once the box is checked; the address is only submitted when Licensing Order is actually selected. Both new columns are resolved by title and type, so a rename does not silently break the lookup. |
| Sep 17 | v2.2 | Infrastructure | Process map accuracy audit — Every hardcoded column ID, status label and board ID on this map checked against the live monday boards and the deployed Worker source. Corrections: TD Synnex live pricing moved from Resolved back to an open High gap (binding declared, never called); SOV Builder trigger column corrected to link_mm6vbks; /admin/skus and the category filter bar removed from the SOV Builder card (neither exists in that Worker); TOKEN_CACHE removed from its KV list; CSOP recipients corrected to erateops@vectortechgroup.com + Sales@vtgus.com, both TO; Projects #4 stage list replaced with the board’s live labels; 8 Windows paths repaired where a literal \v had been eaten by escaping. Confirmed accurate: the UID stamp chain, all 6 PM subitem names, vtg-set-project-year’s label map, vtg-po-sync columns, both SOV KV IDs, and every board ID. |
| Sep 17 | v2.2 | Infrastructure | E-Rate Deals → Projects handoff is not running — Live counts make gap #7 concrete: 📁 E-Rate Deals holds 102 items while E-Rate Projects holds 1. Automation 7917669964 only fires on Status → Awarded, and nobody sets it, so the downstream board is effectively empty. Also noted: five Workers on this map (vtg-portal, vtg-sow-builder, vtg-inventory, vtg-logo-backfill, vtg-sku-catalog) have no local source folder, so there is no redeploy path for them. |
| September 14–16, 2026 | |||
| Sep 16 | v2.1 | Update | vtg-materials-log v4 — NS SO writeback live — On submit, cabling lines PATCHed onto the NS Sales Order and an Item Fulfillment created. Drop-ship SOs skip fulfillment and leave a warehouse note. Re-push to NS button on locked page for retries. NS result (IF# or lines-added confirmation) stored in KV as materials_ns_result:{item_id} and posted to monday thread. NS role perms added: Transactions → Sales Order / Fulfill Orders / Item Fulfillment (Full). |
| Sep 16 | v2.1 | Infrastructure | 621 missing NS inventory items bulk-written — vtg-ns-sku-writer.mjs wrote 621 items to NetSuite as InvtPart using template item C-101017BK (ID 23323). 96% SKU match rate achieved between vtg-sku-catalog and NS. 40 partial matches remain for review (10 need catalog SKU updates, 25 false matches correctly created, 5 need Mark's review). vtg-sku-compare.mjs and vtg-sku-partial-review.mjs used for analysis. |
| Sep 14 | v2.0 | Infrastructure | Cloudflare Workers plan upgraded to Workers Paid — $5/month. Cron limit raised from 5 (free) to 1,000 workers. All existing cron jobs now within limits. |
| Sep 14 | v2.0 | Update | vtg-ns-so-backfill v2 live — Rewritten with UID-exact matching as primary strategy: Projects #4 UID (text_mm76zvbz) → NS customer.custentity_acs_unique_entity_identifier → salesOrder.entity → tranId written to text_mm6hv20b. Fuzzy name as fallback. First sync wrote 43 SO numbers. Cron every 4h. HTML tool has Run Auto-Sync Now button, filter pills, score badges. |
| Sep 14 | v2.0 | Infrastructure | Projects #4 UID column added — text_mm76zvbz created on Projects #4 board (18176626554). backfill-project-uid.mjs ran Sep 14 2026 — name-matched to Accounts board UID (text_mm6s8adk). 6 active E-Rate projects stamped manually. Remaining blanks: commercial/non-eRate (no Account in system) and closed projects. |
| Sep 14 | v2.0 | Fix | vtg-cs-form: UID stamp on Projects #4 creation — /api/submit-pdf handler now reads Account UID (text_mm6s8adk from board_relation3 on Bid item) and writes to text_mm76zvbz on the new Projects #4 item at creation time. Going-forward fix — all new projects get UID stamped automatically. Deployed Sep 14 2026. |
| Sep 14 | v2.0 | Infrastructure | vtg-proposal-builder v4.1 live — Bid due date y-position fixed (y=540, below district/470# line). SOV PDF column: file_mm749nna. Status column: color_mm74qsfe. Deployed at vtg-proposal-builder.vectorfi-admin.workers.dev. |
| Sep 14 | v2.0 | Infrastructure | ScopeStack Template V5 fixes — Rate Adjustments section font corrected from Times New Roman to Calibri (36 occurrences). current_version.name merge field removed (was crashing generator). Blank page after Scope of Work is a ScopeStack limitation — not fixable. |
| Sep 14 | v2.0 | Infrastructure | vtg-sov-builder PDF updates — Meta bar removed from PDF pages. Summary tab header "Location" → "Bid Item". Section headers full-width. Type column: IC for most sections, BMIC for BMIC section. SOV PDF uploads to file_mm749nna on Bids #3 (was wrong column). |
| September 13, 2026 | |||
| Sep 13 | v1.9 | Infrastructure | vtg-materials-log copper SKU catalog complete & in use — 951 copper SKUs (C- prefix) loaded from Mark's inventory list; catalog now 1,031 total (+ 80 fiber F- prefix); all SKUs merged into vtg-sku-catalog KV key. Gap closed. |
| Sep 13 | v1.9 | Fix | vtg-monday-sf-sync patched — RecordTypeId hardcoded to Erate record type (012aZ00000BHkT7QAL); Cross_Sell_Opp__c set to "NO" on all records; stage logic finalized: SKIP stages (no SF upsert, fields-only update if record exists) = New Bid Folder Creation, Folder Creation, Deal Reg, Email, Bid Compilation, Bid Submittal, Bidding, Wins Archive; ACTIVE stages (full upsert incl. StageName) = Bid Building, Awaiting Results, Post-Sale, Post-Monday, Lost. Worker.js moved to VTG Flows\vtg-monday-sf-sync\. |
| Sep 13 | v1.9 | Infrastructure | Salesforce Opportunity record types confirmed — Erate: 012aZ00000BHkT7QAL, Commercial: 012fo000000XSojAAG, RFP: 012fo000000XSqLAAW, VTG RFP: 012fo000000XSrxAAG. Cross_Sell_Opp__c picklist confirmed: --None--, NO, YES. |
| September 10, 2026 | |||
| Sep 10 | v1.8 | Infrastructure | SKU Catalog architecture revised — vtg-sku-catalog is now the single master key containing all vendors merged into one JSON array. Worker reads only this key. Separate vendor keys remain in KV as backups but are not read by loadSKUs(). Fixes disappearing-catalog bug where pushes to individual vendor keys weren't appearing in the SOV Builder. |
| Sep 10 | v1.8 | Infrastructure | Ruckus catalog rebuilt from full Sep 2026 price list — 3,631 SKUs (692 wireless, 1,389 switches, 1,415 licensing, 89 transceivers, 46 accessories). All 4 Ruckus discount tiers now stored per SKU: Bidder VAR (RKS-0436), Driver VAR (RKS-0437), RSD VAR (RKS-0438), E-Rate Takeout (IDC017). Bidder VAR is the default; others selectable at bid time. Actual AP hardware units (R370, R670, R750, R770, T350, T670, T750, etc.) now in catalog with correct pricing. |
| Sep 10 | v1.8 | Infrastructure | vtg-sku-catalog total: 5,042 SKUs — Ruckus 3,631 · VTG Cabling 1,031 · Fortinet 318 · N1C 62. Juniper/Mist excluded (single-customer, not worth catalog maintenance). Vertiv and TP-Link Omada pending price lists. |
| Sep 10 | v1.8 | Infrastructure | ScopeStack eRate SOW Template V3 built — updated company branding (Vector Powered by VTG), FY2027 labor rates (Cabling $110, L1 $195, L2 $225, L3 $265, L4 Negotiated), five office locations in footer. New "Project Management — E-Rate" service (ID 471786) and blueprint (PM-ERATE, ID 6702) created in ScopeStack under eRate > Professional Services. PM blueprint applies to all installation bids; skip for equipment-only. vtg-scopestack-doc-sync template routing still hardcoded to V2 — needs update when V3 is uploaded. |
| September 8, 2026 | |||
| Sep 8 | v1.7 | UI | Slide-out detail panel — replaced bottom-of-page detail section with a slide-in drawer. Click any step card in the diagram to open the panel from the right. Close with ✕, Escape, or clicking the overlay. |
| Sep 8 | v1.6 | New Worker | vtg-sf-account-sync — syncs monday.com Accounts (#1) and Contacts (#2) to Salesforce as Account and Contact objects using Monday_Item_ID__c as external ID. Writes SF Account ID back to UID column (text_mm6s8adk) on Accounts board. Backfill ran against all 791 existing accounts. |
| Sep 8 | v1.6 | New Worker | vtg-scopestack-doc-sync — two-endpoint Worker. Endpoint 1: catches ScopeStack document_status_changed webhook, downloads .docx SOW, routes by template to Bids #3 SOW Document column (file_mm6wm4hn) or El Nova Leads. Endpoint 2: triggered by Generate SOW button (button_mm70vvrb) on Bids #3 to programmatically trigger SOW generation. First confirmed delivery: North Branch Area Schools, 470# 260005778. |
| Sep 8 | v1.6 | Infrastructure | Fortinet catalog added to SKU_CATALOG KV — 318 SKUs (54 HW, 132 UTP bundles, 132 UTP licenses) covering FortiGate FG-30G through FG-900G at MSRP. Added via vtg-sov-builder /admin/skus. |
| Sep 8 | v1.6 | Infrastructure | Live on vtg-process-map.pages.dev — process map deployed to Cloudflare Pages via GitHub (vtg-portal/vtg-process-map). Auto-redeploys within ~30 seconds of any push. URL is permanent and shareable. |
| September 4–5, 2026 | |||
| Sep 4 | v1.5 | New Tool | vsz-lldp-neighbors.py — local Python script that SSHes into Ruckus SmartZone, runs LLDP neighbor discovery across all APs in a zone, exports to timestamped CSV, optionally writes back to AP description. Added to vtg-portal as tool #23. |
| September 3, 2026 | |||
| Sep 3 | v1.4 | Process Change | Intake form redesigned — Sales Executive and ScopeStack Blueprint(s) are now entered inside the vtg-bid-intake form (after accept_470), not before. Blueprint selection in the form triggers ScopeStack proposal creation. Eliminates the pre-accept manual entry step. |
| Sep 3 | v1.4 | Bug Fix | vtg-bid-intake patched — fixed Account/Contact lookup (replaced unreliable items_by_multiple_column_values with items_page + contains_text). Fixed SOV Builder link not being written on form submit. Bond section redesigned with Surety bond read-only. Retries bumped 3→4. |
| Sep 3 | v1.4 | New Worker | vtg-tdsynnex — TD Synnex Partner API OAuth 2.0 integration. Exposes /api/lookup for live contracted pricing. Called internally by vtg-sov-builder via service binding. Falls back to SKU_CATALOG KV for non-TD Synnex items. TOKEN_CACHE KV with auto-refresh. |
| Sep 3 | v1.4 | Update | vtg-sov-builder enhanced — [corrected v2.2: the TD Synnex live pricing, LIVE badge and category filter bar described here were planned but never shipped — see the TD Synnex gap] /admin/skus catalog admin UI. Sep 10 2026: SKU catalog rebuilt — 5,042 SKUs across Ruckus (3,631), VTG Cabling (1,031), Fortinet (318), N1C (62). All 4 Ruckus discount tiers (Bidder/Driver/RSD/Takeout VAR) stored per SKU. Full AP hardware catalog now loaded. |
| Sep 3 | v1.4 | Process Change | Bids #3 column restructure — new 📊 SOV Builder column (link_mm6vbks) created; all 156 existing bids backfilled. Customer Intake Form column (link_mm591mdg) now dedicated to intake form links only. vtg-bid-intake stamps both columns on new bid creation. |
| August 25–30, 2026 | |||
| Aug 30 | v1.3 | Doc | Process map published — initial 7-tab HTML document covering E-Rate, Commercial, and E-Rate Op System tracks. Includes Flow Diagram, Written SOP, Gap Analysis, Workers, Glossary, Automations, and Dashboards tabs. |
| Aug 27 | v1.2 | Update | |
| Sep 15 2026 | vtg-ns-mcp-sync — inventory cache endpoints live — /api/inventory (location 41, feeds vtg-materials-log On Hand column) and /api/inventory/all (all locations, feeds vtg-inventory dashboard) added. INVENTORY_CACHE KV (ID: 0233a14225194cbd81a49601f448963b) shared between both consumers. Cron refreshes both keys every 15 min. NS VTG API Sync role permissions added: Lists → Items (Full), Lists → Locations (View), Reports → Inventory (View). | ||
| Sep 15 2026 | vtg-inventory dashboard live — Company-wide NS inventory dashboard at vtg-inventory.pages.dev (Cloudflare Pages, GitHub repo vtg-portal/vtg-inventory). Password protected (VTG2026, Azure AD SSO planned). All NS locations: 41 Cabling Warehouse, 42 Secondary Warehouse, 4 Grand Rapids Office. Features: search, location filter pills, sortable columns, light/dark mode toggle, CSV export. Fetches live from vtg-ns-mcp-sync /api/inventory/all. | ||
| Sep 15 2026 | vtg-materials-log v3 — NS Inventory On Hand column added to parts table; color-coded badges (green/yellow/red) from NS location 41 (Cabling Warehouse) via shared INVENTORY_CACHE KV; UID (text_mm76zvbz) and NS Sales Order # (text_mm6hv20b) added to project card; On Hand loading from KV — no direct NS API call on page load. | ||
| Aug 27 | v1.2 | New Worker | vtg-revenue-month-sync — fires on Projects #4 Timeline column change, extracts end date, writes to Revenue Month (date_mm39fh8x). Skips Closed items and cleared timelines. |
| Aug 27 | v1.2 | New Worker | vtg-msp-csop — Commercial/non-E-Rate CSOP form deployed. Bypasses Bids #3 and El Nova entirely. Creates Projects #4 item directly with task list subitems built from form fields. |
| Aug 27 | v1.2 | Infrastructure | Cabling Install Scheduler board — new monday.com board (ID 18427983069) for 10-person crew scheduling. 4 stage groups, 33 jobs pre-loaded, 2 automations (tomorrow reminder + crew assignment notification). |
| Aug 25 | v1.1 | New Worker | vtg-po-sync — syncs NetSuite PO numbers and approval status back to Projects #4. Webhook on NS SO# column change + cron every 4h. KV: PO_SYNC_KV. |
| Aug 25 | v1.1 | New Worker | vtg-ns-so-backfill v2 — ongoing sync Worker (cron every 4h) for NetSuite Sales Order numbers into Projects #4. v2 uses UID-exact matching (text_mm76zvbz → NS custentity_acs_unique_entity_identifier) as primary strategy; fuzzy name fallback. First sync wrote 43 SO numbers on Sep 14 2026. |
| Aug 25 | v1.1 | Gap Resolved | NS process documentation — vtg-ns-audit Node.js tool built. First-ever NetSuite process documentation for VTG via OAuth 2.0 M2M + SuiteQL. Generated self-contained HTML report tying NS data to each process step. |
| Prior to August 25, 2026 | |||
| Aug 13 | v1.0 | New Worker | vtg-monday-sf-sync — Bids #3 stage changes sync to Salesforce as Opportunity upserts via Monday_Item_ID__c external ID. First SF record: Shaker Heights City School District. |
| Aug 13 | v1.0 | Infrastructure | vtg-ns-mcp-sync auth live — NetSuite production OAuth 2.0 M2M auth established. Six bidirectional sync flows coded. Blocked on customer ID mapping (vtg-ns-compare) and NS service item ID. |
| Ongoing | v1.0 | New Worker | vtg-cs-form — CS Order Processing form generated and emailed to erateops@vectortechgroup.com when Bids #3 moves to Post-Sale. KV-based deduplication. monday subitem auto-created. |
| Ongoing | v1.0 | New Worker | vtg-sov-builder — SOV quoting tool for sales. Multi-tab buildings, SKU catalog, section types, per-row labor, markup overrides, jsPDF generation, upload to Bids #3 Files column. |
| Ongoing | v1.0 | New Worker | vtg-bid-intake — triggered by accept_470. Creates Bids #3 item, auto-links Account/Contact, serves intake form, handles bond creation. Core of the E-Rate lead intake flow. |
| Ongoing | v1.0 | New Worker | vtg-materials-log — cabling materials accounting for Projects #4. PM submits fiber/copper parts on stage → Installing. Auto-advances to Ready for Invoicing and fires billing notification email. |
| Ongoing | v1.0 | New Worker | vtg-account-logo — scrapes district website for logo, falls back to Clearbit, uploads to Accounts board logo column. Backfill ran against 786 existing accounts. |