BidDelta — SAM.gov Material Change Monitor
Pricing
Pay per usage
BidDelta — SAM.gov Material Change Monitor
Free beta for capture and proposal teams: BidDelta compares saved SAM.gov opportunity snapshots and flags deadline, status, contact, award, and attachment-metadata changes with source-linked before-and-after evidence. No BidDelta fee; Apify usage applies. Contact: contact@optimusconnections.net
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Jeremy DeCoste
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
SAM.gov Amendment & Change Alerts — BidDelta
Know the moment a federal solicitation you're pursuing changes. Paste your SAM.gov opportunities. BidDelta checks them on your schedule and tells you, in plain English, what changed: deadline extensions, new or replaced amendment attachments, Q&A postings, contact changes, set-aside changes, cancellations and awards. Every alert links to the official notice and shows before/after values.
✅ No SAM.gov API key needed · ✅ Alerts your way: email, Slack, Teams, Discord, Telegram, SMS, phone push, Google Sheets, calendar, webhooks · ✅ Free beta: no BidDelta fee (Apify usage is typically pennies a month)
Built for capture managers, proposal teams, BD consultants and APEX counselors who are tired of refreshing SAM.gov or waiting on late "Follow" emails.
Quickstart (2 minutes)
- See a sample alert. Set Mode → Try a sample alert, then click Start. In about 5 seconds the dataset shows a realistic (fictional) amendment: the deadline moved +7 days, a new Q&A attachment, a replaced Statement of Work, and a new contact.
- Watch your real solicitations. Set Mode → Monitor. Paste SAM.gov links, notice IDs or solicitation numbers into Solicitations to watch, one per line. Click Start. The first run saves a baseline ("Baseline saved for N opportunities").
- Get alerts. Open Notification channels and fill in any mix: email, Slack, Teams, Discord, Telegram, ntfy or Pushover push, SMS (your Twilio or Telnyx account), Google Sheets, Google Calendar, or a Make/Zapier/n8n webhook. The fastest free option is the ntfy app plus a random topic name. Then go to Schedule in Apify Console and run it twice a day. The run output prints the cron line and an estimated monthly cost.
That's it. When nothing changed you'll see "No changes since last run". That's good news, not an error.
What an alert looks like
🔴 "Trade and Cargo Academy": the deadline moved from Oct 30, 2026, 1:00 PM ET to Nov 6, 2026, 12:00 PM ET (+7 days); 1 new attachment (261013 - CSSPTF Drawings - Amendment.pdf); and 1 attachment was replaced (261013 - CSSPTF Specifications - Amendment.pdf). https://sam.gov/opp/13462258eead408fbd0a9df699c67de6/view
Each dataset row also carries eventId (stable, for de-duplication), severity, reviewPriority, whyItMatters, changes[] with before/after values, attachmentDiff (added / replaced / removed) and the official notice link.
What BidDelta watches
| Change | Severity |
|---|---|
| Response deadline moved | critical |
| Cancelled / inactive | critical |
| New, replaced or removed attachments (amendments, Q&A, SOW, pricing sheets) | high |
| Set-aside, notice type, solicitation number | high |
| Award details (awardee, amount, date) | high |
| Description text edited, point of contact, place of performance, NAICS/PSC, title | medium |
| New opportunity matching a saved search | high |
Inputs
| Field | What to put |
|---|---|
| Mode | Monitor (live) or Try a sample alert |
| Solicitations to watch | SAM.gov URLs, notice IDs, or solicitation numbers |
| Also watch searches (optional) | e.g. [{"id":"hvac-tx","naicsCode":"238220","state":"TX"}]. Filters: keywords, naicsCode, state, setAsideCode, noticeTypes. Newest 25 matches each. |
| Notification channels (optional) | Email · Slack · Teams · Discord · Telegram · ntfy · Pushover · SMS (Twilio/Telnyx) · Google Sheets · Google Calendar · .ics deadline feed · webhook. Plus alert and SMS minimum severity, and "ping when nothing changed". |
| How often will you schedule it? | Picks the cron line and cost estimate shown in the output |
| AI summaries (optional) | Your own OpenAI-compatible key. Plain-English summaries are already built in for free. |
| Advanced | monitorId (use one per watchlist), sourceMode, your own samApiKey, legacy settings |
Cost
- BidDelta fee: $0 during beta. You only pay Apify platform usage. The Apify free plan includes $5/month.
- Rough usage at 256 MB: ~10 watched notices twice a day on weekdays ≈ $0.01–0.05/month. Hourly ≈ $0.20–1/month. Each run's
OUTPUT.scheduleshows the estimate for your watchlist. - Email alerts call Apify's
send-mailActor, which adds a tiny amount of usage. SMS is billed by your own Twilio or Telnyx account (≈$0.01/text), and only urgent changes are texted by default. - AI summaries (optional) are billed by your LLM provider. With gpt-4o-mini that's about $0.0001 per change.
Deadline calendar
Every run keeps a subscribable .ics calendar of your watched response deadlines, with a 2-day reminder. Subscribe once in Google, Outlook or Apple Calendar and the events move when SAM.gov deadlines move. The link is in OUTPUT.calendarFeedUrl.
Alert channels & integrations (Make, Zapier, n8n)
Step-by-step setup for every channel, including copy-paste Google Apps Script for Sheets and Calendar, is in Channel setup guide at the bottom of this page. For Make, Zapier or n8n, paste your webhook URL into 🔗 Webhook. BidDelta POSTs {monitorId, eventCount, summary, events[]} only when something changed. Alternatively, use Apify's native Make, Zapier or n8n apps with the "Actor run succeeded" trigger and read the dataset.
Good to know
- Data source: BidDelta reads the same public data that powers sam.gov notice pages, so no key is needed. If you prefer the official SAM.gov API, add your own key under Advanced; saved searches then use it.
- "Missing" is not "cancelled." If a notice disappears from a search, BidDelta reports it only after repeated misses, and never calls it cancelled unless SAM.gov says so.
- Always verify on SAM.gov before changing a bid decision. BidDelta does not download or read attachment contents. It detects new and replaced files by their SAM.gov file IDs and sizes.
- Existing tasks and schedules from v0.2 keep working unchanged.
- BidDelta is independently maintained and is not affiliated with or endorsed by GSA or SAM.gov.
Feedback
This is a free beta and real feedback shapes it. Open the Issues tab and tell us what you watched, what was useful or wrong, and what you'd pay for. You can also email contact@optimusconnections.net. Built by Optimus Connections.
Channel setup guide
Mix any channels you like. They are all optional and live in the Notification channels section of the input. Alerts are sent only when something changed at or above Alert minimum severity. Turn on Also ping when nothing changed to test a channel or to get a daily "all quiet" message. A broken channel never fails the run. Check OUTPUT.notifications.results for per-channel status. Secrets (tokens, webhook URLs) are stored encrypted by Apify.
| Channel | Cost | Account needed | Fields |
|---|---|---|---|
| tiny Apify usage | none | notifyEmail | |
| Slack | free | Slack workspace | slackWebhookUrl |
| Microsoft Teams | free | Teams | teamsWebhookUrl |
| Discord | free | Discord server | discordWebhookUrl |
| Telegram | free | Telegram | telegramBotToken, telegramChatId |
| ntfy push | free | none | ntfyTopic (+ ntfyServer, ntfyToken) |
| Pushover push | one-time app purchase (≈$5) | Pushover | pushoverUserKey, pushoverAppToken |
| SMS (Twilio or Telnyx) | ≈$0.008–0.01/SMS on your account | Twilio/Telnyx | smsProvider, smsAccountId, smsAuthToken, smsFrom, smsTo, smsMinSeverity |
| Google Sheets log | free | googleSheetsWebhookUrl | |
| Calendar (.ics feed) | free | none | calendarFeed (on by default) |
| Google Calendar events | free | googleCalendarWebhookUrl | |
| Webhook (Make, Zapier, n8n, custom) | free | your tool | webhookUrl |
Enter your address in 📧 Email. BidDelta calls Apify's apify/send-mail Actor, which adds a tiny amount of Apify usage. Email alerts also include your deadline-calendar link.
Slack
Slack → Apps → Incoming Webhooks → Add to Slack. Pick a channel, then copy https://hooks.slack.com/services/… into 💬 Slack.
Microsoft Teams
In the channel: ⋯ → Workflows → "Post to a channel when a webhook request is received". Finish the wizard and copy the URL into 🟦 Teams. BidDelta sends an Adaptive Card with an "Open on SAM.gov" button. (Older "Incoming Webhook" connector URLs also accept this format while Microsoft still supports them.)
Discord
Server Settings → Integrations → Webhooks → New Webhook, pick a channel, then Copy Webhook URL into 🎮 Discord. Messages never @mention anyone.
Telegram
- In Telegram, message @BotFather, send
/newbot, and copy the token into ✈️ Telegram bot token. - Send any message to your new bot (or add it to a group), then open
https://api.telegram.org/bot<TOKEN>/getUpdatesand copychat.idinto ✈️ Telegram chat ID. Group IDs start with-.
ntfy (free phone push, no account)
- Install ntfy (iOS/Android) or open https://ntfy.sh/app.
- Subscribe to a long random topic, e.g.
biddelta-7f3k9q2x, and put the same name in 🔔 ntfy topic. Anyone who knows the topic can read it, so make it hard to guess, or use a token with a protected topic or a self-hosted server. Critical changes are sent at high priority, and tapping the notification opens the SAM.gov notice.
Pushover
Copy your User Key from pushover.net. Create an app at https://pushover.net/apps/build and copy its API Token. Critical changes use priority 1.
SMS: Twilio or Telnyx (your own account)
SMS is for urgent changes only. SMS minimum severity defaults to high: deadline moves, cancellations, new or replaced attachments, set-aside and award changes. Texts are capped at 320 characters, and at most 5 recipients.
- Twilio: provider
twilio. Set the Account SID (AC…) in Twilio Account SID, the Auth Token in auth token / API key, your Twilio number in From, and recipients in Send texts to (+15551234567). - Telnyx: provider
telnyx. Put your API key (v2) in auth token / API key, your Telnyx number (assigned to a messaging profile) in From, and recipients in Send texts to. US numbers usually need A2P 10DLC or toll-free verification with your provider before texts are delivered.
Google Sheets (append a row per change)
- Open or create a Sheet → Extensions → Apps Script, and paste:
function doPost(e) {const body = JSON.parse(e.postData.contents);const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BidDelta')|| SpreadsheetApp.getActiveSpreadsheet().insertSheet('BidDelta');if (sheet.getLastRow() === 0) sheet.appendRow(body.header);const seen = new Set(sheet.getRange(1, 8, Math.max(sheet.getLastRow(), 1)).getValues().flat());body.rows.filter(r => !seen.has(r[7])).forEach(r => sheet.appendRow(r)); // de-dup by Event IDreturn ContentService.createTextOutput(JSON.stringify({ ok: true })).setMimeType(ContentService.MimeType.JSON);}
- Deploy → New deployment → Web app. Set Execute as: Me and Who has access: Anyone. Copy the
/execURL into 📊 Google Sheets. Columns: Detected | Severity | Solicitation | Title | What changed | Deadline | Link | Event ID. (Prefer a service account? Point 🔗 Webhook at Make or Zapier's Google Sheets module instead; see below.)
Calendar (.ics feed, on by default)
Each run refreshes a calendar of every watched response deadline, with a 2-day reminder. The URL is in OUTPUT.calendarFeedUrl and in email alerts.
- Google Calendar: Other calendars → + → From URL, paste the link.
- Outlook: Add calendar → Subscribe from web.
- Apple Calendar: File → New Calendar Subscription. When a deadline moves, the event moves too (each event keeps a stable UID). Calendar apps refresh subscribed feeds every few hours. Treat the link like a password: anyone who has it can see your watched deadlines.
Google Calendar events (instant, optional)
Instead of (or as well as) the feed, BidDelta can create or update events directly. Use Apps Script as above, in a standalone project at script.google.com:
function doPost(e) {const body = JSON.parse(e.postData.contents);const cal = CalendarApp.getDefaultCalendar();const props = PropertiesService.getScriptProperties();body.events.forEach(ev => {const id = props.getProperty(ev.uid);const existing = id && cal.getEventById(id);if (existing) { existing.setTime(new Date(ev.start), new Date(ev.end)); existing.setTitle(ev.title); }else {const created = cal.createEvent(ev.title, new Date(ev.start), new Date(ev.end), { description: ev.description + '\n' + ev.url });created.addPopupReminder(2 * 24 * 60);props.setProperty(ev.uid, created.getId());}});return ContentService.createTextOutput('{"ok":true}').setMimeType(ContentService.MimeType.JSON);}
Deploy as a web app (as above) and paste the /exec URL into 📅 Google Calendar. It is called only when a deadline changed or a new match appeared.
Generic webhook: Make, Zapier, n8n, your own app
BidDelta POSTs:
{ "source": "biddelta", "version": "0.3", "monitorId": "my-watch", "noChanges": false, "eventCount": 1,"summary": "BidDelta (my-watch): 1 change …", "runUrl": "https://console.apify.com/view/runs/…","calendarUrl": "https://api.apify.com/v2/key-value-stores/…/records/DEADLINES.ics","events": [{ "eventId": "…", "severity": "critical", "plainEnglish": "…", "officialNoticeUrl": "https://sam.gov/opp/…/view","solicitationNumber": "…", "responseDeadline": "…", "changes": [{ "path": "attachments", "attachmentDiff": { "added": [], "replaced": [], "removed": [] } }] }] }
- Make: Webhooks → Custom webhook → copy the URL into 🔗 Webhook. Run BidDelta once with Also ping when nothing changed on so Make learns the structure. Then add an Iterator on
eventsand connect Google Sheets, Gmail, Teams or your CRM. - Zapier: Webhooks by Zapier → Catch Hook. Use
eventsas line items, then add actions such as Sheets, Slack, HubSpot or Salesforce. - n8n: Webhook node (POST, https) → Split Out
body.events→ IFseverity→ any node. - Apify's native apps (Make, Zapier, n8n): trigger on "Actor run succeeded" for
optimus-connections/bid-delta, then "Get dataset items" and filterrowType = change.
Troubleshooting
- "Could not find … on SAM.gov": the link, notice ID or solicitation number didn't match a notice. Paste the full
https://sam.gov/opp/…/viewlink if you can. Deleted notices can't be found. The run still succeeds and keeps that notice's last saved snapshot. - Run failed with "SAM.gov seems to be down or rate limiting": SAM.gov was unreachable or returned errors after several retries. Your saved baseline is not changed, so nothing is lost. Run it again later; scheduled runs retry on their own. If it keeps happening, watch fewer notices per run or schedule runs less often.
- First run shows no alerts: that's expected. The first run saves a baseline, and later runs report changes.
- Alerts didn't arrive:
Check
OUTPUT.notifications.results. Each channel reportsok, the HTTP status, or a plain-language error. Secrets are redacted.