The calendar worked perfectly well for a person with a modern browser.
Google saw almost nothing.
The public calendar was a single-page application. Its initial HTML response was an application shell, and JavaScript supplied the useful content after load. Search Console showed one crawl followed by months in “Crawled – currently not indexed.” My diagnosis was that the empty initial response gave Google too little reason to return. Search Console did not state that conclusion for me.
The calendar had thousands of useful event, artist, venue, and parking records behind an empty front door.
The Daily Notification Was A No-Op
The project was also submitting URLs through Google’s Indexing API. That looked like proactive indexing, but the API is not a general-purpose URL submission service. Google limits it to pages containing JobPosting or livestream BroadcastEvent markup.
The requests did not make ordinary calendar pages eligible for priority indexing. A successful API exchange was not evidence that Google accepted the pages for crawling.
I had automated the wrong reassurance. The job reported activity, while Search Console showed no crawl movement and virtually no impressions.
Give The Crawler A Real Entrance
Rebuilding the calendar as a fully server-rendered application would have been disproportionate. I server-rendered the entry points that explain the site:
- Calendar homepage.
- Artist directory hub.
- Venue directory hub.
- Parking directory hub.
Those pages now return meaningful headings, descriptions, navigation, and links into the detail pages without requiring JavaScript execution.
Humans still receive the interactive application. Crawlers receive an honest representation of the same underlying content and paths.
Cache Variants Had To Stay Separate
Serving different render paths introduces a cache risk. If the edge caches a browser response and later serves it to a crawler, the empty shell returns. If it caches the crawler page and serves it to a person, the application experience degrades.
Verified crawlers therefore bypass the normal edge cache for these entry points. The server uses transparent proxying so the requested URL remains stable instead of adding redirects between the crawler and the rendered response.
A dedicated pages sitemap exposes the new hubs, while normal post and entity sitemaps continue to describe the larger inventory.
Monitor The Outcome, Not The Submission
The old job “notified” Google daily without proving anything changed. I replaced it with sitemap submission and a weekly Search Console health check.
The first useful signal is a new crawl time. The second is nonzero impressions. Until those move, implementation success is only a hypothesis.
The calendar was never short on content. It was short on an entrance that a crawler could understand. Search visibility began with making the first response tell the truth.