Push Notifications

FreqDroid supports two ways to deliver push notifications. Pick whichever fits your workflow.

ntfyFCM via push.freqdroid.com
SetupSelf-host an ntfy serverJust register in the app
BatteryForeground service or pollingReal push, no service or polling
LatencyInstant (Live) or up to intervalInstant
PlatformsAndroid + iOSAndroid (iOS coming)
Encryption in transitTLS to your serverTLS + per-device sealed-box ciphertext through Google FCM
Trading data leaves your networkYes (to your ntfy)Yes (to push.freqdroid.com → Google FCM, encrypted)

Pick a transport

📡

Set up ntfy

Self-host an ntfy server, point FreqTrade webhooks at your topics, subscribe from the app. Works on Android and iOS.

🔔

Set up FCM

Register the device in the app, point FreqTrade webhooks at your unique relay URL. No server to run. Android only for now.

🐍

Add the Python callback

Optional add-on for richer exit messages — profit-based emoji, partial-fill handling, trade duration. Works with both transports.


Webhook events at a glance

Both transports route through FreqTrade’s webhook block in config.json. FreqTrade fires one of these event types per notification, and you template the body for each one separately. Any event not listed in your webhook block is silently dropped.

EventFires whenUseful template tokens
entryEntry order placed{trade_id}, {pair}, {direction}, {open_rate}, {stake_amount}, {stake_currency}, {enter_tag}
entry_fillEntry order filledsame as entry
entry_cancelEntry order cancelled{trade_id}, {pair}, {reason}
exitExit order placed{trade_id}, {pair}, {limit}, {exit_reason}, {profit_amount}, {profit_ratio}
exit_fillExit order filledsame as exit
exit_cancelExit order cancelled{trade_id}, {pair}, {reason}
protection_triggerPer-pair protection activated{pair}, {reason}, {lock_end_time}
protection_trigger_globalGlobal protection activated (all pairs){reason}, {lock_end_time}
statusBot state change (running, stopped, process died){status}
startupBot startup info (exchange, ROI, pairlist, protections){status}
warningNon-fatal warnings{status}
exceptionExceptions raised during operation{status}
strategy_msgCustom messages from dp.send_msg() in the strategy{msg}

strategy_msg requires "allow_custom_messages": true at the top of the webhook block. Without that flag, FreqTrade silently drops every dp.send_msg() call instead of dispatching it as a webhook.

startup / warning / exception fall through to the webhookstatus key by default in FreqTrade. Defining them as explicit unprefixed keys (as in the setup-page examples) bypasses that fallback so each gets its own template.

#{trade_id} in the body enables tap-to-navigate. FreqDroid scans the message text for #<number> and uses it to deep-link straight to the trade detail screen.