One way to tell the search engines something moved

Every path that changes what the sitemap would return — publishing, unpublishing, deleting, editing a live post, adding a page — calls one function that pings IndexNow, resubmits the sitemap to Search Console and remembers the URL set.

What it is

A single entry point taking an optional list of changed URLs and a reason. It computes the full live URL set (static pages plus every published post), hashes it, compares against the last announced hash, pings IndexNow with the narrowed list when one is given, resubmits the sitemap through Search Console when connected, and only stores the new hash once something actually landed.

Also called: ping search engines · submit sitemap · index my new page · tell google

See it
One way to tell the search engines something moved
Area
Integrations
Group
Search engine plumbing
System
Marketing Site
Solves
3 named problems
01liveSiteUrls() builds the true current set: the canonical page list plus every published post.
02urlSetHash() fingerprints the set order-independently, so a re-sort is not a change.
03An unchanged set with no explicit URLs and no force flag is a no-op, so the daily sweep costs nothing when nothing moved.
A flow diagram: publish / unpublish / edit / delete / daily sweep all arriving at one announce call, fanning out to IndexNow and Search Console. Sample data — no customer information appears here.
How it works
  1. 1liveSiteUrls() builds the true current set: the canonical page list plus every published post.
  2. 2urlSetHash() fingerprints the set order-independently, so a re-sort is not a change.
  3. 3An unchanged set with no explicit URLs and no force flag is a no-op, so the daily sweep costs nothing when nothing moved.
  4. 4IndexNow is pinged with the narrowed list when given, the full set otherwise; the hash and Search Console always reflect the full set.
  5. 5The hash is stored ONLY when a ping actually succeeded, so a failed announcement retries on the next cron tick rather than being forgotten.
Why we built it

The function exists because three partial implementations added up to a silent failure, described in full: "Before it existed each caller did its own half of the job: the panel's Publish pinged the post URL but never updated the change hash, the daily cron hashed only the static pages so it never noticed a post at all, and unpublish/delete announced nothing whatsoever. Three partial implementations meant a post could go live and be told to nobody — which is exactly what happened on 08-21."

The problem
  • Each publishing path did a different half of the announcement job.
  • Publishing a post never updated the change hash, so the daily sweep never noticed.
  • Unpublishing and deleting announced nothing at all.
Sound familiar?
What you get
Every change to the live URL set is announced the same way
Nothing is pinged when nothing changed, so engine patience is not spent
A failed announcement retries instead of being marked done
What's inside

See it on your own jobs

Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.

or keep browsing features →