RSS Feed Not Working? Common Causes and Fixes
Diagnose an RSS feed that will not load or validate. Check its URL, HTTP response, XML, encoding, version, and publisher settings.
An RSS feed usually fails because its URL returns an error or unexpected content, its XML is malformed or misdeclared, its HTTP charset conflicts with the document encoding, its version or extension syntax is incorrect, or the reader has an outdated or incorrect feed address. Start with the exact feed URL, inspect the HTTP response, and validate the returned document before changing reader settings.
RSS is XML. An RSS 2.0 document has an <rss> root with a version attribute and a <channel> child, and it must conform to XML 1.0. An HTML error page, login screen, or other non-feed response will not be repaired by resubscribing to the homepage. See the RSS 2.0 specification.
1. Confirm the exact feed URL and HTTP response
Use the subscription address, not just the site homepage. Request that URL and determine whether it returns feed XML, an HTTP error, a web page, or a redirect. A redirect may be valid, but it should lead to the current feed endpoint and remain accessible to the reader.
curl -i -L "https://example.com/feed/"
Replace the example address with the exact URL saved in the reader. The response headers show status, redirects, content type, and possibly charset. The body should begin with XML content, commonly an XML declaration followed by an RSS or Atom root element. Do not assume the homepage URL is also the feed URL.
If the feed URL returns an error page or unrelated HTML, fix delivery first: check the address, server route, access rules, reverse proxy, and redirect configuration. XML validation cannot fix a response that is not the feed.
2. Validate the document that the reader receives
Submit the exact feed URL to the W3C Feed Validation Service. You can also paste the returned document into the validator when the URL cannot be fetched by the service. It checks RSS and Atom formats and reports the type and location of errors.
Use the first reported error as a starting point. Later errors can be consequences of an earlier malformed tag or invalid character. A successful validation checks the document syntax; it does not prove that every reader can fetch it or that the publisher selected the intended feed.
3. Repair XML syntax and invalid characters
For an RSS 2.0 feed, check that there is one root <rss version="2.0">, a <channel> inside it, and properly nested, closed elements. Look for content before or after the root, mismatched tags, invalid control characters, and raw ampersands or less-than signs in plain text.
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Example site</title>
<link>https://example.com/</link>
<description>Updates from Example</description>
<item>
<title>Research & development</title>
<link>https://example.com/posts/research/</link>
<description>A short update about XML feeds.</description>
<guid>https://example.com/posts/research/</guid>
</item>
</channel>
</rss>
In XML text, write a literal ampersand as & and a literal less-than sign as <. Ensure generated content is escaped by the feed software rather than manually escaping it twice. If the publisher emits HTML in a field, it must still be represented in XML safely.
4. Check RSS version and extension namespaces
Make sure the feed structure matches the format it declares. RSS 2.0 uses a version="2.0" attribute. RSS 1.0 and RSS 0.90 have different structures and do not use that version attribute; changing only the version label does not convert one format into another. The validator documents these distinctions in its RSS version guidance.
RSS 2.0 allows extensions when their elements and attributes are defined in a namespace. Declare the namespace on the appropriate element and use its prefix consistently. For example, an extension prefix must be bound to its namespace URI; an undeclared prefix makes the XML invalid. If an extension is optional, test the feed without it to identify whether it is the source of the error.
5. Make the XML encoding and HTTP charset agree
Compare the XML declaration, such as encoding="UTF-8", with the HTTP Content-Type charset. A mismatch can be interpreted differently by feed aggregators. The W3C validator recommends matching the HTTP charset to the declaration or having the server make no conflicting encoding claim. See its encoding mismatch guidance.
For RSS, W3C recommends the application/rss+xml media type. RSS 1.0 may use application/rdf+xml; application/xml is a general XML alternative. Inspect the header from the public URL, including any CDN or proxy layer, because it may differ from the application server’s configuration.
6. Verify the publisher’s feed address and redirects
Some publishing systems expose several feeds. Confirm that the reader uses the posts feed, not a comments feed or another feed type. If the site moved, changed its permalink structure, or migrated platforms, arrange a redirect from the previous feed address to the current one.
WordPress feed selection
WordPress supports multiple feed formats, including RSS 2.0, RSS 1.0, RSS 0.92, Atom, and a comments RSS feed. The comments feed contains comments rather than post entries. A theme may omit visible links for some feed types even when the platform provides them. Consult the WordPress Feeds documentation for its feed addresses and redirect examples.
After a migration, check that the old address redirects to the new one and that the destination is publicly reachable. A redirect to the homepage is not equivalent to a redirect to the feed.
7. Diagnose reader-specific failures
If the feed validates and loads for you but one named reader cannot subscribe or refresh it, compare that reader’s exact error with the response for the same URL. Check the address stored in the reader, redirect chain, HTTP status, authentication or access controls, and whether the reader can retrieve the endpoint. A browser display alone does not establish that every client receives the same response.
There is no single universal cause for a feed that works in one reader but fails in another. The reader’s fetch error and the server response for that request are needed to distinguish compatibility from delivery problems.
8. Troubleshooting checklist
| Symptom | Likely area to inspect | Next action |
|---|---|---|
| Feed URL shows a 404 or 5xx | Address, route, server, proxy, or migration redirect | Correct the endpoint or redirect and request the URL again. |
| Feed URL displays a site page or login | Wrong URL, access control, or redirect destination | Use the actual feed endpoint and verify public access requirements. |
| Validator reports mismatched or unclosed tags | Malformed XML output | Fix the first structural error and validate again. |
| Validator reports invalid characters | Unescaped text or illegal XML characters | Escape ampersands and less-than signs in text; remove invalid characters. |
| Validator reports an encoding mismatch | XML declaration and HTTP charset disagree | Make the emitted bytes, declaration, and header consistent. |
| Validator reports an invalid RSS version | Declared version does not match feed structure | Correct the generator’s format; do not relabel a different format as RSS 2.0. |
| Custom field or prefix is invalid | Missing or inconsistent XML namespace | Declare the extension namespace and use the prefix consistently. |
| Old subscription stopped after a site move | Legacy URL no longer redirects to the feed | Add or repair a redirect to the new feed endpoint. |
| Only one reader fails | Stored URL, fetch behavior, access control, redirect, or client compatibility | Compare that client’s error with the HTTP response it receives. |
9. Capture the failure as a screenshot when it is visual
When the endpoint unexpectedly returns a branded error page, consent banner, or browser-rendered output, a screenshot can help document what a visitor sees. For XML syntax and response headers, inspect the raw response and validator output; a screenshot does not replace those checks.
DIY browser capture with Playwright
This runnable Node.js example opens the exact feed URL in Chromium, records the response status and content type, and saves a screenshot. Install Playwright and its browser first with npm install playwright and npx playwright install chromium.
// save as capture-feed.mjs
import { chromium } from 'playwright';
const url = process.argv[2] ?? 'https://example.com/feed/';
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage({ viewport: { width: 1280, height: 900 } });
try {
const response = await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
console.log('HTTP status:', response?.status() ?? 'no main response');
console.log('Content-Type:', response?.headers()['content-type'] ?? 'not available');
await page.screenshot({ path: 'feed-response.png', fullPage: true });
} finally {
await browser.close();
}
Run it with node capture-feed.mjs https://example.com/feed/. The screenshot is useful for a visible page or error response. Browsers may display raw XML in their own viewer, but use curl and a feed validator to inspect the actual response and syntax.
Or skip the browser setup
ScreenshotNeo is a website screenshot API and MCP server from ScreenshotNeo. One GET request captures a URL as PNG, JPEG, WebP, or PDF. See the API documentation.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com/feed/ -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://example.com/feed/"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://example.com/feed/' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
await import('node:fs/promises').then(fs => fs.writeFile('shot.webp', Buffer.from(await res.arrayBuffer())));
Cookie banners, newsletter popups, and chat widgets are removed before the shot. Bot checks, blank pages, and failed loads are never billed; responses include page verdict and billing headers. An MCP server lets AI agents take screenshots. The Free plan includes 1,000 screenshots a month with no card, and paid plans start at $5 for 3,000 screenshots. Sign up for 1,000 free screenshots a month, with no card required.
10. Performance, reliability, and cost notes
- Validate the public endpoint: a locally generated file can be valid while a proxy, CDN, or production route serves different bytes or headers.
- Check after each change: re-request the same URL and rerun validation so you can tie the result to the fix.
- Preserve redirects: maintaining old feed URLs prevents existing subscriptions from depending on readers discovering a new address.
- Do not infer validity from appearance: a browser may render malformed or unexpected content differently from an aggregator.
- Cost: the W3C validator is an online diagnostic service; this troubleshooting flow does not require a paid RSS tool. A screenshot service is useful only when a visual record of the response helps communicate the failure.
FAQ
Is RSS the same as Atom?
No. Both are XML feed formats, but they have different structures and validation rules. Validate against the format the publisher actually generates.
Can a valid feed still fail in a reader?
Yes. Syntax validation does not test every reader’s access to the URL, redirect handling, or compatibility with extensions.
Should I change the feed URL in every reader after a site move?
Prefer to keep the old URL redirecting to the new feed where possible. Existing subscriptions may continue to use the old address.
Does a screenshot prove that the XML is valid?
No. Use the raw response and a feed validator for XML and headers; screenshots document visible browser output.


