BidDelta — SAM.gov Material Change Monitor avatar

BidDelta — SAM.gov Material Change Monitor

Pricing

Pay per usage

Go to Apify Store
BidDelta — SAM.gov Material Change Monitor

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

Jeremy DeCoste

Maintained by Community

Actor 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)

  1. 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.
  2. 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").
  3. 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

ChangeSeverity
Response deadline movedcritical
Cancelled / inactivecritical
New, replaced or removed attachments (amendments, Q&A, SOW, pricing sheets)high
Set-aside, notice type, solicitation numberhigh
Award details (awardee, amount, date)high
Description text edited, point of contact, place of performance, NAICS/PSC, titlemedium
New opportunity matching a saved searchhigh

Inputs

FieldWhat to put
ModeMonitor (live) or Try a sample alert
Solicitations to watchSAM.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.
AdvancedmonitorId (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.schedule shows the estimate for your watchlist.
  • Email alerts call Apify's send-mail Actor, 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.

ChannelCostAccount neededFields
Emailtiny Apify usagenonenotifyEmail
SlackfreeSlack workspaceslackWebhookUrl
Microsoft TeamsfreeTeamsteamsWebhookUrl
DiscordfreeDiscord serverdiscordWebhookUrl
TelegramfreeTelegramtelegramBotToken, telegramChatId
ntfy pushfreenonentfyTopic (+ ntfyServer, ntfyToken)
Pushover pushone-time app purchase (≈$5)PushoverpushoverUserKey, pushoverAppToken
SMS (Twilio or Telnyx)≈$0.008–0.01/SMS on your accountTwilio/TelnyxsmsProvider, smsAccountId, smsAuthToken, smsFrom, smsTo, smsMinSeverity
Google Sheets logfreeGooglegoogleSheetsWebhookUrl
Calendar (.ics feed)freenonecalendarFeed (on by default)
Google Calendar eventsfreeGooglegoogleCalendarWebhookUrl
Webhook (Make, Zapier, n8n, custom)freeyour toolwebhookUrl

Email

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

  1. In Telegram, message @BotFather, send /newbot, and copy the token into ✈️ Telegram bot token.
  2. Send any message to your new bot (or add it to a group), then open https://api.telegram.org/bot<TOKEN>/getUpdates and copy chat.id into ✈️ Telegram chat ID. Group IDs start with -.

ntfy (free phone push, no account)

  1. Install ntfy (iOS/Android) or open https://ntfy.sh/app.
  2. 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)

  1. 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 ID
return ContentService.createTextOutput(JSON.stringify({ ok: true }))
.setMimeType(ContentService.MimeType.JSON);
}
  1. Deploy → New deployment → Web app. Set Execute as: Me and Who has access: Anyone. Copy the /exec URL 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 events and connect Google Sheets, Gmail, Teams or your CRM.
  • Zapier: Webhooks by Zapier → Catch Hook. Use events as line items, then add actions such as Sheets, Slack, HubSpot or Salesforce.
  • n8n: Webhook node (POST, https) → Split Out body.events → IF severity → any node.
  • Apify's native apps (Make, Zapier, n8n): trigger on "Actor run succeeded" for optimus-connections/bid-delta, then "Get dataset items" and filter rowType = 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/…/view link 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 reports ok, the HTTP status, or a plain-language error. Secrets are redacted.