I am building a system to help automate as much as possible of the RFP response process for my busninesses, K&S Music and RS Berkeley. Responding to school RFPs is a big source of revenue opportunity for us. Unfortunately, each bid response take a lot of time I have found. I have automated some of this to date using a google sheet and some claude agents, but this is getting VERY cumbersome and difficult to use. Having 6 bids under my belt now, I would like to move to a more mature setup, integrating this as a module within my RSB platform.
In general, I would like to leverage as much of my current data schema as possible and existing db tables, but building on this to support this new module. I imagine that I plus 2 other employees will be the main users of this module. I have not yet decided if this should just be tab in the existing admin or its own URL and package. I am open to suggestions on that.
We mostly get RFPs to evaluate for participation in 2 ways: Through RFP schoolwatch emails, which provide us downloadable csvs daily that looks like this:
RFPSchoolwatch_Daily_Bid_Alert_20260306.csv
The other way we get bids is through documents that are emailed to us.
I am breaking the overall into these stages:
1) Track & Evaluate RFPs
2) Decide Which Models to Bid Against Competitors
3) Create Marketing Comparison Content
4) Prepare Bid Documents
5) Report on Won or Lost Bids
We should be using the current supabase db and relying on claude agents for the AI work needed and otherwise follow the ther patterns established in my existing rsb-platform.
For each RFP we need to extract this data:
# of brass, woodwind, string (minus guitars), percussion, or keyboard instruments.
Bid Due date
Bid Award date:
Days Allowed For Delivery:
Earliest possible delivery date
If alternates allowed for the instruments. In some cases alternates may only be allowed on some, in which case we should just flag as "Some"
If any prohibited brands
Samples required for alternates?
Service and warranty requirements
Document links
Source of the bid: (RFP Schoolwatch, etc)
State:
Institution / School / Cooperative
Special Setup / Delivery Requirements?
Special Repair Requirements?
Bid URL:
Document URL:
Attached Documents:
Attach any and all bid documents. These will be either PDFs or excel files.
Based on this we should determine if this is biddable. A bid is biddable if:
# of brass, woodwind, string (minuss guitars) is > 5
And alternates are allowed
AND RS Berkeley is not a prohibited brand
For biddable documents we should determine the format for the bid required:
Electonic only
Electronic + Paper
Paper Only
Then there should be a notes section with a log that keeps all notes on a particular bid like a case manaagement system.
Then each bid should be able to have a status:
Done - Submitted
Not a Good Fit
Not A Good Fit Reason:
No Instruments in Our Categories
No Alternates Accepted
Disqualifying Service or Delivery Requirement
Other (specify with text)
Not Submitted
Not Submitted Reason:
No Time
No Inventory
Evaluate Further
Ready to Bid
Wait or Hold
Proposed workflow:
There should be a main screen with a list of RFPs. Each RFP should have a unique ID. Each RFP can be opened so you can look at the details.
The RFPs can be added manually by the user or by a claude agent.
Manually added bids would occur by uploading documents for the bid. Then an AI claude agent will scan the docs to create the bid listing and fill in all the fields above as well as suggest a status.
For bids added by a claude agent: A claude agent should review the inbox every day in the morning and add RFPs to the list. From the xls list they should be able to:
Search for the RFP bid documents. Check the "Document URL" first, then the "Bid URL". If neither has documents then the agent should add them to the list as "Evaluate Further".
If the agent does find the bid documents then the agent should make a determination of the status (Ready to Bid, Not a Good Fit, or Evaluate Further) based on the info. If Not A Good Fit the agent should fill out the Not a Good Fit Reason. All the data fields above should be filled by the agent in either case.
Any RFP added to the list with "Ready to Bid" by the agent should have a "Needs Review" flag that will have to be cleared manually by the user. The user can also always change the status if they want to something else.
Once an RFP is Ready to bid the user will click "Start Bidding"
Doing this should extract the details items they are requesting bid on into a list/table.
Each item should have a unique identifier. Usually their documents have an ID or identifier so we should use that, otherwise use our own.
The items will have a specific brand, model, and description they will be asking for bids on. For example, Yamaha YAS-26 Alto Sax.
The Start Bidding should also run an API search through my serpAPI account on google shopping to search for the MAT prices for this instrument ideally on sweetwater.com, amazon.com, or musiciansfriend (in that priority order). If not that, then whatever else shows up on google shopping API. That price should be captured, as well as an assumed discoutned price, which would have a 35% discount.
Also, a claude agent should do a search for the competitor brand model and insert:
URL of the instrument on the manufacturer website
URL to the image of the instrument
Any specs for that instrument
Then the user would be able to go through each biddable item, look at the instrument, look at the prices, and determine which of our instrument models to bid.
To help the user decide which of our models to bid we should have a table in the DB somewhat similar to the Competitor Model Mapping tab here. https://docs.google.com/spreadsheets/d/112IbuuKZHPhIUe9pEkQJcKUrjOVuRvkGjzW1t5zfkDc/edit?gid=1680003689#gid=1680003689
Basically we need to associate each competitor brand item that is being asked to bid on with one OR MORE mulltiple midels of ours that we think we should be able to bid against this one. The system should "suggest" things to the user as follows:
Based on the data in the spreadsheet that we have assembled above
Based on the specifications in our catalogue. We shoud have a table like this: https://docs.google.com/spreadsheets/d/1yRFcqwKKOq168BvTpd6fQLthKidQkiQo60s4reS1LpY/edit?gid=0#gid=0
This table should probably be integrated into the overall products db table we have already somehow
Based on these specifications a claude agent should compare our specs to the competitor model specs and make suggestionrs
The user could manually choose to bid something else, in which case we should ask the user if we should include this model as a suggested model to bid in the future for this
For each suggested model to bid the user should be able to see
# available in inventory
MAT price
If that instrument has won or lost historically against the competitor brand model (we will putting results of our bids into the system later, ie won or lost)
Once the user chooses what to bid they should be able to see profit margins. The profit margins should be calculated based on:
Cost of the instrument
1 hour of setup time
.5 hours on average of fix time and service
Estimated Freight Shipping cost times 1.1
Our goal is to aim for at least 50% margin and to be at least 20% cheaper than what we think the competitor models will bid