What looks like a folder is actually a factory.
ItemBridge is an automated pipeline that turns Excel item-request files into live items in our ERP, with no manual data entry. It watches a folder, cleans and validates incoming data, calls the ERP, drives the browser for follow-up tasks the API doesn't expose, and cross-checks every item with an independent AI classifier.
From the outside, it's a single instruction: drop an Excel file in a folder, items appear in the ERP. Underneath, every drop kicks off ~25 coordinated steps across seven external systems, seven concurrent background workers, and three layers of failure recovery. This page walks through the layers, simple to complex.
in watch folder] --> B[Processed] B --> C[Items live
in the ERP] classDef simple fill:#1e1b4b,stroke:#a78bfa,stroke-width:2px,color:#f1f5f9; class A,B,C simple;
02What's actually happening
The headline workflow. A single Excel item-request file moves through detection, cleaning, matching, template generation, ERP import, browser-driven follow-up, and a background AI cross-check before being archived. Eight phases, dozens of decisions, all invisible to the operator.
preserve inch and foot marks] C2[Normalize Product IDs
strip CUT REEL suffixes] C3[Enforce 38-char Product ID limit] C4[Format-validate vendor codes
+ duplicate detection] C5[Build RFI cable descriptions] C1 --> C2 --> C3 --> C4 --> C5 end subgraph Match["3 - Match"] direction TB M1[Manufacturer fuzzy match
cache then ERP then auto-create] M2[Item-group resolution] M1 --> M2 end subgraph Generate["4 - Generate"] G1[Append rows to ERP template
preserve formulas & formatting] end subgraph API["5 - Import"] direction TB A1[Acquire concurrency permit] A2[Create item in ERP] A3{Success?} A4[Increment success window] A5[Honor rate-limit cool-off
halve permit ceiling] A1 --> A2 --> A3 A3 -- yes --> A4 A3 -- 429 / 5xx --> A5 A5 -.feedback.-> A1 end subgraph Browser["6 - Automated Follow-up"] direction TB B1[Cost calc on ERP web UI] B2[Mark request complete
in SharePoint] B1 --> B2 end subgraph Async["7 - AI Cross-Check"] direction TB L1[Pure extractor] L2[Blind AI classifier
per item, no requestor hint] L3[Audit log + flag mismatches] L1 --> L2 --> L3 end subgraph Done["8 - Archive"] Z1[Move to backup
auto-cleanup after 24h] end Start --> Detect --> Clean --> Match --> Generate --> API A4 --> Browser A4 -.async.-> Async Browser --> Done classDef extSys fill:#2a1a3d,stroke:#f472b6,stroke-width:1.5px,color:#fce7f3; classDef async stroke-dasharray: 5 3,fill:#0e2a3d,stroke:#22d3ee,color:#cffafe; classDef decision fill:#1e1b4b,stroke:#a78bfa,stroke-width:2px,color:#ede9fe; class A2,B1,B2,L2 extSys; class Async,L1,L2,L3 async; class A3 decision;
03In the background
While the headline flow runs, six other workers are operating concurrently. Each one was split out for a specific reason: keep the watcher fast, keep the UI responsive, keep external conversations tunable.
routing hub] Main --> W2[Browser orchestrator
async event loop] Main --> W3[AI matching worker
per-batch classifier] Main --> W4[OneDrive tracker
polls sync folder] Main --> W5[OneDrive extractor
caches xlsx data] Main --> W6[Adaptive parallelism
state sync + probe] Main --> W7[Stats sync
local to cloud] classDef worker fill:#0e2a3d,stroke:#22d3ee,stroke-width:1.5px,color:#cffafe; classDef ent fill:#1e1b4b,stroke:#a78bfa,stroke-width:2px,color:#ede9fe; class Main ent; class W1,W2,W3,W4,W5,W6,W7 worker;
04Four lanes, one folder
The headline flow is one of four distinct pipelines. Each new file is inspected with multiple signals (named ranges, embedded session IDs, filename patterns) to decide where it goes. Each lane has different downstream consequences.
in watch folder] --> R{Router} R -->|item request| P1[Item Request] R -->|item master export| P2[Item Master] R -->|manufacturer master export| P3[Manufacturer Master] R -->|manufacturer lookup| P4[Manufacturer Lookup] P1 --> O1[Full pipeline
+ Cost calc
+ SharePoint mark
+ AI check] P2 --> O2[Status check
+ auto-cleanup] P3 --> O3[Build template
+ Browser import] P4 --> O4[Convert to YAML
+ Upload to cloud cache] classDef route fill:#1e1b4b,stroke:#a78bfa,stroke-width:2px,color:#ede9fe; classDef out fill:#0e2a3d,stroke:#22d3ee,color:#cffafe; class R route; class O1,O2,O3,O4 out;
A fifth path, the review-then-process flow, layers on top: files appearing in the OneDrive folder are passively cached, the operator reviews them in SharePoint, then batch-selects in the live dashboard to run them through the Item Request pipeline.
05When things go wrong
The ERP has bad days. Rather than fail the operator's batch, three resilience layers absorb transient pain: a circuit breaker, an offline queue, and an adaptive parallelism loop. Together they let the system ride through outages without operator intervention.
Circuit breaker
Offline queue
e.g. network down| Q[Disk-backed queue] Q --> R[Periodic retry
up to 3x with backoff] R -->|success| OK R -->|still failing| Q classDef done fill:#052e29,stroke:#34d399,color:#d1fae5; classDef bad fill:#3b0a0a,stroke:#f87171,color:#fee2e2; class OK done; class Q bad;
Adaptive parallelism
in window] -->|+1 permit| Limit[Permit limit] Limit --> Calls[Parallel calls] Calls -->|429 or reset| MD[half it
+ cool-off] MD --> Limit Probe[Periodic upward probe] --> Limit Limit <-->|merge across operators| S3[(Shared state)] classDef cloud fill:#2a1a3d,stroke:#f472b6,color:#fce7f3; class S3 cloud;
06The systems we touch
Seven external systems. Each is a separate authentication, a separate failure mode, and a separate vocabulary the system translates between in real time.
item / manufacturer create + lookup] Center --- I2[ERP web UI
cost calc, manufacturer import] Center --- I4[SharePoint
mark-complete on requests] Center --- I5[Cloud storage
cache, stats, shared state] Center --- I6[AI provider
blind item-group classifier] Center --- I7[OneDrive
review-then-process source] Center --- I8[Version control
update banner] classDef center fill:#1e1b4b,stroke:#a78bfa,color:#fff,stroke-width:2.5px; classDef ext fill:#2a1a3d,stroke:#f472b6,color:#fce7f3; class Center center; class I1,I2,I4,I5,I6,I7,I8 ext;
07Across operators
Multiple operators on different machines run the system at the same time. Rather than conflict, they share state through cloud storage so decisions made on one machine carry over to the next.
laptop] <-->|read / merge| S3[(Shared state)] B[Operator B
laptop] <-->|read / merge| S3 C[Operator C
laptop] <-->|read / merge| S3 S3 --- D1[Manufacturer cache] S3 --- D2[Per-machine + aggregate stats] S3 --- D3[Adaptive parallelism limit] classDef op fill:#1e1b4b,stroke:#a78bfa,color:#ede9fe; classDef cloud fill:#2a1a3d,stroke:#f472b6,color:#fce7f3; class A,B,C op; class S3 cloud;
08What the operator sees
Eight live monitoring screens plus a separate web dashboard. Each one is a focused tool for one kind of decision, not a generic log viewer.
09By the numbers
A quantitative read on the system. All counts taken directly from the codebase.
across the project
integrated
workers
pipelines
+ 1 web dashboard
rules
circuit breaker, offline queue, adaptive parallelism
across 32 test files
10From drop to done
A single Excel file lands in a folder. By the time the operator sees the green checkmark, the system has classified it, cleaned 35 kinds of bad data, matched manufacturers fuzzy across a local cache, called the ERP under a self-tuning permit, driven a real browser through the steps the API doesn't expose, marked the request complete in SharePoint, and asked an AI to second-guess the classification, all while writing stats to shared storage so the next operator's work picks up where this one left off.