Notifications
Nibwright watches Upwork for you, so the notification is the product. This page covers what sends one, why they arrive in batches, and every piece of data a message carries.
On this page
Four things, and nothing else. Nibwright never messages you to say it found nothing, and never messages you about a posting it decided to skip.
| Event | When it fires | Batched? |
|---|---|---|
| Draft ready | A proposal has been written for a matched posting and is waiting for your review. | Yes |
| New match | A posting cleared every screen on a search set to Alert only. Nothing has been drafted and no credit has been spent. | Yes |
| Out of credits | Your balance is too low to draft, so new matches are being skipped. Sent at most once an hour. | No |
| Reconnect needed | Your Upwork connection expired and polling has stopped. Sent at most once an hour. | No |
The last two are account alerts. They are never held back, because they are the messages that explain why everything else has gone quiet.
A single poll can surface fifteen postings at once. Fifteen separate messages would be unreadable, so job notifications are collected and sent as one digest.
Two clocks decide when a batch is finished. Whichever comes first wins:
| Rule | Value | Why |
|---|---|---|
| Quiet period | 90 seconds | Nothing new has been added to the batch for this long, so it looks complete. |
| Ceiling | 10 minutes | Measured from the oldest waiting item. Stops a steady trickle from holding a digest open indefinitely. |
The two clocks exist because the items arrive on different rhythms. Matches are written in one burst the moment a poll finishes, while the drafts for those same postings land one at a time over the following minutes as each is written. A single fixed delay would either cut the batch in half or make every notification late.
A worked example
Each channel you have enabled receives that one message. Enabling three channels means three deliveries of the same digest, not three times the jobs.
Every channel carries the same facts. The presentation differs, the data does not. Up to 6 postings get a full card and anything beyond that becomes a count, ordered best first.
| Field | What it is | When it is missing |
|---|---|---|
| Job title | The posting's title, exactly as the client wrote it. | Never |
| Budget | An hourly range or a fixed amount, e.g. $65-$90/hr. | When the posting states no budget |
| Client country | Where the client is posting from. | When Upwork does not report it |
| Search name | Which of your saved searches surfaced it. | Never |
| Match score | 0.00 to 1.00, how well the posting fits your profile. Judged by Claude, with a keyword overlap fallback. | Never |
| Opening line | The first line of the drafted proposal, so you can judge it without opening anything. | On an alert-only match, where nothing is drafted yet |
| Suggested bid | What the draft proposes to bid. | On an alert-only match |
| Link | Straight to the draft for review, or to the match if nothing is drafted yet. | Never |
Everything above is also on the posting's own page in the dashboard, in more detail: the full description, the whole drafted letter, why it matched, and the client's history. A notification is a summary built to be read on a lock screen, not a replacement for the record.
Every notification carries a match score between 0.00 and 1.00. It is Claude reading the posting against your Upwork profile and the search that found it, and it is the only thing standing between a posting and a drafted proposal.
| Score | What it means |
|---|---|
| 0.85 and above | A strong fit. These are flagged in the message and sorted to the top, because they are where the next Connect should go. |
| 0.50 to 0.84 | A real fit worth a proposal. Drafted normally, no special billing. |
| Under 0.50 | Not drafted, and never notified about. It still appears on your dashboard, marked skipped, with the score that got it there. |
When Claude cannot be reached for a posting, the score falls back to a plain keyword and skill overlap ratio rather than blocking the run. That fallback is more conservative than Claude, so an outage makes a search quieter, never noisier.
A search whose runs keep scoring low is usually a filter problem rather than a market problem. The Activity page on each search shows every check it has run and what came of it, which is the fastest way to tell those two apart.
Speed is the whole point. A draft that sits unread for an hour is a draft that arrives after fifty other people have already applied.
| Channel | Typical delay | Best for |
|---|---|---|
| Slack | Seconds | If you already live in Slack, or want a shared channel with a VA. |
| Seconds to minutes | A readable archive. Too slow on its own. |
You can enable both. They are independent: one failing does not stop the other, and each is tried again on its own next time.
A channel can be saved, switched on, and quietly undeliverable, which is the worst failure this product has because it looks exactly like a quiet market. So the Integrations page tracks two separate things: whether a channel is configured, and whether anything has ever actually reached it.
The Send a test button on each channel row pushes a real digest, built by the same renderer and pushed through the same sender as a live notification, to that one channel. The result is written back to the row:
| What the row says | Meaning |
|---|---|
| Not tested yet | Saved, but nothing has been sent through it. |
| Sending a test... | Queued. Refresh in a few seconds. |
| Delivered {timestamp} | A message reached this target. The channel works. |
| Last test failed: {error} | The provider's own words, kept verbatim, because that text usually names the exact thing to fix. |
Live notifications are sent once. There is no retry queue: a channel that was down when a digest went out does not receive that digest later. The postings themselves are never lost, they are on your dashboard either way.
Searches poll no more often than every 60 seconds, so that is the floor on how frequently a new batch can appear. In practice you should expect a handful of digests a day rather than a stream.
To make them rarer or busier, adjust these, in rough order of effect:
Turning a channel off with its toggle stops delivery to it immediately and keeps the saved destination, so you can switch it back on without setting it up again.