{"id":6201,"date":"2026-08-24T13:03:50","date_gmt":"2026-08-24T10:03:50","guid":{"rendered":"https:\/\/www.scalahosting.com\/kb\/?p=6201"},"modified":"2026-08-24T13:03:51","modified_gmt":"2026-08-24T10:03:51","slug":"use-text-presence-monitoring-spanel","status":"publish","type":"post","link":"https:\/\/www.scalahosting.com\/kb\/use-text-presence-monitoring-spanel\/","title":{"rendered":"How to Use Text-Presence Monitoring in SPanel"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Text-presence monitoring in SPanel watches a page for a specific string and alerts you when that text disappears, catching the &#8220;200 OK but actually broken&#8221; case a plain uptime ping misses. It rides on the same Website Monitoring and Notifications Manager plumbing as uptime checks.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>One caveat<\/strong>: the field where you would type the expected string is not in the current user UI, so treat this as an explainer of the capability rather than a click-path you can finish today.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Who this is for<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is for site owners and the person running a managed VPS who have been burned by a page that loads with a clean 200 status but shows the wrong content &#8211; a blank product grid, a vanished checkout form, or a homepage reverted to a placeholder. If up\/down checks keep saying everything is fine while customers say otherwise, this is the check you want.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What problem this solves<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An uptime ping only asks &#8220;<em>did the server answer?<\/em>&#8221; &#8211; not &#8220;<em>did it answer with the right thing?<\/em>&#8221; A database hiccup, a broken template, or a failed deploy can all return a healthy 200 while the content that matters is gone, and you find out from a customer email. Text-presence monitoring closes that gap by tying the page&#8217;s health to a string that should only be there when it is genuinely working.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How SPanel solves this<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The monitoring lives under <strong>Domains &gt; Website Monitoring<\/strong>. Each domain gets a row with an <strong>Enable Monitoring<\/strong> toggle, and the page surfaces a <strong>Slow Events<\/strong> metric so you can see when a site is responding but dragging. Turning the toggle on tells SPanel to poll that domain on a schedule.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The text-presence behavior extends this same check: instead of only confirming the page answers, it confirms a chosen string is still present in the response body. When that string goes missing, SPanel raises an event and routes the alert through the same Notifications Manager that handles uptime alerts.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Why this is different in SPanel<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Two things set this apart from a generic ping.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, the check is content-aware: it alerts on a string disappearing, catching failures an up\/down probe reports as healthy.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Second, it reuses the same Website Monitoring feature and Notifications Manager that deliver your uptime alerts &#8211; no second tool, no second place to look.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Before you start<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Access to your <strong>SPanel user account<\/strong> (not the admin panel).<\/li>\n\n\n\n<li>At least <strong>one domain hosted in SPanel<\/strong> that you can monitor.<\/li>\n\n\n\n<li>A <strong>page<\/strong> you care about, and a <strong>string<\/strong> that appears <strong>only<\/strong> <strong>when it is healthy<\/strong>.<\/li>\n\n\n\n<li><strong>Notifications Manager<\/strong> set up so alerts reach you. Nothing here is destructive, so no backup is needed.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step-by-step<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open <strong>Domains > Website Monitoring<\/strong> in SPanel. You will see one row per domain &#8211; in our example, the yoga.life domain &#8211; each with its monitoring toggle and the <strong>Slow Events<\/strong> metric.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large mpg-gallery\"><img decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/08\/01-monitoring-list-1024x640.webp\" alt=\"How to Use Text-Presence Monitoring in SPanel, Step-by-step\" class=\"wp-image-6202\" srcset=\"https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/08\/01-monitoring-list-1024x640.webp 1024w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/08\/01-monitoring-list-300x188.webp 300w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/08\/01-monitoring-list-768x480.webp 768w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/08\/01-monitoring-list.webp 1440w\" sizes=\"(max-width: 361px) 660px, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 910px, 1140px\" \/><\/figure>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Open the domain&#8217;s monitoring settings. The dialog shows the <strong>Enable Monitoring<\/strong> toggle; turn it on and save, and the row should show monitoring as active.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large mpg-gallery\"><img decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/08\/02-monitoring-settings-1024x640.webp\" alt=\"How to Use Text-Presence Monitoring in SPanel, Step-by-step 2\" class=\"wp-image-6203\" srcset=\"https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/08\/02-monitoring-settings-1024x640.webp 1024w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/08\/02-monitoring-settings-300x188.webp 300w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/08\/02-monitoring-settings-768x480.webp 768w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/08\/02-monitoring-settings.webp 1440w\" sizes=\"(max-width: 361px) 660px, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 910px, 1140px\" \/><\/figure>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>To add the expected-text check, you would enter the string the page must contain. That input is <strong>UI confirmation required<\/strong> &#8211; it is not in the dialog above, so this step cannot be completed from the user UI today. Plan the string you would use (one unique to a healthy page) and hold until it is confirmed.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What happens behind the scenes<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once monitoring is on, SPanel polls the domain on a schedule and records the result, including Slow Events when the page is sluggish. With an expected-text value set, the back-end check (website_content_missing) compares the response body against your string and raises an event when it is absent.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That event flows into Notifications Manager and reaches you through your channels &#8211; so an alert fires on a broken-but-200 page instead of staying silent until someone complains.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Limitations and edge cases<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>It matches literal text, not correctness.<\/strong> The check looks for a string in the page body &#8211; not layout, images, or anything rendered by JavaScript. Whether it fetches rendered or raw HTML is unconfirmed. Choose a string present in the server&#8217;s HTML response, not one injected by client-side scripts.<\/li>\n\n\n\n<li><strong>A broken 200 is only caught if your string is gone.<\/strong> If the page breaks but your chosen text survives, no alert fires. Pick a string that appears only when the page is truly healthy, such as content that depends on the database or template working.<\/li>\n\n\n\n<li><strong>The expected-text field is not in the current user UI.<\/strong> You cannot self-configure the string from the dialog today (UI confirmation required). Enable monitoring now for uptime and Slow Events, and revisit the text check once the field is confirmed.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Troubleshooting<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-regular green-rows\"><table class=\"has-fixed-layout\"><tbody><tr><td>Symptom<\/td><td>Likely cause<\/td><td>What to do<\/td><\/tr><tr><td>No expected-text field in the settings dialog<\/td><td>The input is not present in the current user UI<\/td><td>This is expected today; enable monitoring for uptime and watch for a new field we will soon add<\/td><\/tr><tr><td>No alert when a page is visibly broken<\/td><td>The chosen string still appears on the broken page<\/td><td>Pick a string that only renders when the page is healthy<\/td><\/tr><tr><td>False alert on a healthy page<\/td><td>The string is injected by JavaScript, not in the raw response<\/td><td>Use text from the server&#8217;s HTML response instead<\/td><\/tr><tr><td>Alerts never arrive<\/td><td>Notifications Manager has no active channel<\/td><td>Configure a delivery channel in Notifications Manager<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>When to use this \/ when not to use this<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-regular green-rows\"><table class=\"has-fixed-layout\"><tbody><tr><td>Use this when<\/td><td>Skip or use something else when<\/td><\/tr><tr><td>A page returns 200 but content can silently vanish<\/td><td>You only need basic up\/down status<\/td><\/tr><tr><td>A healthy page has a unique, stable string to anchor on<\/td><td>The content is rendered entirely by client-side JavaScript<\/td><\/tr><tr><td>You want alerts in the same place as uptime alerts<\/td><td>You need visual or pixel-level verification<\/td><\/tr><tr><td>Database- or template-dependent content must stay visible<\/td><td>The page content changes constantly with no stable marker<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>FAQ<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>Does text-presence monitoring replace uptime monitoring?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> No. It adds a content check on top of Website Monitoring. Uptime tells you the server answered; text-presence tells you it answered correctly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>Can I set the expected string myself right now?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> Not from the current user UI &#8211; the field is not present (UI confirmation required). You can enable monitoring for uptime and Slow Events today.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>What string should I choose?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> One that appears only when the page is genuinely healthy, like a heading tied to a working database query. Avoid generic text that survives a broken render.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>Where do the alerts go?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> Through Notifications Manager, the same channels that deliver your uptime alerts. Configure at least one channel so events reach you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>Does enabling monitoring change my site?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> No. Monitoring only polls the page from outside; it does not modify content or settings, so there is nothing destructive to undo.<\/p>\n\n\n\n<script type=\"application\/ld+json\">\n    {\n      \"@context\": \"https:\/\/schema.org\",\n      \"@type\": \"FAQPage\",\n      \"mainEntity\": [{\n        \"@type\": \"Question\",\n        \"name\": \"Does text-presence monitoring replace uptime monitoring?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"No. It adds a content check on top of Website Monitoring. Uptime tells you the server answered; text-presence tells you it answered correctly.\"\n        }\n      }, {\n        \"@type\": \"Question\",\n        \"name\": \"Can I set the expected string myself right now?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"Not from the current user UI - the field is not present (UI confirmation required). You can enable monitoring for uptime and Slow Events today.\"\n        }\n      },{\n        \"@type\": \"Question\",\n        \"name\": \"What string should I choose?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"One that appears only when the page is genuinely healthy, like a heading tied to a working database query. Avoid generic text that survives a broken render.\"\n        }\n      },{\n        \"@type\": \"Question\",\n        \"name\": \"Where do the alerts go?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"Through Notifications Manager, the same channels that deliver your uptime alerts. Configure at least one channel so events reach you.\"\n        }\n      },{\n        \"@type\": \"Question\",\n        \"name\": \"Does enabling monitoring change my site?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"No. Monitoring only polls the page from outside; it does not modify content or settings, so there is nothing destructive to undo.\"\n        }\n      }]\n    }\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Text-presence monitoring in SPanel watches a page for a specific string and alerts you when that text disappears, catching the &#8220;200 OK but actually broken&#8221; case a plain uptime ping misses. It rides on the same Website Monitoring and Notifications Manager plumbing as uptime checks.&nbsp; One caveat: the field where you would type the expected [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_seopress_titles_title":"How to Use Text-Presence Monitoring in SPanel | ScalaHosting KB","_seopress_titles_desc":"Learn how to use Text-Presence Monitoring in SPanel to verify specific text appears on your website. Get notified when critical content changes or becomes unavailable.","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"","_seopress_news_disabled":"","_seopress_video_disabled":"","_seopress_video":[],"_seopress_pro_schemas_manual":[],"_seopress_pro_rich_snippets_disable_all":"","_seopress_pro_rich_snippets_disable":[],"_seopress_pro_schemas":[],"footnotes":""},"categories":[66],"tags":[],"class_list":["post-6201","post","type-post","status-publish","format-standard","hentry","category-tutorials"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/posts\/6201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/comments?post=6201"}],"version-history":[{"count":2,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/posts\/6201\/revisions"}],"predecessor-version":[{"id":6206,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/posts\/6201\/revisions\/6206"}],"wp:attachment":[{"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/media?parent=6201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/categories?post=6201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/tags?post=6201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}