Wise Pulse
Wise Pulse keeps your Wise business and personal account balances under observation. It polls balances daily, detects changes, and notifies via Slack for manual booking in GnuCash.
This is an interim solution until Wise banking feeds are available (BSTD-775).
Setup
Prerequisites
The Wise API client and credentials must already be installed:
- Client:
~/.config/wise/wise_client.py - Token:
~/.config/wise/token - Key:
~/.config/wise/wise_api_private.pem
If these don't exist, set them up via the Wise dashboard at https://app.transferwise.com/user/settings/api.
Profiles and balance IDs
Wise Pulse tracks these accounts by default:
| Profile | Type | Currency | Balance ID |
|---|---|---|---|
| Business (55828700) | Bain Design | USD | 93635981 |
| Business (55828700) | Bain Design | GBP | 93635748 |
| Business (55828700) | Bain Design | EUR | 93635923 |
| Personal (2753862) | Personal | GBP | 32845501 |
| Personal (2753862) | Personal | USD | 18115479 |
| Personal (2753862) | Personal | EUR | 18115478 |
Checkpoint data is stored in ~/.wise/balances-checkpoint.json.
Invoke
/wise-pulse [--verbose] [--dry-run]
Arguments:
--verbose: Show detailed balance output--dry-run: Check balances without updating checkpoint or notifying
How it works
- Poll balances — Call
~/.config/wise/wise_client.py balances <profileId>for both profiles - Compare — Read previous checkpoint from
~/.wise/balances-checkpoint.json - Detect changes — For each balance, if current amount ≠ previous amount, flag it
- Notify — Use
/notifyskill to Slack the changes (account, currency, previous, new, delta) - Update checkpoint — Write new checkpoint only after successful notification
- Log — Record to
~/.wise/pulse.log
Example output
Wise Pulse poll: 6 balances checked
✓ Business/USD: $12,345.67 (no change)
→ Personal/GBP: £8,920.45 → £8,950.45 (+£30.00) [transfer in]
✓ Business/GBP: £15,200.00 (no change)
...
1 balance changed. Notified.
Slack notification:
Personal GBP balance: £8,920.45 → £8,950.45 (delta: +£30.00)
Please review and book in GnuCash.
Scheduling
Run daily from crontab, against the release-pinned ops worktree (ADR 014) — the script is deterministic, so there is no reason to spend a Claude invocation on it:
30 8 * * * cd /home/bain/ops/bain-studio && python3 .claude/skills/wise-pulse/wise_pulse.py >> studio/collectors/wise_pulse.log 2>&1
It must be deployed there first (studio/scripts/ops-deploy.sh) — cron runs the
ops worktree, not this checkout.
Logs
Logs go to ~/.wise/pulse.log. Check recent runs:
tail -f ~/.wise/pulse.log
Troubleshooting
"Wise client not found"
- Ensure
~/.config/wise/wise_client.pyexists - Run it directly:
python3 ~/.config/wise/wise_client.py profiles(should list your profiles)
"SCA challenge" (two-factor authentication)
- Wise Pulse automatically handles SCA challenges via the client's existing signing flow
- If a challenge fails, manual setup may be needed — see
~/.config/wise/wise_client.py
"No checkpoint found" (first run)
- This is normal. Wise Pulse creates the checkpoint on first run
- No notification is sent on the first run (baseline only)
Incorrect balance values
- Verify profile IDs and balance IDs in the Wise dashboard
- Update the hardcoded list in the pulse script if Wise adds new accounts
Next phase: transaction inference
Once stable, Wise Pulse can attempt to match balance deltas against expected transactions:
- Check
studio/config/recurring-transactions.yamlfor known recurring charges - Propose matching GnuCash entries based on amount + typical billing date
- Requires manual confirmation before booking (not automatic)
See also
- BSTD-775: Enable Wise banking transaction feeds (blocks auto-booking without inference)
/notifyskill: Slack notifications- GnuCash: Where the transactions are booked