Agent setup guide
Subcontractor Bid Leveler
Levels your subs' bids for a package — scope gaps, exclusions, outliers and questions per sub — in a Notion page and a Slack summary.
What it does
Levels your subs' bids for a package — scope gaps, exclusions, outliers and questions per sub — in a Notion page and a Slack summary.
- Starts when your own form or tool posts a bid package (package, project, scope notes) to the agent's webhook.
- Reads that package's bids from your Google Sheet: base bid, alternates, inclusions, exclusions and qualifications per sub.
- AI levels the bids against what a complete bid for the trade must include: scope gaps, exclusions, % from the median, outliers and questions to ask each sub.
- The median and each bid's % from it are recalculated in code before anyone sees them — never by the AI; anything the AI got wrong is corrected in the Notion page and the Slack summary and recorded in the run.
- Creates the full comparison as a page in your Notion bid-leveling database.
- Posts a short summary with the link to your Slack channel.
What it needs
- A paid plan (agents run live on paid plans).
- An AI provider key (Settings → AI Providers).
- Google Sheets, Notion and Slack, connected in Settings → Integrations.
- A bids sheet with one row per sub bid, and a way to post the package name to the webhook (your form, tool or a script).
What it doesn't do
- It reads bid details typed into the sheet, not PDF bid files.
- It never adjusts prices with numbers of its own: gaps are described as questions and risks, not priced.
- It doesn't choose or award the sub, and it doesn't contact subs — your PM does.
- It isn't an estimate or a takeoff; it compares the bids you received.
Availability and plans
Available
Its workflow is built and tested, and every app it needs is live. You can get it and set it up now.
Included free on the Enterprise plan; on other paid plans it's a one-time purchase per workspace (the price is on the Agents page). The Agents page in the app always shows its current status.
Before you start
- A paid plan: agents run live, and the Free plan only runs Dry Runs.
- An AI provider key (OpenAI, Anthropic, Google and more) in Settings → AI Providers. AI usage is billed by your provider.
- These apps, connected in Settings → Integrations: Google Sheets, Notion and Slack.
- A form, app or system that can send each new item to a webhook URL (the agent starts from a webhook).
- About 20 minutes.
Set it up step by step
Get the agent first (buy it, or it's already yours when your plan includes it), then in Agents → My agents press “Set up this agent”. That creates the agent's workflow in your workspace (it counts towards your plan's workflow limit) and opens the canvas with a setup checklist above it. Each item links to the exact place to go and ticks itself off when it's done.
1. Connect your AI provider
The AI steps run on your own key (OpenAI, Anthropic, Google and more). Add one in Settings → AI Providers.
2. Connect Google Sheets
Connect the Google account that can open your bids sheet (Settings → Integrations → Google Sheets).
3. Connect Notion
Connect Notion and share your bid-leveling database with Fluxo Flow (Settings → Integrations → Notion).
4. Connect Slack
Connect the Slack workspace your precon team uses (Settings → Integrations → Slack).
5. Describe your bids sheet and complete bids
Open “Level the bids” and replace the placeholder with your columns, complete-bid checklists and outlier threshold.
| Setting | What to enter | In step |
|---|---|---|
| Your bids sheet and complete-bid checklist | Replace the placeholder with your company name, the columns of your bids sheet, what a complete bid must include for the trades you buy (e.g. drywall: framing, board, taping to level 4, corner bead, cleanup, dumpsters) and your outlier threshold (e.g. 15% from the median). It starts as “[DESCRIBE YOUR COMPANY, YOUR BIDS SHEET COLUMNS, WHAT A COMPLETE BID MUST INCLUDE FOR EACH TRADE AND HOW FAR FROM THE MEDIAN COUNTS AS AN OUTLIER HERE]” until you replace it. | “Level the bids” |
6. Pick your bids sheet
Open “Read the bids sheet” and pick the account, spreadsheet and tab.
| Setting | What to enter | In step |
|---|---|---|
| Google account (bids sheet) | The Google account that can open your bids sheet. Pick your connected Google Sheets account. | “Read the bids sheet” |
| Bids spreadsheet | Paste the link of the spreadsheet with your bids. | “Read the bids sheet” |
| Bids tab | The tab with one row per sub bid, e.g. “Bids”. | “Read the bids sheet” |
7. Pick the Notion database
Open “Create the comparison page in Notion” and pick your account and database.
| Setting | What to enter | In step |
|---|---|---|
| Notion workspace | The Notion workspace with your bid-leveling database. Pick your connected Notion account. | “Create the comparison page in Notion” |
| Bid-leveling database | The database each comparison becomes a page in (title property “Name”). Share it with Fluxo Flow first: ••• → Connections. | “Create the comparison page in Notion” |
8. Pick the Slack channel
Open “Post the summary to Slack” and pick your account and channel. Invite the app to private channels first (/invite @Fluxo Flow).
| Setting | What to enter | In step |
|---|---|---|
| Slack account | The Slack workspace your precon team uses. Pick your connected Slack account. | “Post the summary to Slack” |
| Precon channel | Where the summary is posted, e.g. #precon or the project channel. | “Post the summary to Slack” |
9. Test it with Dry Run
Press Dry Run: the agent runs on sample data with no messages sent and nothing written to your apps.
10. Switch the trigger on
Open the trigger and switch the webhook on. Copy its URL and secret into the form or tool that sends bid packages.
How it works
The agent is a normal workflow with 7 steps (1 AI step). You can open, edit and monitor it like any other workflow.
- Level a bid package — Starts when your form or app sends data to the agent's webhook URL. Starts when your own form or tool posts the bid package to level (package name, project, scope notes) to this agent's webhook URL.
- Read the bids sheet — Google Sheets: Read rows. Reads your bids sheet: one row per sub bid with package, subcontractor, base bid, alternates, inclusions, exclusions, qualifications and notes.
- Level the bids — AI step (runs on your AI provider key). AI takes the bids for this package only and levels them: scope gaps against what a complete bid must include, exclusions, outliers, and the questions to ask each sub before you choose. The median and each bid's % from it are recalculated in code in the next step.
- Check the math — Step. Recalculates the median of the base bids and each bid's % from the median in code — not by AI — writes the correct figures into the Notion comparison and the Slack summary, and records anything the AI got wrong in math_check.
- Create the comparison page in Notion — Notion: Create a page in a database. Creates a page in your bid-leveling database with the side-by-side comparison, gaps, exclusions and questions per sub.
- Post the summary to Slack — Slack: Post a message. Posts the short comparison (base bids, % vs median, gaps, outliers) with the link to the Notion page.
- Leveled — Kept in the run history. The run history keeps the leveling and the Notion link. The PM chooses the sub.
Test it with Dry Run
Press Dry Run in the canvas. The agent runs on the sample data stored on its trigger (the “Sample data for Dry Run” box), so you can check every step's output before anything is live. Edit the sample to match the fields your own form or app sends.
Sample data fields
bid_package, project, scope_notes, requested_by.
- Nothing is sent or written: app actions, emails and Slack posts are simulated, and AI steps don't call your AI provider.
Go live
- Open the trigger and switch the webhook on. Copy its URL and secret into the form or tool that sends bid packages.
- The webhook is protected by a secret: send it in the header shown in the Activation panel (requests without it are refused with 403). Each request starts one run.
- The setup checklist adds a “paid plan” item before activation: live runs need a paid plan (the Free plan only runs Dry Runs).
- When every checklist item is done and the trigger is on, the checklist says “Live — this agent is running”. Follow its runs in the workflow's History tab and in Analytics → Agents.
Questions
Can it read PDF bids?
No. It reads bid details typed into your Google Sheet (one row per bid: package, sub, base bid, alternates, inclusions, exclusions, qualifications). Copy the key lines from each bid form into the sheet.
How do I start it?
Post JSON like {"bid_package": "09 29 00 Drywall", "project": "Maple Street Clinic", "scope_notes": "Level 4 finish, includes fire-rated assemblies", "requested_by": "Dana (PM)"} to the webhook URL shown in the trigger's Activation panel, from your own form, a button in your project tool or a script.
Can the AI get the median or the percentages wrong?
Not in what your team sees: after the AI levels the bids, the median of the base bids and each bid's % from it are recalculated in code and written into the Notion page and the Slack summary. The outlier flag is still the AI's call against your threshold, so glance at it against the checked %.
Does it pick the winning sub?
No. It compares the bids and lists the questions to ask; your PM chooses the sub and awards the work.
Troubleshooting
- “No AI provider connected” or a rejected key: connect or fix the key in Settings → AI Providers, then press Test there.
- A checklist item stays unticked: the setting is still empty or still contains its placeholder text. Open the step from the checklist and fill it in.
- An app step fails with “Needs reconnect”: the account's access was revoked or expired. Reconnect it in Settings → Integrations.
- Slack says the app isn't in the channel: in Slack, type /invite @Fluxo Flow in that channel (always needed for private channels).
- Nothing happens when your form sends data: check the webhook is switched on and the request carries the secret header (403 means it's missing or wrong).
- A step failed: open the run in History and check that step in the Trace tab for the error and what it received.
Generated from the agent's own workflow, so it always matches what the agent does. Last updated .