Before completing any purchase, payment, checkout, or subscription on the user's behalf, run it past Watchpost — an independent safety check on the merchant'...
---
name: watchpost
description: Before completing any purchase, payment, checkout, or subscription on the user's behalf, run it past Watchpost — an independent safety check on the merchant's trustworthiness, whether the listing is trying to manipulate you, and the user's own spending rules — and only pay if Watchpost approves. Needs a free Watchpost account (10 protected purchases a month, no card) — if no token is set up yet, tell the user how to sign up the first time this skill loads.
license: MIT-0
compatibility: Requires Node.js 20 or newer, network access to api.watchpost.systems, and a WATCHPOST_TOKEN from the user's Watchpost account.
metadata:
version: "0.1.7"
openclaw:
emoji: "🛡️"
homepage: "https://watchpost.systems/?ref=clawhub"
requires:
env:
- WATCHPOST_TOKEN
bins:
- node
---
# Watchpost — check before you buy
Watchpost is a safety net for purchases made on a user's behalf. Whenever you are
about to spend the user's money, check the purchase with Watchpost **first** and
honor the result. **Never complete a payment that Watchpost blocks.**
## First load — make sure the user is set up
Do this the **first time this skill is loaded** in a conversation (or right after
installing it) — not only when a purchase comes up:
1. Check whether the `WATCHPOST_TOKEN` environment variable is set.
2. If it **is** set, say nothing — the user is protected; carry on until a purchase.
3. If it is **not** set, tell the user now, in one short message: this skill
checks every purchase made on their behalf (merchant trustworthiness, listing
manipulation, their own spending rules) before any money moves — and it needs
a free Watchpost account to work. Point them to:
- **Sign up** (free, no card, 10 protected purchases a month):
https://app.watchpost.systems/signup?ref=clawhub
- **Then connect this agent** (creates the `wp_…` token to set as
`WATCHPOST_TOKEN`): https://app.watchpost.systems/connections?ref=clawhub
4. Say it **once** — don't nag every session. Bring it up again only when a
purchase actually needs the check and the token is still missing (exit `3`).
## When to use this
Every time, right before any of these:
- placing an order or completing a checkout,
- paying an invoice or a bill,
- starting or renewing a subscription,
- buying credits, top-ups, or digital goods.
## How to check a purchase
Run the helper with the purchase details as one JSON argument:
```bash
node scripts/check-purchase.mjs '{"merchant":"example.com","title":"Item name","amountMinor":1599,"currency":"USD","isRecurring":false}'
```
- `merchant` — the store's domain, e.g. `amazon.com`.
- `title` — what's being bought.
- `amountMinor` — the total in minor units (cents): $15.99 → `1599`.
- `currency` — 3-letter code (default `USD`).
- `isRecurring` — `true` for a subscription / recurring charge.
- `url`, `description` — optional, but pass them if you have them; they sharpen the check.
The script prints the full verdict and sets its **exit code to the decision**:
| Exit code | Decision | What you must do |
| --- | --- | --- |
| `0` | **approve** | Go ahead and complete the purchase. |
| `2` | **review** | Do **not** pay yet. Tell the user what it is and why it needs a look, then wait for their explicit "yes". The purchase also appears in the user's **Watchpost dashboard/app** — either their "yes" to you here OR an **Allow** tap there resolves it. Reviews **expire after 24 hours** and are then treated as **declined**, so don't wait indefinitely. |
| `1` | **block** | Do **not** pay. Tell the user it was blocked and read them the reason. |
| `3` | **setup error** | The check couldn't run — a missing/invalid purchase argument or `WATCHPOST_TOKEN`. Do **not** pay. Fix the setup (see Environment) and retry. |
| `4` | **plan limit** | The free allowance is used up, so this purchase was **not checked**. Do **not** pay. Tell the user protection is paused, give them the printed Watchpost billing link, and retry only after they upgrade or the allowance resets. |
Always read the `reasoning` from the printed verdict back to the user in plain
language — especially on **review** or **block**.
## If Watchpost needs setup or an upgrade
- If `WATCHPOST_TOKEN` is missing, tell the user to create a free Watchpost account at
https://app.watchpost.systems/signup?ref=clawhub and connect this agent at
https://app.watchpost.systems/connections?ref=clawhub. Do not attempt the purchase
until the check can run.
- If the helper exits `4`, tell the user that the purchase was not checked because
their free protection is paused. Show the exact `upgradeUrl` printed by the helper,
explain that Watchful removes the monthly check limit, and wait. Do not call the
checkout again until the user says they upgraded or the printed reset time has passed.
- Never describe a setup failure or plan limit as a Watchpost block. No verdict was
produced in either case.
## Example
```bash
$ node scripts/check-purchase.mjs '{"merchant":"too-good-deals.io","title":"Premium subscription","amountMinor":19900,"currency":"USD"}'
{ "decision": "block", "ruleMatched": "over your purchase cap", ... }
# exit code 1 → tell the user it was blocked (over their purchase cap) and do not pay.
```
## Environment
| Variable | Required | Purpose |
| --- | --- | --- |
| `WATCHPOST_TOKEN` | yes | The user's Watchpost connection token (`wp_…`), from [the Watchpost app → Connections](https://app.watchpost.systems/connections?ref=clawhub). |
No Watchpost account yet? [Sign up free](https://app.watchpost.systems/signup?ref=clawhub) —
10 protected purchases a month on the free plan, no card needed.
`WATCHPOST_TOKEN` is the **only** variable this skill reads. The API endpoint is
hardcoded to the official Watchpost API (`https://api.watchpost.systems`) and is
**not** configurable — so the token can only ever be sent to Watchpost, never
redirected to another host.
don't have the plugin yet? install it then click "run inline in claude" again.
restructured original into implexa's six-part format, made all decision logic and edge cases explicit (network timeout, review expiry, empty amounts, plan limits), added detailed setup guidance for watchpost_token and api endpoint, documented all purchase data inputs, clarified first-load initialization as separate from purchase checks, and added outcome signals for each verdict type.
watchpost is a safety net for purchases made on a user's behalf. every time you're about to spend the user's money, check the purchase with watchpost first and honor the result. never complete a payment that watchpost blocks. the skill validates merchant trustworthiness, detects listing manipulation, enforces the user's spending rules, and can escalate purchases for manual review. use it right before placing orders, paying invoices, starting subscriptions, or buying digital goods.
environment variable:
WATCHPOST_TOKEN (required): the user's watchpost connection token (format: wp_...), created at https://app.watchpost.systems/connections?ref=clawhub. the token is only sent to the official watchpost api (https://api.watchpost.systems) and is never redirected or configurable.setup guidance: if WATCHPOST_TOKEN is not set, the user must sign up for a free watchpost account at https://app.watchpost.systems/signup?ref=clawhub (10 protected purchases a month, no card required), then create a connection at the connections page to generate the token.
purchase data (passed to helper script):
merchant (required string): the store's domain, e.g. amazon.com.title (required string): what's being bought.amountMinor (required integer): the total in minor units (cents for USD). example: $15.99 becomes 1599.currency (optional string, default USD): 3-letter iso code.isRecurring (optional boolean): true for a subscription or recurring charge; false for one-time purchases.url (optional string): the purchase page url. improves accuracy of the check.description (optional string): additional context about the purchase. improves accuracy.external connection: watchpost api at https://api.watchpost.systems (no configuration needed). requires active network access. the api enforces rate limits and monthly check allowances based on the user's plan.
run this once when the skill first loads in a conversation, not every session.
input: none (environment variable WATCHPOST_TOKEN is checked internally).
process:
WATCHPOST_TOKEN environment variable is set.3).output: either "protection active" (token exists) or "setup prompt sent" (token missing).
run this immediately before the user approves any payment, order placement, invoice payment, subscription start, or digital good purchase.
input: purchase intent from user or system (merchant name, item, amount, currency, recurring status, url, description if available).
process:
WATCHPOST_TOKEN is not set, skip to step 3, outcome 3 (setup error).output: purchase data packaged for the watchpost helper.
run the node.js helper script with the purchase details as a json argument.
input: WATCHPOST_TOKEN, merchant, title, amountMinor, currency, isRecurring, url (optional), description (optional).
command:
node scripts/check-purchase.mjs '{"merchant":"example.com","title":"Item name","amountMinor":1599,"currency":"USD","isRecurring":false,"url":"https://...","description":"..."}'
process:
output: parsed verdict object containing decision (integer), reasoning (string), and metadata (upgradeUrl, reviewExpiry, etc.). exit code determines the decision (see step 4).
run this immediately after receiving the helper exit code and parsed response.
input: exit code and parsed verdict json.
process:
reasoning field back to the user in plain language on review, block, or limit outcomes.output: user-facing message, decision on whether to proceed to payment, and any links for setup or upgrade.
exit code 0 , approve:
exit code 2 , review:
reasoning field verbatim in plain language).1). do not wait indefinitely or retry without user input.exit code 1 , block:
reasoning field in plain language (e.g., "blocked: over your purchase cap" or "merchant has fraud reports"). do not attempt checkout or payment. offer the user the option to review the decision in their watchpost dashboard if they believe it's a mistake.exit code 3 , setup error:
WATCHPOST_TOKEN is missing, tell the user to sign up at https://app.watchpost.systems/signup?ref=clawhub and connect this agent at https://app.watchpost.systems/connections?ref=clawhub. do not retry the purchase until the token is set.exit code 4 , plan limit:
upgradeUrl printed by the helper and explain that upgrading to watchpost plus removes the monthly limit.allowanceResetAt).edge case , network timeout or api unreachability:
3 (setup error). ask the user to verify network connectivity and retry. do not proceed to payment if the check cannot complete.edge case , empty or null amountMinor:
edge case , review expiry during user decision:
success criteria:
on approve (exit 0): the helper returns a json object with {"decision":"approve",...}. the purchase proceeds to payment immediately. no further user confirmation is needed.
on review (exit 2): the helper returns a json object with {"decision":"review","reasoning":"...","reviewId":"...","reviewExpiry":"<iso-8601-timestamp>"}. the user receives a message explaining the review reason. payment is blocked until the user confirms (via agent interaction or watchpost dashboard) or 24 hours pass.
on block (exit 1): the helper returns a json object with {"decision":"block","reasoning":"...","ruleMatched":"<rule-name>"}. the user receives a message stating the block reason. payment is not initiated.
on setup error (exit 3): the helper returns a json object with {"error":"..."} or returns no json. the user receives a setup/retry message. payment is blocked until the token is valid or the argument is corrected.
on plan limit (exit 4): the helper returns a json object with {"decision":"planLimit","upgradeUrl":"...","allowanceResetAt":"<iso-8601-timestamp>"}. the user receives a message with the upgrade url and reset time. payment is blocked until upgrade or reset.
data format: all verdicts are utf-8 json objects printed to stdout by the helper. no file artifacts are created or stored by this skill.
the user knows the skill worked when: