An RSS import works perfectly the first time and reveals its real quality the second time.
If the importer cannot recognize an item it has already processed, every scheduled run can create another WordPress post from the same source article. A feed containing 20 entries can become 40 posts after two runs, 60 after three, and a much larger cleanup after a weekend. Titles, images, taxonomies and notifications may be duplicated with them.
The solution is not to run the feed only once. A useful RSS importer must be repeatable: it should fetch the feed, identify every item, skip or update the records it has seen, create only genuinely new posts, and record what happened.
This tutorial uses Echo RSS Feed Post Generator Free for the basic workflow. The free edition includes unlimited rules, scheduled imports, full-content extraction, draft publishing and source-URL fingerprinting. The paid Echo RSS Feed Post Generator adds the tools needed for more demanding projects, including feed discovery, JavaScript-rendered extraction, live feed display, Gutenberg conversion and deeper RSS-field mapping.
The Short Answer
To import an RSS feed without duplicate posts, use a feed-to-post plugin that stores a stable identifier for every source item. In Echo Free, imported items are fingerprinted by source URL, so running the same rule again should continue from the last new item instead of recreating earlier posts. The paid listing also documents duplicate checking by title and/or URL.
Create one rule for one logical source, import into Draft status, enable logging, run the rule manually, and then run it a second time without changing anything. The second run should create zero posts. Only after that test passes should you enable a schedule.
URL matching is the safest ordinary default, but it is not infallible. The same story can arrive with tracking parameters, redirected URLs or different links in two feeds. Title matching can catch some of those cases, but two unrelated stories can legitimately share a title. For important sites, use URL checking as the primary identity, add title checking only where its false-positive risk is acceptable, and keep a review process for cross-feed edge cases.
Two Different Problems Are Called “Duplicate Content”
Before changing any setting, separate database duplication from search duplication.
| Problem | What it means | Correct control |
|---|---|---|
| Duplicate imported posts | WordPress contains two or more posts for the same source feed item | Source identifier, URL/title checks, idempotent retries and import history |
| Duplicate media | The same remote image is downloaded into the Media Library more than once | Media reuse rules, attachment auditing and controlled retries |
| Duplicate content across websites | Your imported post reproduces content already published at the source URL | Permission, editorial value, attribution and an explicit canonical/noindex policy |
| Duplicate-looking titles | Different stories happen to have the same or nearly the same headline | Do not delete automatically; compare source URL, date, source and content |
Echo’s duplicate detection solves the first problem. It does not grant permission to republish an article, decide which domain should rank, or guarantee that search engines will consolidate two copies. A canonical link can express a preferred URL, but it is not a copyright license and it does not repair two WordPress records already created in your database.
How RSS and Atom Identify an Item
An importer needs a stable identity that survives repeated checks. Feed formats provide several possible fields, but their quality depends on the publisher.
A typical RSS item looks like this:
<item>
<title>Quarterly product update</title>
<link>https://publisher.example/product-update/</link>
<guid isPermaLink="false">article-84721</guid>
<pubDate>Tue, 08 Sep 2026 08:30:00 GMT</pubDate>
<description>Summary of the product update...</description>
</item>The RSS 2.0 specification describes <guid> as an optional string that uniquely identifies an item. An aggregator may use it to determine whether the item is new. The format places responsibility on the feed publisher to keep that value unique and stable. A GUID can be a URL, but when isPermaLink="false", it must not be assumed to be a page that a browser can open.
Atom is stricter. Every entry must contain one atom:id, and RFC 4287 defines it as a permanent, universally unique identifier. The RFC says the ID should not change when an entry is moved, republished, exported or imported. It also requires character-by-character comparison, which means superficially equivalent strings can still count as different identifiers.
Real feeds are less tidy than their specifications. Some publishers regenerate GUIDs, omit them, reuse the same one, change a permalink, append campaign parameters or expose the same article through a category feed and a site-wide feed. A production importer therefore needs a documented fallback. Echo Free’s product page states that it fingerprints the source URL. The paid listing adds duplicate checking based on title and/or URL.
Why URL Matching Is Usually the Best Starting Point
A source URL normally identifies the public article more reliably than its headline. Editors change headlines after publication, translate them, add breaking-news labels and reuse recurring titles such as “Weekly Roundup.” The URL usually changes less often.
URL matching also has limitations. These links may all lead to the same story while looking different to a literal comparison:
https://publisher.example/story/
https://publisher.example/story/?utm_source=rss
https://publisher.example/story?output=1
http://publisher.example/story/
https://www.publisher.example/story/
https://short.example/a8K2Do not assume an importer removes tracking parameters, follows every redirect before comparing, normalizes www, or treats HTTP and HTTPS as identical unless its documentation says so. Echo’s public listing describes source-URL fingerprinting but does not document every normalization step. Test the exact feed you will use.
Title checking is a useful secondary signal when one article reaches the site through more than one feed with different source URLs. It must be used carefully. Blocking every repeated title can discard valid recurring reports, event announcements, product releases or market updates. When false positives matter, import as Draft and treat a title match as a review signal rather than proof.
Common Duplicate Scenarios
| Scenario | Likely result with URL checking | Safer response |
|---|---|---|
| The same item remains in the same feed with the same URL | It should be recognized and skipped | Confirm by running the rule twice manually |
| The publisher changes only the title | The existing source URL should still match | Decide whether to skip or update the existing post |
| The publisher changes the URL | It may appear to be a new item | Review redirects and use title checking where appropriate |
| Two feeds link to the same URL | URL checking should catch it if the stored comparison is shared across the relevant rules | Test cross-rule behavior rather than assuming it |
| Two feeds publish the same story under different URLs | URL checking alone may not catch it | Consolidate sources, add title checking or send matches to review |
| The URL gains tracking parameters | It may be treated as different if comparison is literal | Prefer a clean feed or normalize upstream where supported |
| A recurring column reuses the same title | Title checking may block a legitimate new item | Keep URL as the primary identity |
| The source updates an existing item | A skip-only rule preserves the old imported version | Use the paid edition’s documented update-existing-post behavior when required |
| An imported post is manually deleted | Re-import behavior depends on how history is stored | Test deletion on staging before defining the editorial workflow |
The last case is easy to overlook. An importer may remember the source item independently of the WordPress post, or it may use metadata on the post as its only record. Deleting, trashing or permanently removing an imported post can therefore produce different results. Test the exact edition and version before telling editors that deletion will or will not allow re-importing.
Echo Free or the Paid Edition?
Start with the free edition when the source feed is already known and returns usable HTML. Upgrade for a concrete missing capability, not because “paid” sounds inherently safer.
| Capability | Echo RSS Feed Post Generator Free | Echo RSS Feed Post Generator paid |
|---|---|---|
| Import RSS or Atom items as WordPress content | Yes | Yes |
| Unlimited rules | Yes | Yes |
| Unlimited posts per run | Yes; set the maximum to 0 | Yes |
| Source-URL duplicate fingerprint | Yes | Yes, with duplicate checking documented by title and/or URL |
| Scheduled and manual runs | Yes | Yes |
| Draft, pending, private or published status | Yes | Yes |
| Full-content extraction | Yes, with automatic Readability and manual selector options | Yes |
| Featured-image and feed-media handling | Yes | Yes |
| Filters, templates, categories, tags and custom fields | Yes | Yes |
| Feed discovery by keyword, URL or topic | No | Yes |
| JavaScript-rendered page extraction | No | Yes, through HeadlessBrowserAPI |
| Live external-feed display without creating posts | No | Yes |
| Convert generated content into native Gutenberg blocks | No | Yes |
| Deeply nested custom-tag mapping | No | Yes |
| Update an already imported post that remains in the feed | Not presented as a Free-specific selling point | Explicitly documented on the paid listing |
As checked on September 8, 2026, Echo Free on WPBay is version 4.9.6.2, updated September 7, and listed as tested with WordPress 7.1, PHP 8.5 and WooCommerce 11. Its page says there is no purchase-code step, no rule limit, no per-run post limit and no forced attribution.
The paid Echo listing is version 5.5.2, updated August 16, 2026, and listed as tested with WordPress 7.1 and PHP 8.5. WPBay’s marketplace review and maintenance data are useful release signals, but they are not substitutes for testing the source feeds, server scheduler, theme, SEO plugin and editorial workflow used by your site.
Step 1: Decide What You Are Allowed to Import
A public RSS URL is a machine-readable distribution method, not universal permission to republish every word and image commercially.
Use full-content imports for feeds you own, public-domain material, licensed sources, affiliates who authorize reuse, or partners with written syndication terms. For an ordinary third-party publication, a headline, short excerpt and clear source link is the safer default unless the publisher has granted broader rights.
Record the source owner, feed URL, permitted fields, image rights, attribution text, canonical/noindex agreement, update frequency and takedown contact before automating it. This is not bureaucratic overhead. It lets the team answer a source complaint without reverse-engineering months of generated posts.
Translation, synonym replacement or template variation does not turn copied material into material you own. Google’s current spam policies explicitly include scraping feeds and applying automated transformations such as synonymizing or translating when pages are generated at scale with little value for users. The problem is low-value scaled publishing, regardless of which tool produced it.
Step 2: Validate the Feed Before Connecting WordPress
Open the feed URL directly and confirm that it returns XML rather than an HTML error, login page, Cloudflare challenge or redirect loop. Inspect several items, not only the first one.
Use this preflight table:
| Check | What a healthy feed should show |
|---|---|
| HTTP response | 200 OK without authentication or an anti-bot challenge |
| Feed type | RSS or Atom XML that a parser recognizes |
| Item identity | A stable GUID/Atom ID and/or stable article link |
| Dates | Parseable publication or update dates in a consistent timezone |
| Links | Direct article URLs rather than one-time redirect or tracking links |
| Content | A usable summary or full-content field |
| Images | Media enclosure, content image or source page image you may legally reuse |
| Frequency | A publishing cadence that justifies the planned polling interval |
If the same publisher offers several feeds, select the narrowest one that matches your project. Importing the site-wide feed and three category feeds creates overlapping input sets. Even strong duplicate protection then performs unnecessary requests and comparisons, while inconsistent URLs can still let the same story through.
Step 3: Install Echo Free or the Paid Plugin
Download the chosen ZIP from WPBay, then open Plugins > Add New Plugin > Upload Plugin in WordPress. Select the installable archive, install it and activate it.
Use a staging site for the first import. A feed rule can create many database records and Media Library attachments in one run, so “testing” directly on production can require a large cleanup even when the plugin itself behaves correctly.
After activation, open the Echo RSS Feed Post Generator menu. Echo Free turns its main switch on automatically. Before creating a rule, open Main Settings > Plugin Options, enable rule logging and detailed rule logging, then save. Detailed logging can grow, so use it during setup and troubleshooting, then choose a practical retention policy.
The free edition includes a system report under Activity & Logging > System Info. Check the PHP version, memory, cURL availability and timeouts. Its current documentation recommends at least 256 MB of PHP memory when full-content extraction is enabled. A summary-only feed import usually needs far fewer resources than fetching and parsing dozens of complete source pages and images.
Step 4: Create One Conservative Import Rule
Open RSS to Post Rules and fill the blank rule row. For the first run, use the following baseline:
| Rule field | First-test value |
|---|---|
| RSS Feed URL | One validated, direct feed URL |
| Schedule | Longer than the source’s normal publishing interval |
| Maximum posts | 3 to 5, not unlimited |
| Post status | Draft |
| Item type | Post, or the intended custom post type after testing |
| Author | A dedicated syndication/import user |
| Active | Enabled only after the other fields are reviewed |
Save the rule before running it. A dedicated import author makes auditing easier and prevents third-party feed author names from becoming unexpected WordPress user accounts. Assign one category such as Imported Review Queue so editors can find the test items immediately.
Do not begin with 0 unlimited imports. Echo Free supports that value, but it is appropriate after the rule is proven. A feed can expose years of history, and full-content extraction can turn one accidental click into hundreds of source-page requests and image downloads.
Step 5: Configure the Duplicate Identity
Echo Free fingerprints imported items by source URL. The paid product listing documents duplicate checks based on title and/or URL. Keep URL matching enabled as the principal control.
Use title matching when the feed environment makes it useful, such as overlapping feeds that publish the same article under different tracking URLs. Do not enable it blindly for sources that publish recurring headlines. If the plugin exposes a rule-level choice, select it per source instead of imposing one global identity policy on every feed.
Think of the choice as a tradeoff:
| Identity mode | Strength | Failure mode |
|---|---|---|
| URL only | Stable for most articles and resilient to headline edits | Misses the same story when URLs differ |
| Title only | Can catch copies exposed through different URLs | Blocks unrelated posts with repeated titles and can fail after headline edits |
| URL and title as independent duplicate signals | Broadest duplicate suppression | Higher false-positive risk on recurring content |
| Source GUID/Atom ID | Intended by feed standards to represent stable identity | Depends on publisher quality and the importer’s implementation |
The exact internal matching order is an implementation detail. Do not state that the plugin hashes, normalizes or resolves a field beyond what the current edition documents. The operational test in the next step is more valuable than a guessed explanation.
Step 6: Build a Minimal Post Template
For the first import, keep the generated title and content easy to inspect. A practical template is:
Title:
%%item_title%%
Content:
%%item_description%%
Source: %%item_url%%Echo provides variables such as %%item_title%%, %%item_description%%, %%item_content%%, %%item_url%%, %%author%% and %%feed_title%%. Use the summary variable until you confirm that full-content extraction is authorized and reliable.
Keep the original source URL in the imported post even when the public title does not link directly to it. That visible relationship helps editors verify duplicates, correct facts and handle removal requests. Do not hide the source identity inside an internal log only.
Set comments, pingbacks and trackbacks according to the site policy. Automated imports rarely need pingbacks, and enabling comments on unreviewed syndicated drafts can create moderation work before the content is approved.
Step 7: Run the Same Rule Twice
Open the rule’s Actions menu and select Run This Rule Now. When it finishes, inspect Posts > All Posts and the Echo activity log.
The first run should create only the configured number of Draft posts. Check each source URL, title, author, category, publication date, content, image and character encoding. Confirm that the source feed itself did not contain duplicates.
Without editing the rule or deleting any post, run it again immediately.
The expected result is zero newly created posts for the same feed items. The log should show that known items were skipped or otherwise not inserted. This second run is the most important acceptance test in the tutorial. If it creates the same posts again, do not schedule the rule.
Use this diagnosis sequence when the second run fails:
| Observation | Likely area to inspect |
|---|---|
| Source URLs differ only by query parameters | Feed link stability and URL normalization behavior |
| Titles differ but URLs match | URL checking may be disabled or comparison metadata was not saved |
| URLs are identical but posts duplicate | Rule settings, import history, plugin version, database writes or concurrent runs |
| Only images duplicate | Media sideloading/retry behavior rather than post identity |
| Two rules create one copy each | Duplicate scope may be rule-specific; test and consolidate overlapping rules |
| Duplication appears only during scheduled runs | Overlapping cron executions, timeouts or retry behavior |
Keep the logs from both runs. A support request with the feed URL, plugin version, rule export, two timestamps and relevant log lines is far easier to diagnose than “it sometimes duplicates posts.” Remove credentials, cookies and private feed tokens before sharing logs.
Step 8: Test a Changed Source Item
Edit an item on a feed you control, or use a test feed where the title/content can be updated without changing the source URL. Run the rule again.
You now need to choose one of two valid policies.
Skip policy: Once an item has been imported, WordPress keeps its original snapshot. Later source changes do not overwrite editorial work. This is safer when an editor improves the local post after import.
Update policy: If the source item changes and remains in the feed, the corresponding WordPress post is refreshed. The paid Echo listing explicitly advertises updating posts that are already imported and still present in the feed. This is useful for product data, status pages, event schedules and sources where the remote publisher remains authoritative.
Do not mix these policies accidentally. An automatic update can erase local edits, while a skip-only policy can leave a time-sensitive fact stale. When local editing and source updates both matter, store imported material in dedicated fields or use a clear ownership boundary: the importer controls one section, and editors control another.
Step 9: Enable a Realistic Schedule
Set the polling interval based on how often the source actually publishes. Checking a weekly feed every five minutes does not make its articles newer. It creates more HTTP requests, cron activity, cache checks and log rows.
Echo Free supports hours or minutes and allows different schedules per rule. A reasonable starting matrix is:
| Source pattern | Starting interval |
|---|---|
| Breaking operational alerts | 5–15 minutes, only with source permission and reliable server scheduling |
| Frequently updated news feed | 30–60 minutes |
| Normal publication or company blog | 2–6 hours |
| Daily or weekly partner content | 12–24 hours |
| Low-priority archive/reference feed | Manual or daily |
WordPress’s own documentation explains that WP-Cron checks due tasks when a page loads; it does not run continuously. A low-traffic site may therefore execute a “10-minute” rule much later. High-traffic sites can also create contention when expensive imports are triggered through frontend requests.
Echo can use WP-Cron or a real server scheduler through a secret URL. For business-critical timing, call the documented URL from the host’s cron service and protect the secret. Do not expose it in public documentation, analytics, page source or a monitoring screenshot. Confirm that concurrent runs of the same rule are prevented and that a failed run releases its lock.
Step 10: Move from Draft to Production
Review several scheduled Draft batches before switching to automatic publication. The sample needs to include a source update, a source error, a post without an image, a title containing special characters, an old item, and a repeated run.
Use the filters to block material the site should never import. Echo supports required and banned keywords, title/content length boundaries, dates, image requirements, author/category filters and feed-specific matching. These are quality gates, not only content-selection conveniences. Rejecting an unsuitable item before media extraction and post insertion is cheaper than deleting it later.
When the results are consistent, choose one of three production modes:
| Mode | Recommended use |
|---|---|
| Draft | Third-party sources, full-text imports, broad topics and anything requiring fact or rights review |
| Pending Review | A formal editorial workflow where assigned users approve imported items |
| Publish | Feeds you own, tightly controlled partner data or low-risk records proven through repeated testing |
Automatic publishing should be the last change, not the first. Keep a low per-run cap for the initial production period so one changed feed cannot flood the site.
Preventing Duplicates Across Multiple Feeds
Single-feed deduplication is straightforward. Cross-feed deduplication is where real projects become difficult.
A publisher might place one article in /feed/, /category/security/feed/ and /author/editor/feed/. If every item uses exactly the same source URL and Echo checks across all imported posts, URL matching can suppress the overlap. If each feed adds different tracking parameters or aggregator URLs, the records may no longer match.
The strongest fix is input design: avoid overlapping feeds. Prefer one site-wide feed plus keyword/category filters inside Echo, or use only the category feed required for the project. Fewer sources reduce network work and simplify ownership.
When overlap is unavoidable, build a cross-feed test set. Import feed A, run feed B, then compare the expected and actual post count. Repeat with an article whose title changes and another whose URL redirects. If title matching is enabled, include two legitimate items with the same title to measure false positives.
Do not solve cross-feed duplication by silently discarding every similar headline. A similarity score or title match should route uncertain cases to review when the cost of losing a valid post is high.
Tracking Parameters and URL Normalization
Tracking parameters are a common reason one article looks new to an importer:
?utm_source=rss
?utm_medium=feed
?utm_campaign=weekly
?ref=partner
?output=1Some parameters change only attribution; others change language, format, access or actual content. Removing every query string is unsafe. ?lang=de may identify a translated page, while ?output=amp may represent an alternate rendering. Normalize only parameters you understand and only through a supported rule, upstream proxy or feed transformation.
If you control the source, fix the feed there. Publish one clean permanent link and keep campaign tracking on the click/analytics layer rather than changing item identity on every feed request. Stable publisher data is more reliable than increasingly complex importer heuristics.
Avoiding Duplicate Media Attachments
Post deduplication can work while the Media Library still accumulates repeated images. A timeout may occur after the image is downloaded but before the import run records success. The retry then finds no completed post identity and downloads the file again.
During testing, compare attachment counts before and after the first and second runs. Search the Media Library for repeated filenames and check whether resized variants or optimizer conversions make one source image appear to be several files.
Choose whether to copy images locally. Local files avoid broken hotlinks and can pass through WordPress image optimization, but they consume storage and require image-reuse permission. Remote images reduce storage but depend on the source server, may be blocked, can disappear and can disclose visitor requests to a third party.
When imported posts are automatically deleted after a retention period, decide separately what happens to their attachments. Deleting a post does not always mean an attachment should be removed, because another post may reuse it. Test the plugin’s cleanup behavior and keep backups before bulk deletion.
Full-Content Extraction Without Duplicate Chaos
Echo Free can fetch the source article when the feed provides only a summary. Its bundled Readability workflow can attempt automatic extraction, while the Crawling Helper can identify a class, ID, XPath or regular expression for a specific site.
Full-content extraction adds three failure surfaces. The feed request can succeed while the article request fails. The article can return a bot challenge or JavaScript shell instead of content. The text can be extracted while its images fail. A retry must not create a second post simply because enrichment did not finish cleanly.
Start with Draft status and a low per-run maximum. Inspect navigation, newsletter forms, cookie notices, related-story cards, advertisements, scripts and invisible accessibility text. Target the smallest stable article container and strip elements that do not belong in the imported copy.
Use HeadlessBrowserAPI in the paid edition only when a permitted source genuinely requires JavaScript rendering. It is a separate hosted service and may require its own account or API credentials. A browser-based extraction path costs more time and resources than reading the feed or server-rendered HTML, so it should be a source-specific exception.
Canonical URLs, Noindex and Responsible Syndication
The paid Echo listing includes an option to add a rel="canonical" tag pointing to the source post. This can be useful for duplicate or very similar pages, but the correct indexation decision depends on the syndication agreement.
Google describes rel="canonical" as a strong signal, not an absolute directive. Its current canonicalization troubleshooting guidance goes further for syndicated content: when a publisher wants partner copies not to compete in search, Google says blocking indexing on the partner copy is more effective than relying on a cross-domain canonical because syndicated pages are often different overall.
Use this decision table:
| Imported page type | Practical indexation approach |
|---|---|
| Short excerpt that sends users to the source | Usually index only if the page adds real navigation or editorial value; otherwise consider a live feed display or noindex |
| Licensed full copy with no meaningful local addition | Follow the publisher agreement; noindex is the clearest way to prevent the copy competing in Google |
| Licensed copy with substantial original analysis | A self-canonical may be reasonable if it is genuinely a distinct page, subject to the agreement |
| Internal monitoring/archive item | Private, Draft or noindex rather than publicly indexable |
| Content imported from your own site during migration | Prefer redirects or a migration plan instead of maintaining two public copies |
Do not output two conflicting canonical tags. WordPress or an SEO plugin normally adds a self-referencing canonical to a published post. If Echo adds a source canonical as well, confirm that the integration replaces the local canonical rather than leaving both in <head>. Inspect the public HTML source and use Search Console’s URL Inspection report after publication.
Most importantly, canonical and noindex tags do not grant content or image rights. Permission comes first; indexation is a separate technical decision.
Why “Spin the Text” Is Not a Duplicate Strategy
Changing synonyms does not make two database records become one. It also does not transform an unauthorized copy into original reporting.
Echo contains translation, synonym and random-sentence tools because some licensed automation workflows need transformations. Use them for legitimate localization or controlled templates, not to disguise copied material. Google’s scaled-content policy explicitly names scraped feeds transformed through synonymizing, translating or other obfuscation when large numbers of low-value pages are created for rankings.
A valuable import adds something a reader cannot get from the source feed alone: curation, comparison, verified metadata, local context, structured categorization, commentary, alerts, a searchable internal archive or a workflow action. If the only purpose is to publish more URLs, perfect duplicate detection merely helps the site create low-value pages more efficiently.
Monitoring a Production Feed Rule
An RSS importer is a scheduled integration, not a one-time editor action. Monitor outcomes, not only whether cron fired.
| Metric | Why it matters |
|---|---|
| Items fetched | Reveals feed-size changes and empty responses |
| New posts created | Confirms useful output volume |
| Known items skipped | Shows duplicate prevention is active |
| Existing posts updated | Separates refreshes from new insertions |
| Items rejected by filters | Detects an overly broad or overly strict rule |
| Full-content failures | Identifies source layout or access changes |
| Image failures | Reveals rights, hotlink, decoding and storage problems |
| Rule duration | Warns about timeouts and growing workloads |
| Last successful run | Detects silent scheduler failures |
Echo provides activity logging and optional email summaries. During rollout, inspect every run. After the rule is stable, review daily or alert on failure, zero-item anomalies and unusual spikes. Clear old detailed logs on a retention schedule so diagnostics do not become a database-growth problem.
Use an external uptime or cron monitor for important feeds. A WordPress dashboard message cannot help when nobody logs in for a week.
Safe Audit Query for Existing Duplicate Titles
If a site already contains suspicious imports, the following read-only SQL query finds repeated titles. Replace wp_posts if the site uses another table prefix:
SELECT
post_title,
COUNT(*) AS copies,
GROUP_CONCAT(ID ORDER BY ID) AS post_ids
FROM wp_posts
WHERE post_type = 'post'
AND post_status NOT IN ('trash', 'auto-draft', 'inherit')
GROUP BY post_title
HAVING COUNT(*) > 1
ORDER BY copies DESC, post_title ASC;Run it through a read-only database client or wp db query after taking a backup. The result is a candidate list, not a deletion list. Repeated titles can be legitimate. Compare each post’s source URL, publication date, content, import rule and attachments before changing anything.
Do not bulk-delete duplicates based on the highest or lowest ID without understanding the importer’s history. The retained post might be the one with comments, edits, canonical signals, backlinks or the correct featured image.
Moving from Echo Free to the Paid Edition
Echo Free’s current FAQ says both editions use the same echo_Main_Settings and echo_rules_list options, so the configuration is shared. It also says to run only one edition at a time.
Use a controlled upgrade:
| Stage | Action |
|---|---|
| Backup | Save the database, uploads and an exported Echo rule list |
| Pause | Disable scheduled runs and confirm that no rule is currently executing |
| Deactivate | Deactivate Echo Free without deleting its stored settings |
| Install | Install and activate the paid edition |
| Inspect | Confirm rule URLs, schedules, duplicate settings, templates and post statuses |
| Test | Run one rule with a one-post limit, then run it again |
| Resume | Re-enable schedules only after the second-run duplicate test passes |
Do not keep both editions active to compare them. Shared settings and duplicate rule execution can make the result difficult to reason about.
Troubleshooting
| Problem | Most likely checks |
|---|---|
| The same item is imported on every run | Confirm URL duplicate checking, inspect whether source URLs change, preserve import metadata and check for concurrent rule execution |
| The same story arrives through two feeds | Remove overlapping sources, compare URLs, test title checking and route uncertain matches to Draft |
| Valid new posts are skipped | Disable title checking temporarily and look for recurring headlines or reused source URLs |
| No new posts are imported | Check feed response, rule Active state, date/keyword/image filters, maximum count, log and source URL history |
| Manual run works but the schedule does not | Inspect WP-Cron, low traffic, server cron, secret URL, time zone and stuck rule locks |
| Imported posts have only summaries | Enable authorized full-content extraction and inspect the Readability/Crawling Helper settings |
| Full content contains navigation or popups | Narrow the selector and strip unwanted classes/IDs before publishing |
| Images are duplicated | Test media behavior separately, inspect retries and confirm whether local copying is required |
| Updated source content never changes locally | Decide whether the rule is skip-only and configure documented update behavior in the paid edition if appropriate |
| Canonical tags conflict | Inspect page source, SEO plugin output and Echo’s source-canonical setting |
| Imports stop during large runs | Lower the per-run maximum, increase schedule spacing, inspect memory/timeouts and avoid unlimited full-content jobs |
Production Acceptance Test
| Test | Pass condition |
|---|---|
| First manual run | Only the configured Draft posts are created |
| Immediate second run | Zero duplicate posts are created |
| Changed title, same URL | Existing identity remains recognized according to the selected skip/update policy |
| Same title, different URL | Result matches the deliberate title-check policy |
| Overlapping feed | The same story does not create an unexpected second post |
| Tracking-parameter variation | Behavior is known and documented for that source |
| Source error | Retry does not create a second post or repeated attachment |
| Concurrent trigger | One rule run does not overlap itself |
| Scheduled run | Executes within the acceptable delay and produces logs |
| Full-content extraction | Captures only authorized article content without page furniture |
| Media handling | Files are permitted, correctly attributed and not repeatedly downloaded |
| Public SEO output | Exactly one intended canonical and the chosen indexation directive appear |
| Cleanup | Trashing/deleting an imported post has a tested, documented re-import result |
Do not enable automatic publication until every relevant row has a known result.
Frequently Asked Questions
What is the easiest way to import an RSS feed into WordPress without duplicates?
Install Echo RSS Feed Post Generator Free, create one Draft rule for one feed, keep its source-URL fingerprinting active, limit the first run to a few posts, and run the identical rule twice. The second run should create nothing new for items already imported.
How does Echo prevent duplicate RSS posts?
The current Echo Free page says each imported item is fingerprinted by source URL. The paid Echo listing documents duplicate post checking based on title and/or URL. Exact normalization and comparison internals are not fully described on the public pages, so test the real feed before scheduling it.
Is URL or title duplicate checking better?
URL is the stronger default because headlines can change or repeat across legitimate articles. Title checking can catch the same story delivered under different URLs, but it can also reject valid recurring posts. Use URL first and title only where the source pattern justifies it.
Will an RSS GUID always prevent duplicates?
No. RSS <guid> is optional, and the feed publisher is responsible for keeping it stable and unique. Atom requires a permanent atom:id, but publishers and importers can still have implementation problems. A real importer needs a documented fallback such as source URL.
Can Echo Free import full articles?
Yes. Echo Free includes automatic full-content extraction with a Readability engine and manual targeting by class, ID, XPath or regular expression. Use it only for content you are permitted to reproduce, and keep the first runs in Draft status.
Does Echo Free limit rules or posts per run?
The current WPBay listing says it has no rule limit and no per-run post limit. Setting the rule’s maximum number of posts to 0 imports everything new that it finds. Use a small number during setup; unlimited is not a sensible first test.
When should I upgrade to Echo RSS Feed Post Generator paid?
Upgrade when you need feed discovery, JavaScript-rendered content through HeadlessBrowserAPI, live RSS display, Gutenberg-block conversion, nested tag mapping, or the paid edition’s documented update and advanced duplicate options. Normal feed-to-post importing is already covered by Free.
Can I run Echo Free and paid together?
Do not run both at the same time. Echo Free’s FAQ says the editions share the same main settings and rules-list options. Deactivate one before activating the other, then run a controlled duplicate test.
Does rel="canonical" make full-content importing safe?
No. It is a search signal, not copyright permission. Google may choose a different canonical, and Google currently recommends blocking indexing on a syndicated partner copy when the goal is to keep that copy from competing with the original. Obtain permission and define indexation separately.
Should imported posts be automatically published?
Only for a source you own or a tightly controlled partner feed after repeated tests. Draft or Pending Review is safer for third-party content, full-text extraction, broad keyword rules and sources whose markup can change.
Why does my scheduled import run late?
WP-Cron is triggered by page loads rather than running continuously. A quiet site may execute due tasks late. Use a server scheduler with Echo’s documented secret URL when timing matters, then monitor the last successful run.
Can translation or synonym replacement prevent duplicate content?
It may make text different, but it does not solve duplicate database records, grant reuse rights or guarantee search value. Google identifies scaled feed scraping with low-value automated transformation as a spam-policy risk.
What should I do if the site already contains duplicate imported posts?
Back up the site, identify candidate duplicates by title, then compare source URL, date, content, rule metadata, comments and attachments. Keep the correct record and redirect or remove the others through a deliberate cleanup plan. Never delete solely from a title query.
Final Recommendation
Reliable RSS importing is an identity problem before it is a scheduling problem. Start with one clean feed, one rule and one stable source URL per item. Import a small batch as Draft, run the same rule twice, test a changed item, test an overlapping source, and only then turn on automation.
For most sites, Echo RSS Feed Post Generator Free is enough to prove the workflow. It already provides unlimited rules, URL fingerprinting, manual and scheduled runs, filters, templates, full-content extraction, media handling and detailed logs without a purchase-code step.
Choose the paid Echo RSS Feed Post Generator when the project needs to find feeds automatically, render JavaScript-heavy source pages, display live feeds, create Gutenberg blocks, map nested tags or manage more advanced update and duplicate behavior.
Neither edition removes the publisher’s responsibilities. Import content you have the right to use, keep source attribution visible, choose canonical or noindex behavior intentionally, monitor every production rule, and add enough editorial value that the resulting site deserves the URLs it publishes.
