Discourse-indexnow — Instantly notify Bing & Yandex when topics are created or edited

:information_source: Summary Automatically submits public topic URLs upon creation, edit, deletion, and replies to the IndexNow protocol so Bing, Yandex, and other compatible search engines can discover or delist your content in minutes without waiting for crawlers.
:hammer_and_wrench: Repository github.com/imlotso/discourse-indexnow
:open_book: Install Guide How to install plugins in Discourse

A Chinese-language writeup with more background is also available on my forum: sitetalk.net/t/topic/642

Features

  • Automatically submits new public topics; resubmits when the first post or critical topic attributes change.
  • Submit on Reply: Automatically submits the paginated URL (e.g. ?page=3) when new replies are posted, with a configurable per-URL cooldown to prevent spamming.
  • Automatically submits topic URLs upon deletion to help engines detect 404/410 and delist quickly.
  • Automatically batches localized topic URLs when Content Localization and crawler locale query parameters are active. Uses the actual configured locale parameter, not hardcoded.
  • Bundles canonical and localized URLs into single IndexNow urlList batch requests instead of sending one by one.
  • Historical Backfill: Filter by category and date range, preview match counts, and bulk submit. Automatic chunking for batches exceeding the 10,000 protocol limit. Active jobs can be canceled from the Logs tab.
  • Manual Submission: Submit custom URLs on-demand line by line; external or ineligible links are filtered out automatically.
  • Smart Rate Limiting: Applies hourly and daily limits using a fine-grained sliding window algorithm. Automatically backs off on 429 (honoring Retry-After). The admin UI features visual Quota Bars showing current usage and exact time until capacity frees up.
  • Exclude specific categories and tags as business-layer rules on top of automated privacy filters.
  • Key rotation with an accidental-overwrite confirmation dialog; previous keys are invalidated immediately.
  • Admin verification for public accessibility of /<key>.txt.
  • Topic moves, category visibility shifts, and tag updates trigger asynchronous resubmission or exclusion fan-out in background jobs to prevent UI blocking.
  • Rich log entries with batch IDs, locale, trigger reasons, 7-day success/fail trend charts, and categorized failure reasons (Rate Limited, Key Error, Domain Mismatch).
  • Fully asynchronous submissions adhering to privacy boundaries: PMs, restricted categories, unlisted/deleted topics, and login-required sites are never submitted.
  • Available in both English and Simplified Chinese.

Setup Steps

  1. Install plugin following the guide above and rebuild your container.
  2. Go to Admin > Plugins > discourse-indexnow.
  3. Under Settings, click Generate key (or paste an existing 32-char hex key).
  4. Check Enable IndexNow submissions.
  5. Verify key public accessibility:
https://your-forum-domain.com/<key>.txt

Should return HTTP 200 with the key string. The admin panel displays a cached green/red indicator as well.
6. (Optional) In the Logs tab, use the “Backfill” panel: select criteria, click Preview, then Submit.
7. (Optional) Use the manual submission box to submit individual URLs outside the automated flow.

The Logs page also features quota usage bars, a 7-day trend chart, and failure breakdown metrics to easily diagnose submission issues.

Configuration Settings

Setting Description
indexnow_enabled Master switch. Disabled automatically if login_required is enabled.
indexnow_api_key The 32-character hex key for submission verification.
indexnow_submit_on_create Auto-submit when a new public topic is created.
indexnow_submit_on_edit Auto-resubmit when first post or topic attributes change.
indexnow_submit_on_reply Auto-submit the specific paginated URL when new replies are posted.
indexnow_url_cooldown_minutes Cooldown period per URL (in minutes) to prevent duplicate submissions.
indexnow_excluded_category_ids Categories to exclude even if public.
indexnow_excluded_tag_names Tags to exclude even if topic category is eligible.
indexnow_hourly_limit Maximum URLs to submit per hour (sliding window).
indexnow_daily_limit Maximum URLs to submit per day (sliding window).

Known Limitations

  • Google does not currently participate in the IndexNow protocol.
  • Localized URLs are only submitted when crawler locale parameters are active and localized content exists.
  • Currently, first post edits and new reply pagination are supported, but edits to intermediate replies do not trigger submissions independently.

This is an independent, unofficial plugin — not maintained by the Discourse team. It’s running in production on my own forum, has RSpec test coverage with CI on every push/PR, and I’d appreciate any bug reports or feature requests via GitHub issues or replies here.

7 likes

Thanks for this! I was literally just saying, do I need to make my own Indexnow plugin? And boom! Found this!

Can you tell me does the indexnow_submit_on_edit issue an indexnow submission upon ALL rebakes that change content?

No — it only fires on genuine edits via the normal PostRevisor flow, and only
for the topic’s first post (OP). Non-OP replies and system-triggered rebakes
(image-fix crons, admin bulk rebake, etc.) don’t trigger a resubmission, since
those don’t go through the event this plugin hooks into.

I’ve been using the plugin for the past week, and it has been great. It performs exactly as I need it to, although I did encounter a few bugs that caused the plugin to fail immediately upon installation.

Specifically, I found route collisions with other plugins using the same endpoints. There was also an issue with rate limiting, where submissions could hit the limit, wait a few minutes, and hit it again. Additionally, the admin panel stylesheet was being injected into public areas, and the CSS classes were not properly prefixed for the plugin.

I also added a feature I really wanted: the ability to submit when there is a reply to a topic. This submission is keyed to a specific page number so that it doesn’t process the entire topic. For topics with hundreds of replies, it only submits the last page, which helps the crawler find the reply and update the topic much faster.

2 likes

Merged.

Thanks for taking the time to do such a deep dive into the codebase. The bucketing logic for the sliding window and the background job batching are solid improvements. The reply trigger is a great touch, too.

I’ve updated the main post docs to cover the new quota bars and cooldown settings you added.

Really appreciate the high-quality PR and the detailed write-up. :content:

1 like