Watcher
Real-time scrobbling between supported media servers, trackers, and Scrob.
Watcher does real-time scrobbling in CW.
It reads playback from a source and sends progress to a sink.
You can run multiple media servers and trackers together.
Watcher is the preferred real-time scrobble path for most setups.
Watcher
Monitor Plex, Jellyfin, Emby, Kodi, or Scrob playback from CrossWatch. Send real-time scrobbles to Trakt, SIMKL, MDBList, or Scrob.
Scrob can be either a Watcher source or a sink.
Before you start
Connect a source profile in Settings → Connections.
Connect a sink profile.
Confirm CrossWatch can reach the media server API.
Configure metadata and provider IDs when matching needs improvement.
Only connected profiles appear in route selectors.

Add a Watcher route
Open Settings → Scrobbler.
Select Add watcher.
Select the source provider and profile.
Select the destination tracker and profile.
Review Filters and Options.
Configure Plex Ratings only when required.
Select Save changes.
Start Watcher or enable Autostart.
Each route maps one source profile to one sink profile:
source profile → sink profile
CrossWatch assigns route IDs such as R1, R2, and R3.
Exact duplicate routes cannot be saved. Create separate routes for different destination providers or profiles.
Filters and options
Filters decide whether a route accepts playback. Available filters include a username whitelist, Plex Server UUID allowlist or blocklist, and Ignore Plex Live TV and DVR.
Kodi uses its configured source-path whitelist for scrobbling. It does not support Plex-specific route filters.
Empty filters accept all supported playback from the source profile. See Filters.
Route options override global settings:
Auto remove from Watchlists — Inherit, On, or Off.
Watched threshold — 0 to 100; global default: 90. Progress percentage where CrossWatch treats the item as watched/completed. Also affects auto-remove from watchlists.
Final stop trust — 0 to 100; global default: 95. Progress percentage where a final stop event is trusted as a real completion, even if the media server event is a little noisy.
Pause debounce — 0 to 3600 seconds; global default: 5. Ignores very short pause/start noise so tiny playback flaps do not create false pause scrobbles.
Suppress start — 0 to 100; global default: 99. Ignores new start events near the end of playback, usually caused by credits, autoplay, or media server session weirdness.
Progress step — 1 to 25; global default: 25. Controls how frequently progress updates are sent while watching. Leave it at 25, lowering it would provide more frequent updates but significantly increase the number of API calls, while raising it would reduce API usage but make updates less frequent.
Watcher status
Status shows running and configured route counts, Autostart, active providers, and runtime errors.
Start starts enabled saved routes and clears stale currently-watching state.
Stop stops every active group. No Watcher playback is processed while stopped.
Reload rebuilds groups from saved routes. Use it after connection changes.
Autostart starts saved enabled routes when CrossWatch starts.
Troubleshooting
Route is enabled but not running
Confirm Watcher and the source profile are running.
Confirm the destination profile is connected.
Select Reload and review CrossWatch logs.
Playback is detected but not sent
Clear filters temporarily.
Check the selected user, Plex Server UUID, library filtering, and provider IDs.
Confirm destination authentication.
Completion or duplication is wrong
Review Watched threshold, Final stop trust, and Suppress start.
Check for a matching webhook, another route to the same tracker profile, or overlapping Plex ratings URLs.
Runtime model
CrossWatch groups enabled routes by source provider and profile.
For example, three Plex Home routes share one Plex watcher group. Each event is evaluated and dispatched independently per route.
A route runs only when it is enabled, Watcher is started, its source group runs, and its destination is valid.
Route modal
Each route has its own profiles, enabled state, filters, auto-remove behavior, completion overrides, and Plex ratings configuration.
The duplicate check uses source provider and profile plus destination provider and profile.
Plex ratings
Normal playback requires no inbound webhook. Plex ratings require a ratings webhook because rating changes are not playback events.
Choose Off or Custom route webhook. Select Trakt, SIMKL, MDBList, or any combination.
The route URL is generated after saving. Use a custom route webhook only for a different destination set.
Global Watcher defaults
Auto remove from Watchlists controls routes using Inherit.
Watched threshold ranges from 0 to 100 and defaults to 90. It marks items watched or completed at this progress. It also affects automatic watchlist removal.
Final stop trust ranges from 0 to 100 and defaults to 95. It trusts final stop events at this progress, even with minor media-server noise.
Pause debounce ranges from 0 to 3600 seconds and defaults to 5. It ignores brief pause and start noise, preventing false pause scrobbles.
Suppress start ranges from 0 to 100 and defaults to 99. It ignores new starts near playback completion, including credits, autoplay, and media-server session anomalies.
Watcher normalizes activity into start, pause, and stop. It supports movies and episodes.
CrossWatch suppresses duplicate actions, tolerates small progress regressions, and applies watched-threshold and final-stop handling.
Multiple routes and conflicts
Create one route per destination:
Plex Home → Trakt Personal
Plex Home → SIMKL Personal
Plex Home → MDBList Personal
Use username whitelists to route shared-server users to separate tracker profiles.
Avoid near-duplicate routes that target one tracker profile during simultaneous playback. Do not also configure a webhook for the same source and tracker profiles.
Plex ratings URLs
Use the global ratings webhook when all Plex routes share destinations.
Use the route Ratings tab when a route needs custom destinations. Global and route-specific destinations are additive.
Do not send the same rating through both URLs. Regenerating a URL invalidates the old URL.
Related pages
Last updated
Was this helpful?