Skip to content

Crypto & Investing — Notifications & Schedules

Notifications & Schedules

Every output from the Investment Coach flows through Discord. Three channels, each with its own webhook, routed by content type.

Discord Channels

Channel Tag What Goes Here
#investment-alerts invest-alerts On-demand analysis results, morning pulse, significant price moves
#weekly-report invest-weekly Sunday portfolio summary, 1st-of-month deep review
#learning invest-learn Concept of the week, reflections, quiz results

Current Setup (Direct Webhooks)

As of 2026-04-05, each channel has its own Discord webhook URL stored in .env:

DISCORD_WEBHOOK_ALERTS=https://discord.com/api/webhooks/.../...
DISCORD_WEBHOOK_WEEKLY=https://discord.com/api/webhooks/.../...
DISCORD_WEBHOOK_LEARN=https://discord.com/api/webhooks/.../...

The skill's notify.sh script routes a tag to the correct webhook. All three channels are tested and working.

Future: Apprise Routing

The homelab already runs Apprise at notify.example.homelab (port 9914). Switching gives you:

  • Multi-service fanout (Discord + Telegram + Email + Gotify simultaneously)
  • Centralized notification config (one place to add channels)
  • Gotify fallback if Discord webhooks are rate-limited or down

To switch: uncomment NOTIFY_MODE=apprise in .env and run scripts/invest/apprise-setup.sh <discord-webhook-url>. See the Monitoring Stack for the Apprise service configuration.

Automated Schedules

Four recurring triggers drive the coach without manual invocation. All times are Asia/Manila.

Schedule Cron Action
Morning pulse 0 8 * * 1-5 Scan holdings + watchlist, overnight moves, pre-market movers, today's events → #investment-alerts
3-day reflection n8n delayed workflow, triggered per analysis Mini reflection → #learning
Weekly report 0 20 * * 0 Full portfolio review + reflections + PDF → #weekly-report
Monthly review 0 20 1 * * Deep review + stage promotion check → #weekly-report

The Claude Code scheduler (RemoteTrigger) handles morning pulse, weekly, and monthly. n8n handles the 3-day reflection because it needs to fire relative to when each analysis ran — a relative delay, not an absolute cron.

Message Formats

On-demand analysis (#investment-alerts):

📊 AAPL Analysis — Rating: OVERWEIGHT

Bull: Strong services revenue growth, AI integration momentum
Bear: Premium valuation (P/E 32), China exposure risk
Risk: Moderate — you already hold 23% AAPL

💡 Action: Add 2 shares ($380), diversify remaining $120 into VTI
📚 Concept: "Position sizing — why 25%+ in one stock is risky"

Full analysis → [Memory MCP link]

Weekly report (#weekly-report):

📋 Weekly Portfolio Report — Apr 6, 2026

Portfolio: $12,450 (+2.3% this week)
Winners: NVDA +5.1%, VTI +1.8%
Losers: AAPL -1.2%
Freqtrade paper: +0.8% (BTC/USDT RSI strategy)

⚠️ Watch: NVDA earnings Apr 10, Fed meeting Apr 12
🎓 This week: "What earnings reports actually tell you"

Full report → [Obsidian link] | PDF → [attached]

Reflection Process

The 3-day reflection is the most important automation in the pipeline. It's what makes the coach learn from its own mistakes.

graph LR
    A["Analysis runs<br/>Rating stored in Memory MCP"] --> B["3 days pass<br/>n8n delayed trigger"]
    B --> C["Fetch actual price performance"]
    C --> D["Compare prediction vs reality"]
    D --> E["Generate lesson:<br/>what signals were correct,<br/>what we missed"]
    E --> F["Store reflection in Memory MCP"]
    F --> G["Discord #learning"]

Reflections accumulate in Memory MCP and get pulled into future analyses by the Bull and Bear researchers — past wins and misses directly inform new thinking.

Market Closed / Weekend Behavior

Scenario Behavior
Weekend Morning pulse skips; manual /invest analyze uses last close data
US holiday Same as weekend — skip pulse, manual works
Market closed mid-day Analyses run with last trade price, flagged as "session paused"

Error Handling

Scenario Behavior
Discord webhook rate-limited Fall back to Gotify (port 9880); retry Discord in 5 min
Apprise unreachable Write to Obsidian + log warning, retry via n8n in 30 min
n8n unreachable 3-day reflections queue until n8n recovers
TL;DR

Three Discord channels (alerts, weekly, learning), each with its own webhook. Four scheduled triggers: morning pulse (weekdays 8am), 3-day per-analysis reflection (n8n), weekly report (Sunday 8pm), monthly review (1st of month 8pm). Apprise is already running for future multi-channel routing. 3-day reflections are the feedback loop that makes the coach learn from its own predictions.

Previous: ← Learning Progression | Next: First Analysis — VTI →