In StockMonitor for exact text match
Available, In Stock, Ships TodayMonitor for any of these text values
SALEExact match including case
In Stock, Available NowMonitor when products become available
Shipped, Out for Delivery, DeliveredTrack order status changes
Tickets AvailableGet notified when tickets go on sale
## and use parentheses for grouping.## prefix| for OR operatorAND operator##(term1 | term2) (term3 | term4)##(in stock | available) (add to cart | buy now)Matches pages showing ("in stock" OR "available") AND ("add to cart" OR "buy now")
##(sale | discount) (50% | 30%)Matches pages with ("sale" OR "discount") AND ("50%" OR "30%")
##(free shipping | express) (today | tomorrow)Matches ("free shipping" OR "express") AND ("today" OR "tomorrow")
OR Logic (|)
Within parentheses, the pipe | acts as OR:
(in stock | available)Matches either "in stock" or "available"
AND Logic (space)
Space between parentheses groups acts as AND:
(group1) (group2)Both groups must match
Complete Expression
##(term1 | term2) (term3 | term4)Means: (term1 OR term2) AND (term3 OR term4)
##(in stock | available | ships today) (add to cart | buy now | order now)Monitor for product availability with purchase options
##(sale | discount | clearance) ($9.99 | $19.99 | $29.99)Monitor for sale announcements with specific price points
##(tickets available | seats available) (section a | section b | vip)Monitor for ticket availability in specific sections
##(now hiring | apply now) (remote | work from home)Monitor for remote job opportunities
##(ps5 | playstation 5 | xbox) (in stock | available | buy)Monitor console availability
##(for sale | new listing) (3 bedroom | 4 bedroom)Monitor property listings
##(sale | deal | discount) (new york | los angeles | miami)Track flight deals to specific cities
$/ prefix and end with / suffix.$/\$\d+\.\d{2}/Match price format like $99.99
$/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/Match email addresses
$/\+?\d{1,3}\s?\d{2,3}\s?\d{3,4}\s?\d{4}/Match various phone formats
$/\d{2}/\d{2}/\d{4}/Match date format MM/DD/YYYY
$/(In Stock|Available|Ships Today)/Match multiple availability statuses
.Any character, except newline\wWord character (a-z, A-Z, 0-9, _)\dDigit (0-9)\sWhitespace (space, tab, newline)\WNot a word character\DNot a digit\SNot whitespace[abc]Any of a, b, or c[a-e]Characters between a and e[1-9]Digit between 1 and 9[^abc]Any character except a, b, or c^Start of string (or line in multiline mode)$End of string (or line in multiline mode)\bWord boundary\BNon-word boundary\AStart of string (absolute)\Z End of string (before final newline)\zAbsolute end of string^abcString starts with "abc"abc$String ends with "abc"\bword\bMatch whole word "word"a*Match 0 or more timesa+Match 1 or more timesa?Match 0 or 1 time (optional)a{5}Match exactly 5 timesa,3}Match up to 3 timesa{3,}Match 3 or more timesa{1,3}Match between 1 and 3 times\d{3}Exactly 3 digits\d{2,4}Between 2 and 4 digits\w+One or more word characters(abc)Capture group - match and capture "abc"(a|b)Match "a" or "b"(?:abc)Non-capturing group - match but don't capture\1Backreference to 1st capturing group(cat|dog)Match "cat" or "dog"(\d{3})-(\d{4})Capture area code and number separately(\w+)\s\1Match repeated words (e.g., "the the")a(?=b)Positive lookahead - match "a" only if followed by "b"a(?!b)Negative lookahead - match "a" only if NOT followed by "b"(?<=a)bPositive lookbehind - match "b" only if preceded by "a"(?<!a)bNegative lookbehind - match "b" only if NOT preceded by "a"\d+(?= dollars) Match numbers before " dollars"(?<=\$)\d+Match numbers after "$"\w+(?!@)Match words not followed by "@"\. \* \\Escape special characters (literal dot, asterisk, backslash)\tTab character\nNewline character\rCarriage return. * + ? ^ { } [ ] ( ) | \Special characters that need escapingTest your regex patterns using online tools before using them in monitors:
$/\$[1-4]\d\.\d{2}/Monitor for prices between $10-$49.99
$/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/Detect when email addresses appear on page
$/\d{2}/\d{2}/\d{4}/Monitor for date format changes (MM/DD/YYYY)
$/\+?\d{1,3}\s?\d{2,3}\s?\d{3,4}\s?\d{4}/Detect phone number appearances
@@ prefix.@@//h1Any "h1" element@@//div//pAny "p" inside "div" (descendant)@@//ul/liDirect "li" children of "ul"@@//ul/li/aDirect path: "ul" โ "li" โ "a"@@//div/*All children of "div"@@/Root "element"@@/bodyRoot โ "body"@@/html/body/divAbsolute path from root "element"@@//*[@id="price"]Element with "id="price"@@//*[@class="product"]Element with "class="product"@@//div[contains(concat(' ',normalize-space(@class),' ')," active ")]Class contains "active" (proper class matching)@@//input[@type="submit"]Input with "type="submit"@@//a[@id="abc"][@for="xyz"]Multiple attributes (chained)@@//a[@rel]Has rel attribute (any value)@@//a[starts-with(@href, "/")]href starts with "/"@@//a[ends-with(@href, ".pdf")]href ends with ".pdf"@@//a[contains(@href, "://")]href contains "://"@@//ul/li[1]First li (index starts at 1)@@//ul/li[2]Second li@@//ul/li[last()]Last li@@//ul/li[last()-1]Second to last li@@//ul/li[position()<3]First two li elements@@//*[1][name()="a"]First child that is an "a"@@//*[last()][name()="a"]Last child that is an "a"@@//li[1][@id="first"]First li with "id="first"@@//h1/following-sibling::ulAll ul siblings after h1@@//h1/following-sibling::ul[1]Next ul sibling after h1@@//h1/following-sibling::*[@id="next"]Next sibling with "id="next"@@//h1/preceding-sibling::divAll div siblings before h1@@//button[text()="Submit"]Exact text match@@//button[contains(text(),"Go")]Text contains "Go"@@//span[starts-with(text(),"Price:")]Text starts with "Price:"@@//a/text()Get text content of "a"
@@//a/@hrefGet "href" attribute value@@//img/@srcGet "src" attribute value@@//*/@data-priceGet "data-price" attribute@@//a[@id = "link"]Equal to@@//a[@id != "link"]Not equal to@@//product[@price >" 25]Greater than@@//product[@price < 100]Less than@@//div[@id="main" and @class="active"]AND condition@@//div[@id="main" or @id="alt"]OR condition@@//h1[not(@id)]NOT condition (no id attribute)@@//div[(x and y) or not(z)]Complex logic with parentheses@@//ul[li]ul that has li children@@//ul[*]ul that has any children@@//ul[count(li) > 2]ul with more than 2 li children@@//ul[count(li[@class="hide"]) > 0]ul with hidden li children
@@//ul/li/..Parent of li (the ul)@@//li/ancestor::sectionAncestor section of li@@//li/ancestor-or-self::sectionSection ancestor or self@@//div/descendant::spanAll span descendants of div@@//div/descendant-or-self::*Div and all its descendants@@//h1/following::divAll divs after h1 in document@@//h1/preceding::divAll divs before h1 in document@@//a | @@//divAll "a" and "div" elements@@//button | @@//input[@type="submit"]All buttons and submit inputs@@//h1 | @@//h2 | @@//h3All heading elementsTest XPath expressions directly in Firefox or Chrome DevTools console:
@@$x("//div[@class="price"]")This will return an array of matching elements you can inspect.
@@//div[contains(text(), "22nd floor") or contains(text(), "lower than 22")]Monitor for specific floor requirements in listings
@@//span[@class="stock-status" and text()="In Stock"]Monitor specific stock status with attribute and text matching
@@//table[@id="prices"]//tr[2]/td[3]Monitor specific cells in data tables
@@//a[contains(@href, "download") and contains(text(), "PDF")]Monitor for specific download links
#priceMonitor element with "id="price"
.product-titleMonitor elements with "class="product-title"
[data-status="available"]Monitor elements with specific attribute value
.container .price-valueMonitor nested elements
.price, .stock, .availabilityMonitor multiple elements at once
.add-to-cart-buttonMonitor when add to cart button appears
#product-priceMonitor price element by ID
.notification-badgeMonitor for new notifications
[data-status="active"]Monitor elements with specific status attributes