WordPress Plugin Reviews Scraper & Support Monitor
Pricing
from $8.00 / 1,000 review or support topics
WordPress Plugin Reviews Scraper & Support Monitor
Scrape WordPress.org plugin reviews and support forum topics. Export ratings, review text, replies, and resolution status. Monitor new reviews, unanswered questions, and topic changes across multiple plugins. No WordPress login or API key required.
Pricing
from $8.00 / 1,000 review or support topics
Rating
0.0
(0)
Developer
coolinbex
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Scrape WordPress.org plugin reviews and support forum topics into structured JSON, CSV, or Excel. Collect star ratings, review text, support questions, replies, and resolution status. Schedule the Actor to monitor new reviews and changes to previously observed topics.
Built for plugin developers, WordPress agencies, product researchers, and support teams. No WordPress account, API key, AI service, or paid enrichment API is required.
What you can do
- Export reviews and support topics for up to 20 WordPress plugins in one run.
- Find 1-star and 2-star reviews, unresolved support threads, and topics with no replies.
- Filter by keywords, excluded phrases, and the last-activity date.
- Include reply text and publicly displayed Plugin Author/Plugin Support badges.
- Monitor newly observed topics, edited reviews, reply changes, and resolution changes.
- Export source links, absolute UTC timestamps, and predictable fields for automation.
Quick start
Enter plugin slugs such as woocommerce or contact-form-7. Official plugin and support URLs also work. Select reviews, support topics, or both, then run the Actor.
{"plugins": ["woocommerce", "contact-form-7"],"sources": "both","maxTopicsPerSource": 25,"maxTopicsTotal": 100}
Results appear in the default dataset. The Run summary and coverage output explains how much was scanned, which limits were reached, and whether monitoring state was saved.
Monitor new reviews and support changes
Use a stable monitor name and schedule the same saved task:
{"plugins": ["woocommerce"],"sources": "both","mode": "monitor","monitorKey": "woocommerce-feedback","firstRun": "emit","maxTopicsPerSource": 50,"maxTopicsTotal": 100}
The first successful run establishes a baseline. With firstRun: "emit", it also exports the existing matching topics. Set firstRun: "silent" to establish the baseline without exporting existing items.
Later successful runs emit only newly observed or changed topics that match your filters. An unchanged run can legitimately return zero rows. Scrape mode always returns matching current snapshots and does not update monitor state.
changeType | Meaning |
|---|---|
snapshot | Matching data from a scrape-mode run |
baseline | Matching data from the first successful monitor run |
new | First observed by this monitor; not necessarily newly published |
updated | Previously observed topic with a changed tracked field |
Monitoring state persists in this Actor's own named Apify storage, within the account running it. Each monitor name has a separate lock. Coverage and filter settings are fingerprinted: changing those settings creates a separate baseline rather than silently mixing incompatible comparisons. Network tuning and the first-run display preference do not change that scope.
State tracks scanned topics even if they do not currently match your filters. For example, a 5-star review edited to 1 star can later enter your negative-review results as an update. Changes that no longer match the filters are not emitted.
Input reference
| Input | Default | Behavior |
|---|---|---|
plugins | Required | 1–20 slugs or official WordPress.org plugin URLs |
sources | both | both, reviews, or support |
mode | scrape | scrape or monitor |
monitorKey | default | Stable monitor name; letters, numbers, _ and - |
firstRun | emit | emit or silent baseline |
maxTopicsPerSource | 50 | Topics examined per plugin and source, before filters |
maxTopicsTotal | 500 | Total topics examined across the run, before filters |
maxListingPages | 5 | Listing pages scanned per plugin/source |
includeReplies | true | Include public reply bodies |
maxRepliesPerTopic | 50 | Reply bodies retained per topic, in source order |
maxReplyPages | 3 | Maximum reply pages, including the first topic page |
includePinnedTopics | false | Include sticky announcements |
reviewStars | [] | Selected ratings as strings, e.g. ["1", "2"]; empty means all |
supportStatus | all | all, unresolved, resolved, or no_replies |
keywords | [] | Match any literal phrase in the original title/body |
excludeKeywords | [] | Exclude any matching literal phrase in the original title/body |
since | Empty | Filter by last activity; YYYY-MM-DD or ISO timestamp with timezone |
requestDelayMillis | 750 | Global minimum spacing between request starts; minimum 500 ms |
requestTimeoutSecs | 30 | Timeout for each HTTP attempt |
maxRetries | 3 | Retry count for temporary failures |
maxRequests | 5000 | Hard HTTP request budget, including retries and redirects |
proxyConfiguration | Direct requests | Optional Apify/custom proxy settings |
Keyword matching is case-insensitive and uses the original review or question. Replies are excluded from keyword filtering. Review-specific filters do not remove support topics, and support-specific filters do not remove reviews.
Example: negative plugin reviews
{"plugins": ["woocommerce"],"sources": "reviews","reviewStars": ["1", "2"],"maxTopicsPerSource": 100}
Example: support questions with no replies
{"plugins": ["contact-form-7"],"sources": "support","supportStatus": "no_replies","maxTopicsPerSource": 100}
Output fields
Each dataset row represents a review or support topic. Replies are nested inside that row, not emitted as extra topic records.
| Fields | Content |
|---|---|
id, topicId, recordType | Stable topic identity; type is review or support |
pluginSlug, pluginName, url | Plugin identity and WordPress topic source |
title, body, author, authorUrl | Original public post and author |
rating | 1–5 for reviews; null for support topics |
createdAt, lastActivityAt, observedAt | Absolute timestamps in UTC |
supportStatus | resolved, unresolved, unknown, or not_applicable |
isClosed, isPinned | Separate closed-thread and pinned-post signals |
replyCount, participantCount | Counts reported by the topic detail page |
isNegativeReview | A review rated 1 or 2 stars |
isUnansweredSupport | A support topic with zero reported replies |
hasPluginReply | true when a collected reply has a plugin badge; false only when complete reply coverage finds none; otherwise null |
replies | Reply ID, author, public badge, timestamp, body, and truncation flag |
repliesTruncated, replyPagesFetched | Reply coverage information |
contentTruncated | Original post exceeded the 50,000-character output cap |
matchedKeywords | Included phrases found in the original title/body |
changeType, changedFields | Monitoring change category and changed field names |
contentFingerprint, eventId | Content-version fingerprint and event identity |
Public badges are evidence of a plugin role on that specific post. An unbadged user can still be associated with a plugin, so this is not identity verification. Individual reply bodies are capped at 20,000 characters and have their own contentTruncated flag. HTML is converted to text; scripts and login-only site-link placeholders are removed.
Coverage and failure behavior
This is a bounded monitor of the configured listing window. Increase listing/topic limits to cover more history. The Actor follows WordPress's listing order; it does not promise a full historical archive or detection of every old-topic edit. A topic outside the scanned window is not rechecked independently.
Limits apply before filters. Checking 100 topics with a 1-star filter may produce fewer than 100 results. Earlier plugins are processed first, with reviews before support in both mode. The run summary explicitly reports skipped or capped sources. Pinned topics are excluded by default.
Missing topics are never interpreted as deleted, and missing resolution markers remain unknown. A closed thread is not automatically resolved. A thread with a reply is not necessarily solved.
Network failures, blocking pages, missing topics, and source markup changes are reported as errors rather than converted into empty successful results. When a source fails, valid partial rows remain available, the run fails visibly, and the previous monitor baseline is preserved.
Overlapping cloud runs using the same monitor name are rejected while the existing run holds its server-side lock. Locks are renewed while working and released when finished. After a forced termination, allow up to 10 minutes for the cloud lock to expire.
Interrupted, failed, or spending-limited runs can leave partial results. Retrying can repeat those rows; downstream consumers should deduplicate using id and contentFingerprint. This Actor does not claim exactly-once delivery. It retains up to 25,000 topic fingerprints per configuration; choose a fresh monitor name when intentionally starting a new tracking history.
Pricing and integrations
When the owner enables pay-per-event pricing, one topic event is charged for each emitted dataset row. Nested replies do not create additional topic events. Filtered-out and unchanged topics do not produce this event; platform/run charges can still apply according to the active pricing configuration. Check the Pricing tab before running.
Apify's dataset exports support JSON, CSV, and Excel. Use JSON when you need nested replies. Schedule a saved task or connect run results to your own workflow through Apify's API or integrations. The Actor itself does not send emails, Slack messages, or WordPress replies.
FAQ
Does it scrape reviews on individual WooCommerce stores? No. It collects plugin feedback from the public WordPress.org directory and support forums.
Does it support premium-only plugins, themes, or private tickets? No. A plugin must have an accessible WordPress.org support/review area. Themes and private support systems are outside this Actor's scope.
Do I need a proxy? It is optional. Direct access is the default. WordPress may rate-limit or block particular runtime IPs; configure a proxy if needed. No fixed-IP or permanent-access guarantee is made.
Why did my monitor export zero rows? It may be a silent baseline, nothing may have changed, or no scanned topics may match. Inspect SUMMARY to distinguish these cases from errors.
Can it identify recurring complaints using AI? It provides searchable text and keyword filters. It does not invent sentiment, diagnoses, or AI summaries.
This is an independent community Actor and is not affiliated with or endorsed by WordPress.org.
Development
The project uses Node.js 24, TypeScript, the Apify SDK, Cheerio, and Zod. See DEPLOY.md for exact local-run, deployment, pricing, and release steps. See VALIDATION.md for the checks actually performed and the remaining cloud validation.