Try our Chrome extension

Chrome store icon Chrome Webstore

Easily add the current web-page from your browser directly into your changedetection.io tool, more great features coming soon!

Changedetection.io needs your support!

You can help us by supporting changedetection.io on these platforms;

The more popular changedetection.io is, the more time we can dedicate to adding amazing features!

Many thanks :)

changedetection.io team

Automatically applies this tag to any watch whose URL matches. Supports wildcards: *example.com* or plain substring: github.com/myorg
Leave unchecked to use the auto-generated colour based on the tag name.

✨ AI

Configure an AI / LLM provider in Settings → AI / LLM to enable AI features for this group.

These settings are added to any existing watch configurations.

One CSS, xPath 1 & 2, JSON Path/JQ selector per line, any rules that matches will be used.
Show advanced help and tips
  • Remove HTML element(s) by CSS and XPath selectors before text conversion.
  • Don't paste HTML here, use only CSS and XPath selectors
  • Add multiple elements, CSS or XPath selectors per line to ignore multiple parts of the HTML.

Text filtering

  • Text to wait for before triggering a change/notification, all text and regex are tested case-insensitive.
  • Trigger text is processed from the result-text that comes out of any CSS/JSON Filters for this monitor
  • Each line is processed separately (think of each line as "OR")
  • Note: Wrap in forward slash / to use regex example: /foo\d/
  • You can also use conditions - "Page text" - with Contains, Starts With, Not Contains and many more /foo\d/
  • Matching text will be ignored in the text snapshot (you can still see it but it wont trigger a change)
  • Each line processed separately, any line matching will be ignored (removed before creating the checksum)
  • Regular Expression support, wrap the entire line in forward slash /regex/
  • Changing this will affect the comparison checksum which may trigger an alert


  • Block change-detection while this text is on the page, all text and regex are tested case-insensitive, good for waiting for when a product is available again
  • Block text is processed from the result-text that comes out of any CSS/JSON Filters for this monitor
  • All lines here must not exist (think of each line as "OR")
  • Note: Wrap in forward slash / to use regex example: /foo\d/
  • Keep only lines that contain any of these words or phrases (plain text, case-insensitive)
  • One entry per line — any line in the page text that contains a match is kept
  • Simpler alternative to regex — use this when you just want lines about a specific topic
  • Example: enter celsius to keep only lines mentioning temperature readings
  • Extracts text in the final output (line by line) after other filters using regular expressions or string match:
    • Regular expression - example /reports.+?2022/i
    • Don't forget to consider the white-space at the start of a line /.+?reports.+?2022/i
    • Use //(?aiLmsux)) type flags (more information here)
    • Keyword example - example: Out of stock
    • Use groups to extract just that text - example /reports.+?(\d+)/i returns a list of years only
    • Example - match lines containing a keyword /.*icecream.*/
  • One line per regular-expression/string match
Used for watches in "Restock & Price detection" mode
Changes in price should trigger a notification
Minimum amount, Trigger a change/notification when the price drops below this value.
Maximum amount, Trigger a change/notification when the price rises above this value.
Price must change more than this % since the previous check to trigger a change.
For example, if the previous check saw the product at $1,000 USD, 2% would mean it has to change more than $20 since then.
Use with caution! This will easily fill up your email storage quota or flood other storages.
Use system defaults
List all
    Configured list of notifications - Use the "Add a notification service" to add to this.

    Show advanced help and tips
    Customise notifications
    Title for all notifications
    Body for all notifications — You can use Jinja2 templating in the notification title, body and URL, and tokens from below.
    Show token/placeholders
    Token Description
    {{base_url}} The URL of the changedetection.io instance you are running.
    {{watch_url}} The URL being watched.
    {{watch_open_url}} The Open Link Override set on the watch, otherwise the same as watch_url. Use this when the watched URL is an API endpoint or RSS feed but you want to link to the real page.
    {{watch_uuid}} The UUID of the watch.
    {{watch_title}} The page title of the watch, uses <title> if not set, falls back to URL
    {{watch_tag}} The watch group / tag
    {{preview_url}} The URL of the preview page generated by changedetection.io.
    {{change_datetime}} Date/time of the change, accepts format=, change_datetime(format='%A'), default is '%Y-%m-%d %H:%M:%S %Z'
    {{diff_url}} The URL of the diff output for the watch.
    {{diff}} The diff output - only changes, additions, and removals
    All diff variants accept lines=, context=, word_diff=, ignore_junk= args, e.g. {{diff(lines=10)}}, {{diff_added(lines=5, context=2)}}
    {{diff_clean}} The diff output - only changes, additions, and removals — Without (added) prefix or colors
    {{diff_added}} The diff output - only changes and additions
    {{diff_added_clean}} The diff output - only changes and additions — Without (added) prefix or colors
    {{diff_removed}} The diff output - only changes and removals
    {{diff_removed_clean}} The diff output - only changes and removals — Without (added) prefix or colors
    {{diff_full}} The diff output - full difference output
    {{diff_full_clean}} The diff output - full difference output — Without (added) prefix or colors
    {{diff_patch}} The diff output - patch in unified format
    {{diff_changed_from}} Only the changed words/values from the previous version — e.g. the old price. Best when a single value changes per line; multiple changed fragments are joined by newline.
    {{diff_changed_to}} Only the changed words/values from the new version — e.g. the new price. Best when a single value changes per line; multiple changed fragments are joined by newline.
    {{current_snapshot}} The current snapshot text contents value, useful when combined with JSON or CSS filters
    {{triggered_text}} Text that tripped the trigger from filters
    {{restock.price}} Price detected
    {{restock.in_stock}} In stock status
    {{restock.last_price}} Price at the previous check
    {{restock.previous_price}} Previous price in history

    Warning: Contents of {{diff}}, {{diff_removed}}, and {{diff_added}} depend on how the difference algorithm perceives the change.
    For example, an addition or removal could be perceived as a change in some cases. More Here
    • For JSON payloads, use |tojson without quotes for automatic escaping, for example - { "name": {{ watch_title|tojson }} }
    • URL encoding, use |urlencode, for example - gets://hook-website.com/test.php?title={{ watch_title|urlencode }}
    • Regular-expression replace, use |regex_replace, for example - {{ "hello world 123" | regex_replace('[0-9]+', 'no-more-numbers') }}
    • For a complete reference of all Jinja2 built-in filters, users can refer to the https://jinja.palletsprojects.com/en/3.1.x/templates/#builtin-filters

    Format for all notifications