WordPress plugin for Voxel directory sites
Turn a Google Maps search into finished directory listings.
Places Importer finds businesses anywhere Google Maps lists them, pulls in their hours, photos, contacts and social links, writes a description with the AI provider you choose, and files everything into your own Voxel listing types. Businesses already in your directory are caught before they are imported again, and listings their owners have claimed stay protected.
Licenses for 1 site, 5 sites or unlimited. Every current feature keeps working if you don't renew.
The problem
A directory is only as good as its listings, and listings take hours to build by hand
The theme looks finished on day one. Filling it with real businesses is the part that takes months.
Hand-building every listing
Copying a name, address, phone, seven days of opening hours, photos, social links and a written description from Google Maps into WordPress, one business at a time.
Blank fields
Rushed listings go live with no hours, no email, no social links and a one-line description. Visitors notice, and so do search engines.
Stale data
Businesses change their hours, phone numbers and websites. A directory that is right today drifts out of date unless someone keeps checking.
Duplicates
The same restaurant added twice, once by hand and once by an import, splits its reviews and confuses visitors. Preventing it is far quicker than cleaning it up later.
How it works
Three steps from a search to a finished listing
You work in the WordPress admin the whole time. New listings are saved as drafts by default, so nothing goes live until you publish it.
Find the businesses
Import one business by name with Single Import, or use Batch Import to pull in a whole area at once: every business matching a category or keyword within the radius you set, anywhere in the world. You can also pick a hotel, mall or plaza and find every business at that address.
Choose what to import
Batch Import shows up to 60 results per search in a preview table (up to 20 when you search without a category or keyword) and locks the ones already in your directory, so you only spend credits on new businesses. For bigger runs, Skip Preview sends up to 500 results per search straight to the queue.
The queue builds the listings
Queue as many businesses as you like. The queue works through them in the background until every one is done, mapping each record to your fields, writing the description, matching your categories and checking social links. Anything uncertain waits on the Enrichment Review screen instead of going onto a listing.
Time saved, estimated
Work out what it saves on your own directory
Change the two numbers to match your directory. The assumptions behind the result are listed beside it.
Assumptions behind the numbers
- By hand: a complete listing with name, address, phone, hours, several photos, social links and a written description.
- With the importer: queue as many listings as you like. The queue works through them automatically in the background, about 3 a minute on the default settings, until every one is finished. You can close the browser while it runs.
- What changes the pace: each listing waits on Outscraper and on your AI provider, so many photos or deeper AI research settings take longer per listing.
- Keeping the queue on schedule: WordPress runs scheduled tasks when the site has visitors. On a quiet site, a server cron job (a standard hosting setting) keeps the queue running on time.
- Your time with the importer: setting up the search, choosing results and checking the review screen. That is not included in the processing figure.
What you get
Complete listings, and the checks that keep them right
Each of these is covered in detail on the Features tab.
Address and map location, phone numbers, website, opening hours, photos, emails and named contacts, social profiles, and menu, booking and ordering links, each written to the field you choose.
If it is on the business's Google Maps listing or its own website, the importer can bring it in. What a business has never published anywhere cannot be imported, so a listing is only as complete as the business's own public information.
Choose OpenAI, Claude, Gemini or Perplexity. Built-in style rules tell the AI to state facts, never invent details and avoid the usual travel-brochure phrases. If an AI call fails, the listing keeps Google's own description instead of an empty field.
When a provider announces that a model will be retired, the plugin warns you in advance and switches to the named replacement 7 days before the retirement date.
Every Voxel site is set up differently. The importer maps Google and Outscraper data onto the post types, fields and taxonomies you have built, and for each taxonomy field you decide whether new terms may be added. Attributes such as amenities, payment options and dining options can be sorted across your existing taxonomies, with anything uncertain held for your approval.
Businesses already in your directory are recognised by their Google place id before import, and likely matches by name are flagged for you to check. Merge Duplicates combines pairs that are already in your directory.
Listings their owners have claimed are skipped by bulk updates unless you switch that on. When you do, every change is reversed on the spot and sent to Enrichment Review for your approval.
Data Enrichment refreshes the fields you pick on the listings you pick, in bulk or one listing at a time, with an option to fill only the fields that are still blank. A business that has changed its name gets the new name as its listing title, and the listing keeps its web address.
Who it is for
Built for people who run directories on Voxel
Directory owners
Launch with hundreds of complete listings instead of a handful, and refresh them in bulk whenever you choose.
Agencies
Deliver a client's directory already populated. Field mappings are set once per listing type and reused on every import.
City and travel guides
Cover a city, a region or a whole country: restaurants, hotels, tours and shops, each filed into its own listing type.
Chambers and associations
Seed a member or business directory from public listings, then let members claim and manage their own.
Directory location, search language and region, distance in kilometres or miles, local currency and WhatsApp country codes are all settings, so it works for a directory anywhere in the world.
Proof
Independently audited, and tested on a live directory
A plugin that writes to hundreds of listings has to be trustworthy. This is how it is checked.
Independently audited
Before release, six independent auditors and a separate grader reviewed every file of the plugin. They confirmed 24 problems, none of them serious enough to endanger security or data, and all 24 were fixed. The independent code auditor scored each of the last three builds before release 99 out of 100. The original plugin this was forked from scores 69 under the same rules.
Tested on a real database
Releases are installed on a copy of a live directory and run through checks covering imports, updates, owner-listing protection, merges and settings. The builds leading to 3.2.0 passed all 79 runtime checks on PHP 8.2, and on PHP 8.4 passed 78 with one skipped by design. The unused photo tool was run on 50,000 photos within a 256 MB memory limit on MySQL 5.7, MariaDB 10.6 and MySQL 8.0.
Used every day
It runs a live production directory, importing real businesses, and its installed files are checked byte for byte against the release package.
Bad data is worse than no data.
When the importer is not confident about a social link, an attribute match, a neighbourhood or a parent listing, it does not guess. The item goes to the Enrichment Review screen with the reason shown, and the listing stays as it is until you approve it. A logo, price tier, neighbourhood or parent listing you have set is kept.
Start filling your directory
From $79 a year for one site at the founding price, with 5-site and unlimited yearly licenses, and 1-site and 5-site lifetime licenses for the first 100 buyers.
Features
Every feature, grouped by the job it does
Import
Bring in one business or hundreds. Enter a business name, or a category and a location, and the importer does the rest.
Single Import
Type a business name, pick it from Google's suggestions, choose the listing type, owner and categories, and import it. Only a confirmed Google result can be imported, so a typo cannot create a junk listing.
Batch Import by area
Enter a category or keyword, a location and a radius in kilometres or miles. Every matching business in that circle appears in a preview table, up to 60 per search (up to 20 without a category or keyword), ready to select and queue. Businesses Google lists without a street address carry a "No address" badge. When you pick a suggested location, its map point is sent with the search, so the server does not look the location up a second time.
Batch Import by building
Pick a hotel, mall or plaza and find every other business registered at the same address. Ideal for a resort with several restaurants or a shopping center with many tenants.
Skip Preview for volume
Send a search straight to Outscraper for 50 to 500 results at a time. Results are queued automatically, and businesses already in your directory are marked as duplicates instead of being imported again. A business whose name closely matches an existing listing is still imported, with a "Check first" note naming the likely match, so you can compare the two.
Businesses with no street address
Service-area businesses, performers and online shops often have no street address on Google. For each listing type you choose what happens to them: import them as usual, skip them, or import them as drafts for review. Updates to existing listings are never skipped.
Categories and owner for the whole batch
Assign taxonomy terms and a listing owner to every business in a batch before it is queued, using a searchable checklist.
Background queue
Imports run in the background, so you can close the page. The Queue screen shows live counts and each item's status in plain language. At most two imports run at the same time, so a slow AI provider cannot pile up work on a shared host. An interrupted import picks itself up again and fails only after a third interruption. A failed item goes back in line with one click, with a fresh set of attempts.
Visitor submissions (optional)
An Elementor widget lets visitors search for a business and submit it through the same import process. It is off by default, needs a login by default, and saves new submissions as Pending Review by default. When it is on, limits cap how many submissions are accepted each day and how many can wait at once: 20 of each by default, and you can change both. If a submission cannot be processed, visitors see a plain error message, and the technical detail is shown only to administrators.
Setup
Connect your keys, point the data at your fields, and run a test import.
Welcome checklist
A first-run checklist walks through choosing listing types, adding API keys, applying starter field mappings and running a test import. Each step ticks itself off when the setting is actually in place.
Field Mappings with a Setup Wizard
Map more than 100 Google and Outscraper fields to your own fields, separately for each listing type. The Setup Wizard suggests a match for each unmapped field, and you confirm every suggestion before it is saved.
Email and social enrichment on from the start
Outscraper's email and social enrichments are switched on by default and stay on when you first save Settings. Beside each email and social field on Field Mappings, a note says whether the enrichment that fills it is on, and that it uses extra Outscraper credit for each listing. Switch it off and those fields stay empty.
Photo sets with their own limits
Import general photos, menu photos, the owner's own uploads or the latest photos, each with a limit you choose. The first photo becomes the featured image when the listing has none. A featured image you picked yourself is kept when photos are refreshed, and a photo already in the holding area is brought back instead of being downloaded again as a duplicate.
AI Prompts for any field
Write a prompt for each field on each listing type, such as a description, FAQs, highlights or a tagline. Generate Prompts with AI drafts a starting set for you, based on your directory.
Business search box on any site
The Single Import search box needs Google's map script. When no other plugin or theme has loaded it, the importer loads it itself, and it never loads it a second time on the same page.
Settings for your directory
Directory location, search language and region, default search radius, distance unit, country restrictions, default post status and default listing owner.
Reset to recommended defaults
One click returns general settings to their recommended values. API keys, field mappings, AI prompts and your listings are left exactly as they are.
AI writing and data enrichment
Turn a raw Google profile into a listing that reads well and is filed correctly.
Four AI providers, one setting
OpenAI, Anthropic Claude, Google Gemini or Perplexity. Switch provider or model at any time, and your prompts stay as they are. A custom OpenAI model name you type in is used for descriptions too.
OpenAIClaudeGeminiPerplexityAI models kept current
Once a week the plugin refreshes the model list of each provider you have a key for. When a model you use is due to be retired, the model picker, AI Health & Cost and an admin notice warn you: yellow from 60 days before, red from 30 days. Seven days before the date the plugin switches to the named replacement and tells you once. If a provider reports a model as not found and a replacement is named, it switches straight away and retries the call. Retirement dates come from a list published on brightadvice.com, with a copy built into the plugin in case that list cannot be reached. The weekly check names only the plugin and its version, and sends nothing about your site. Warnings also work for Claude's short model names, which follow the retirement date of the dated version they point to.
Three description modes
Keep Google's own description, use AI only when Google has none, or always write a fresh one with AI.
Descriptions with a house style
Descriptions lead with what the business actually offers and name specifics instead of adjectives. The AI is told never to invent a detail, and a built-in list of banned phrases keeps out the usual travel-brochure wording.
Web research with Perplexity
With Perplexity selected, the AI researches the business on the web before writing, and the pages it used are saved in the AI log. Perplexity's five research depths are offered, from Fast to Extra High, and each runs on the model Perplexity publishes for it: Extra High runs on Claude Opus 5.5.
AI Health & Cost
See at a glance whether each AI provider is working, run a one-click connection test, and compare the estimated cost of a bulk import at each tier (Lowest Cost, Quality + Value and Highest Capability) before you start. Perplexity estimates use its published model rates plus its fee for each web search, and are shown as a starting figure, because deeper research runs more searches. If Perplexity answers description requests without searching the web, the panel warns you, since those descriptions rely only on the imported data.
Attributes sorted into your taxonomies
Google lists dozens of attributes for a business, such as Wi-Fi, card payments, wheelchair access or emergency service. With the recommended split setting, the importer sorts them into the taxonomies your own listing types use: dining and amenity terms for a restaurant, for example, or service and payment terms for a plumber, electrician or mechanic. It uses terms you already have. Only confident matches are applied, the rest wait for your review, and each decision you make is remembered for next time.
AI Term Matching
Match Google's category names to the closest term you already have, so "Barber shop" lands on your "Barber" term instead of being skipped or duplicated. Uncertain matches wait for review. Works with all four AI providers.
Build Synonyms
Teach the importer the other words Google uses for your terms, such as "pool" for "Swimming Pool". You review every proposal before it is added, and your site's own search benefits too.
Hours-aware tags
Time-based attributes are checked against the listing's own opening hours, so a business that closes at 8pm is not tagged for late-night food.
Verified social links
Each Facebook, Instagram and other profile link is checked against the business's name and details before it is saved. Links that fail the check, including pages for another branch of the same chain, wait on the review screen.
Emails, phones and WhatsApp
Up to three email addresses with the contact's name, job title and phone when Outscraper finds them, plus extra phone numbers, fax and WhatsApp. Numbers from countries you list are saved directly; others wait for a quick check.
Logos
Google's small profile image is upgraded to a full-size logo on new imports. A listing that already has a logo keeps it.
Price level
Google's price range for a business, whether it is shown as "$$" or as an amount like "€20–30" per person, becomes one consistent price level in your listing, from budget to luxury. Amounts in dollars, euros, pounds or a local currency you choose are all compared on the same scale, and an optional weekly exchange-rate update keeps the comparison current.
Parent listings and neighbourhoods
A shop inside a mall or hotel is linked to that parent listing when you have one. If your listing types use a community taxonomy, a new listing is placed in the neighbourhood its nearest existing listings share, and only when it has none yet.
Content in your site's language
AI output comes back in the language chosen in Settings, whatever language the prompt is written in.
Language and currency checks
Day names for 29 content languages are built in, but hours, closed days and prices have been checked on a live directory in English only. Choose any other language and a note beside the setting says so. A note also appears when a country you select uses a currency the price reader does not recognise. The plugin counts, per language, the opening-hours lines and prices it could not read.
Language feedback, sent only when you choose
After real use in a language, or early when many hours lines or prices could not be read, the plugin asks once how that language is working. If you report a problem, you see exactly what the report contains before anything leaves your site, and it goes to BrightAdvice support only when you click Send. Examples of unreadable lines and your site address are included only if you tick them. Clicking Send twice, or from two screens at once, still sends one report.
Data quality
Keep one listing per business, and keep your advertisers' listings safe.
Duplicate detection before import
A business that shares a Google place id with an existing listing is blocked. A close name match against a listing without a place id is flagged with the likely matches for you to judge, because a chain can have several genuine branches.
One-click link for hand-made listings
When the likely match is a listing you created by hand, one click adds the Google place id to it, so the same question never comes up again.
Merge Duplicates
Keeps the older listing, copies across only what it is missing, confirms every copied value was saved, then moves the newer listing to Trash, where it can be restored. Pairs that may be two branches are flagged, with "Not a duplicate" offered first, and claimed listings are never merged. Names written with an ampersand, such as "Tom & Jerry", match however the ampersand was stored, and marking some pairs as not duplicates never hides a real duplicate between two other listings.
Claimed-listing protection
Listings their owners have claimed are skipped by Data Enrichment unless you switch that on. When you do, every change, including a change to the listing title, is reversed straight away and sent to Enrichment Review for your approval.
Opening hours never guessed
When a day's hours cannot be read, that day is left blank for you to fill in. It is never marked as Closed.
Your values stay
A logo, price tier, neighbourhood or parent-listing link that a listing already has is kept, so your hand corrections stick.
Enrichment Review
Unmatched attributes, unverified social links, WhatsApp numbers to check, neighbourhood and parent-listing suggestions and logo suggestions for published listings all wait here. Apply a suggestion with one click and the importer remembers it, or dismiss it.
Keeping listings current
Refresh what has changed without rebuilding anything.
Data Enrichment in bulk
Filter by listing type and status, search by name, id or place id, choose which fields to refresh and which listings to include, and queue the update. Choosing Business Name updates the listing title itself, never an empty title, and leaves the listing's web address unchanged.
Update one listing
An Update Data box on each listing's edit screen queues a refresh for that listing alone, and warns before an update that would replace hand edits.
Only fill blanks
An "Only update empty fields" switch fills the gaps and leaves every field that already has a value alone.
Owner-account allowlist
Only listings owned by accounts you name in Settings can be refreshed. Listings owned by anyone else are excluded, whatever is selected.
Place ID Filler
Finds the Google place id for older listings that do not have one, using the name and location already saved, so duplicate checks and updates cover them too.
Community Audit
Finds published listings with a missing or doubtful neighbourhood and sends a suggestion for each to Enrichment Review, without changing any listing.
Scale and safety
Works for a small town guide and for a catalog of tens of thousands.
Tested with large directories
Merge Duplicates has been tested on a directory of more than 75,000 listings within a 256 MB memory limit, a common hosting default, on MySQL 8.0, MySQL 5.7 and MariaDB 10.6. At 50,000 listings the plugin adds about 5 MB to a page. The unused photo tool counted, held and restored 50,000 photos within 256 MB on MySQL 5.7, MariaDB 10.6 and MySQL 8.0, with every step finishing in under 30 seconds.
Unused photo holding area
When an update replaces a listing's photos, the old ones can stay in your Media Library unused. Debug Tools counts the photos the importer downloaded that nothing on your site uses any more, and can move them to a holding area. Held photos are hidden from the Media Library, their files are untouched, and you can restore one or all at any time. If something uses a held photo again, it comes back by itself. Uninstalling the plugin restores every held photo. There is no permanent delete in this release: to remove a photo for good, restore it and delete it in the Media Library. Hand-uploaded media is never touched.
Count and Hold work in short steps and pick up where they stopped, even after a page reload, and a long Hold can be continued instead of starting over. In our tests at 50,000 photos, saving a listing or a setting while a count ran took milliseconds, about as long as with no count running. If PHP runs short of memory, the tool stops before changing anything and says how much more memory it needs. When in doubt it keeps a photo, so a few unused photos can be left in place.
Adjustable queue speed
A site with a server cron job can process more listings per run through a developer setting.
Raw data kept, then cleaned up
The full Outscraper response for every import is saved and can be exported from the Raw Data Exporter. A retention setting deletes old responses, after 90 days by default on new installs.
Debug Tools
A one-click Diagnostic Report checks the queue, the AI connection, your field mappings, fields that should have filled but did not, and your PHP and WordPress versions. Searchable logs sit alongside it.
Checked updates
Updates arrive on WordPress's normal Updates screen, with the auto-update switch. Each download is confirmed to be the right plugin and version before it installs.
Keys and uninstall
Saved API keys show only their last four characters. Removing the plugin keeps your data unless you choose to delete its own tables and settings, and imported listings are always kept.
Ready to import
Check the requirements, then choose a license.
Requirements and pricing
What it costs, and what you need to run it
License
Plugin pricing
Prices are in US dollars through the BrightAdvice store. Founding prices are applied automatically at checkout for early buyers, with no coupon needed. They will rise at a later date, which has not been set.
- Every feature, on one live site
- A year of updates on WordPress's normal Updates screen
- Recognised staging copies do not count against your site
- Every feature, on up to five live sites
- For owners running several directories
- Every feature, on as many sites as you run
- For agencies building directories for clients
- Every feature, on one live site
- Pay once, with no yearly renewal
- Every feature, on up to five live sites
- Pay once, with no yearly renewal
There is no unlimited-sites lifetime license. The BrightAdvice Suite, which bundles Places Importer with four other Voxel plugins, is not on sale yet.
New versions and new features for the length of your license, delivered through WordPress's normal Updates screen.
Every current feature keeps working. New versions and new features need an active license, and you can renew at any time.
Email help@brightadvice.com with questions or bug reports while your license is active.
Refunds
Works on your site, or your money back
Places Importer is a digital download, so we do not refund a change of mind, and renewals are not refundable. If the plugin does not work on your Voxel site within 14 days of purchase, tell us and give us access to a staging copy of the site: WordPress admin, and SSH or an MCP connection if you can. We will try to fix the problem. If we cannot make it work, we refund you in full to your original payment method and deactivate the license.
We only ever work on a staging copy, never on your live site, so nothing we test can affect your visitors or your data.
Voxel can be customised in almost unlimited ways, so we cannot promise to support every configuration. If yours is one we cannot support, that is exactly when you get your money back.
Requirements
What your site needs
We test on current versions, so keep WordPress, PHP and Voxel up to date. Out-of-date installs are not supported.
| Item | Needed | Detail |
|---|---|---|
| WordPress | Required | Version 7.1 or newer. Tested on 7.1.2. |
| PHP | Required | Version 8.2 or newer. The release checks run on PHP 8.2 and 8.4, and an earlier build was also checked on 8.3. We recommend 8.4, which is what our own sites run. |
| Voxel theme | Required | Field mappings, taxonomies, repeaters, opening hours and location are written in Voxel's own format. Tested on Voxel 1.7.9. We support the current Voxel release and the one before it. |
| InnoDB database tables | Required for Skip Preview | Skip Preview imports run inside database transactions so a background import can never add a business you dismissed. Almost every current host uses InnoDB. Where it is missing, Skip Preview is switched off before any search is paid for, and Preview mode still works. |
| Database | Required | MySQL 8.0 recommended. In our pre-release database tests, the plugin's own tables, runtime checks and staging checks passed on MySQL 8.0, MySQL 5.7, MariaDB 10.6 and MariaDB 11.4, with and without a Redis object cache. In our tests on MySQL 5.7, Voxel's own search index could not be written, because it uses a function that needs MySQL 8.0, so we recommend MySQL 8.0 for a Voxel directory. |
| Memory and scale | Tested | 50,000 listings tested within a 256 MB PHP memory limit, and the unused photo tool tested on 50,000 photos within the same limit. If a photo check reports that it needs more memory, raise the PHP memory limit (your host can do this) and start the check again. |
| Outscraper account and API key | Required | Supplies the full business record you keep. |
| Google Maps API key | Required | With Places API (New) and the Geocoding API enabled. Used for business search, autocomplete, the Batch Import preview and location lookups. Google's older Places API is closed to new Google Cloud projects, and the plugin does not need it. Free for most directories.* |
| AI provider API key | Optional | OpenAI, Anthropic, Google Gemini or Perplexity. Needed for AI writing, AI Term Matching and the AI checks on attributes and social links. Without one, listings still import with Google's data. |
| Server cron job | Optional, strongly recommended | Out of the box the queue runs on WordPress Cron, which only fires when someone visits your site, so on a quiet site imports can pause between visits. A server cron job, a standard setting on most hosts, runs the queue on a fixed schedule, usually every minute, whether or not anyone is visiting. We strongly recommend setting one up. |
Running costs
What the connected services charge you
The plugin adds no charge per import. Running costs come from the services you connect, which bill you directly at their own rates. Their pricing pages have the current figures.
| Service | How it bills | Current prices |
|---|---|---|
| Outscraper | Pay as you go, per business record. Photos are metered separately, per image, so your photo limits are usually the biggest factor in cost. | outscraper.com/pricing |
| Google Maps Platform | Free for most directories.* The plugin uses Google's Places API (New). A Single Import uses the search-box suggestion requests (at most 12 are billed per search) plus 1 Place Details request. A Batch Import search uses 1 Geocoding request when you search by a typed location (when you pick a suggested location instead, the location is looked up once in your browser with 1 Place Details request and the Geocoding request is skipped), plus 1 to 3 Text Search requests with a category or keyword, or 1 Nearby Search request without one. Queuing the selected businesses and importing them use no Google requests, because the full record comes from Outscraper. | Google Maps Platform pricing |
| OpenAI optional | Per request, by model. | OpenAI API pricing |
| Anthropic Claude optional | Per request, by model. | Claude pricing |
| Google Gemini optional | Per request, by model. | Gemini API pricing |
| Perplexity optional | Per request, plus a small fee for each web search and page fetch the research uses. | Perplexity API pricing |
Since March 2025 Google gives every account a free number of calls each month for each type of Maps request, instead of the old $200 credit. The plugin uses Places API (New) and asks each call only for the fields it needs, so each request stays in the lowest price group that holds that data. The free monthly amounts for the requests it makes are 10,000 Autocomplete requests, 10,000 Place Details (Essentials) requests, 5,000 Text Search or Nearby Search (Pro) requests and 10,000 Geocoding requests.
We measured each action on a live site. A Single Import uses at most 12 billed suggestion requests and 1 Place Details request, so even at the maximum more than 800 Single Imports a month are free. A Batch Import search with a category uses at most 3 Pro requests and returns up to 60 businesses, so more than 1,600 such searches a month are free. Selecting, queuing and importing businesses use no Google requests.
Outscraper has offered lifetime deals on AppSumo in the past. None is running as we write this, but if one comes back it can cut your data costs to almost nothing, so it is worth watching for. You can sign up through our Outscraper link (an affiliate link) or directly at outscraper.com.
To test a new search or mapping at the lowest cost, leave Skip Preview off. The preview searches Google first, and Outscraper is only charged for the businesses you select.
Get Places Importer
Buy a license, then upload the plugin ZIP file in Plugins, Add New Plugin in your WordPress admin.
FAQ
Questions buyers ask before they import
Can it import businesses anywhere in the world?
Yes. It finds any business listed on Google Maps. Set your directory's location, search language and region, distance unit and local currency in Settings, and optionally limit searches to the countries you cover.
How many businesses can I import at once?
As many as you like. Batch Import previews up to 60 businesses per search (up to 20 when you search without a category or keyword), and Skip Preview sends up to 500 per search straight to the queue. Run as many searches as you need.
The queue then works through everything in the background, about 3 listings a minute on the default settings, until the last one is done. A site with a server cron job can raise that rate through a developer setting.
Why Outscraper instead of the Google Places API?
Because Google does not let you keep the data. Google's Places API terms allow you to store the place id permanently and map coordinates for 30 days. The business name, address, phone number, hours and photos may not be stored. A directory listing is permanent, so it cannot be built on the Places API alone.
Google is still used for what it is licensed for: search, autocomplete, the Batch Import preview, location lookups, and the place id that identifies each listing and makes duplicate checks reliable. Outscraper then supplies the record you keep.
Much of what a directory needs is not in Google at all. Email addresses, social profile links, WhatsApp numbers, menu and ordering links and logos have no equivalent in the Places API.
As with any data source, how you publish what you import is up to you. For ordinary directory details such as name, address, phone and hours, this is rarely a concern.
What does an import cost?
The plugin adds no charge per import. Each import uses your own Outscraper and Google accounts, and your AI provider if you use one, at their published rates. Outscraper bills photos per image, so the photo limits you set make the biggest difference.
The AI Health & Cost screen estimates the AI part of a bulk import before you run it. See the Requirements and pricing tab for each service's pricing page.
Can I limit how many customer or backup photos are imported when the business owner has not added any?
Yes. The importer asks for the business owner's own photos first, up to the owner photo limit you set on the Field Mappings tab.
Photos taken by customers and other Google photos are imported only if you switch on the owner photo fallback for that listing type, and it is off by default. When it is on, it is used only for a business whose owner has added no photos, and the number imported is capped by the general Photos limit for that listing type, which is 10 when you have not set one.
Customer photos are not the business's own images. With the fallback left off, a listing whose owner has added no photos imports none. The data provider bills photos per image, so a low limit also keeps the cost down.
Will it overwrite my edits or my advertisers' listings?
Only where you ask it to, and claimed listings are protected.
- Data Enrichment changes only the fields you select, on listings owned by accounts you have approved in Settings.
- "Only update empty fields" fills the gaps and leaves every existing value alone.
- Listings their owners have claimed are skipped unless you switch that on. When you do, every change is reversed straight away and sent to Enrichment Review for your approval.
- A logo, price tier, neighbourhood or parent-listing link that a listing already has is kept.
- Merge Duplicates only adds missing values to the older listing and moves the newer one to Trash, where it can be restored. Claimed listings are never merged.
Does it work with my listing types and taxonomies?
Yes, as long as your site runs the Voxel theme. You choose which of your post types it imports into and map each data field to your own fields and taxonomies. For each taxonomy field you decide whether new terms may be created, and that choice starts switched off. When it is off, values are matched to your existing terms by name, or by AI when AI Term Matching is on, and uncertain AI matches wait for your review. For Google's attribute list, the recommended split setting uses only the terms you already have.
What happens if I don't renew my license?
Every current feature keeps working. The license decides whether new versions and new features are offered to your site, never whether the plugin runs. Renew at any time to receive updates again.
Does a staging site use up a license?
No. Staging and development copies do not count against your license's sites. The store recognises them automatically when:
- the address uses a staging-style subdomain: staging, stage, dev, development, test, qa, sandbox, beta, preview or uat (for example staging.yoursite.com);
- the site sits in a folder with one of those names (for example yoursite.com/staging/);
- the site is local: localhost, or an address ending in .test or .local;
- the site is on a host's staging address: WP Engine, Kinsta, SiteGround, Cloudways, Flywheel, Pantheon, DreamHost, Pressable, WPMU DEV, Liquid Web, RunCloud, xCloud or Rocket.net.
If your staging copy still uses up a site, email help@brightadvice.com and we will add your host.
Which AI providers does it support?
OpenAI, Anthropic Claude, Google Gemini and Perplexity. Choose one in Settings and switch at any time. AI is optional: without a key, listings still import with Google's data.
What if my AI account runs out of credit?
The listing still imports. It keeps Google's own description instead of an empty field, the Queue screen explains what happened in plain language, and an admin notice appears while the provider is failing.
Can visitors add businesses themselves?
Yes, if you want them to. An Elementor widget lets visitors search for a business and submit it. It is off by default, requires a login by default, and has hourly and daily limits you control. Each submission uses your Google and Outscraper credits, just like an import you run yourself.
Can it handle a large directory?
Yes. Merge Duplicates has been tested on a directory of more than 75,000 listings within a 256 MB memory limit, a common hosting default, and 50,000 listings were tested within 256 MB on MySQL 5.7 and MariaDB 10.6 as well. Imports and updates run through the background queue, so a large job never ties up your browser. The unused photo tool was also tested on 50,000 photos within 256 MB on MySQL 5.7, MariaDB 10.6 and MySQL 8.0.
The plugin's own checks pass on MySQL 8.0, MySQL 5.7, MariaDB 10.6 and MariaDB 11.4, with and without a Redis object cache. We recommend MySQL 8.0 for a Voxel directory: in our tests on MySQL 5.7, Voxel's own search index could not be written.
What happens when an AI provider retires a model?
The plugin checks each provider's model list once a week and keeps a list of announced retirement dates. You are warned from 60 days before the date, and the warning turns red at 30 days. Seven days before the date the plugin switches to the replacement the provider named, and tells you once. You can pick a different model at any time.
The retirement list is fetched from brightadvice.com once a week. That request names only the plugin and its version, and sends nothing about your site, its listings, settings or keys.
Does it work in my language?
Day names for all 29 content languages in Settings are built in, but opening hours, closed days and prices have only been checked on a live directory in English. Choose another language and a note beside the setting says so. The plugin counts the hours lines and prices it could not read in each language, and asks once whether that language is working. If you report a problem, you see the exact report before it is sent, and nothing leaves your site until you click Send.
What happens to photos a listing no longer uses?
Debug Tools can count the photos the importer downloaded that nothing on your site uses any more, and move them to a holding area. They are hidden from the Media Library but their files stay, and you can restore one or all at any time. A held photo that something uses again comes back by itself, and uninstalling the plugin restores them all. This release has no permanent delete: to remove a photo for good, restore it and delete it in the Media Library.
The photo check says it needs more memory. What do I do?
The check stops before it changes anything and tells you roughly how much more memory it needs. Ask your host to raise the PHP memory limit, then start the Count or Hold again from the beginning. A large photo library can take several minutes to check; the check works in short steps and picks up where it stopped if you reload the page.
Will it support other data sources?
More data providers may be added in future, each with its own pricing. Outscraper is the data source today.
What about refunds and support?
If the plugin does not work on your Voxel site within 14 days of purchase, we try to fix it on a staging copy you give us access to, and refund you in full if we cannot. We do not refund a change of mind, and renewals are not refundable. The full policy is on the Requirements and pricing tab.
For help or bug reports, email help@brightadvice.com.
See how each release is tested
Read how every release is audited and tested before it reaches you.
WordPress · Voxel directories · release history
BrightAdvice Places Importer
Forked from an abandoned plugin that scores 69 out of 100 under today's audit rules, and rebuilt across 469 builds, with independent audits throughout, into a security-hardened, AI-native engine for importing Google and Outscraper business data into Voxel directories. Version 3.2.0, released on 30 September 2026, is the audited, tested release on sale, and scores 99 under the same rules.
Where it started
From an abandoned plugin to a maintained fork
The plugin began as Voxel Business Scraper Suite v1.9.3, which the original vendor stopped maintaining. Re-scored in September 2026 under the same audit rules used for every current release, that original scores 69 out of 100. It was forked, renamed, and rebuilt in the open.
- Vendor abandoned, no updates
- A privilege-escalation flaw in its licensing code
- Credentials written into logs; unescaped output on public forms
- Uncontained file downloads, flat imports, no review step
- Licensed updates from the BrightAdvice store, each package checked before it installs
- That licensing flaw removed; keys redacted from every log
- Byte-capped SSRF-safe downloads, hard-bounded operations
- AI enrichment with a human review queue; claimed listings protected
By the numbers
What changed since the fork
Measured across the PHP source. The original was already a large plugin, so much of the work was rewriting its core in place, not only adding to it.
Independently audited
The latest audit, against the original
Both builds were scored by the second reviewer with the same fixed rules (rubric v1.0): eight categories, fixed deductions for each problem found, and a cap on the overall score while any serious problem stays open. The original v1.9.3 scores 69; its raw average of 75 is capped because of a confirmed high-severity flaw that let the plugin publish any post. The last three builds before release, v3.1.324, v3.1.326 and v3.1.328, each scored 99, and v3.2.0 differs from v3.1.328 only in its version number. Before those audits, six independent auditors and a grader reviewed every file of v3.1.324 without access to the builders' notes. The grader confirmed 24 problems: none serious, 3 medium and 21 minor. All 24 were fixed in v3.1.326, and a follow-up test on large databases found two more minor problems in the photo tool, fixed in v3.1.328. One minor performance finding from the last audit remains open and was accepted: if a photo check is refused twice for lack of memory, saves during the rest of that check run on a slower lookup, about a second each instead of milliseconds, until the check ends. The second reviewer's own caveat applies: the 69 to 99 comparison uses the same rules but does not imply identical runtime coverage.
How it's built
A dual-AI development process
Every product decision is made by a human owner, but the engineering runs through two independent AI systems that alternate builds and review each other's work.
Two AI engineering systems take turns (even and odd version numbers) and each audits the other's output.
Real defects were found this way, including a leaked API key one reviewer missed and the other caught. Separate audit teams, barred from reading the builders' own notes, have since found and confirmed 26 more problems in one pass, and the release that fixed them went through its own audit.
Audit reports, fix logs, design docs and the raw output of every release's tests live with the code. The next owner inherits the reasoning, not a black box.
What was built
Milestone history
Grouped by era, newest first. Full per-release notes ship inside the plugin's update screen.
The release on sale
- Version 3.2.0 is the audited, tested release on sale. Its code is exactly the code audited as v3.1.328; only the version number changed, so that sites on 3.1.x are offered it as an update.
- It runs the developer's own live directory. After it was installed through the BrightAdvice store's normal update, every installed file was checked byte for byte against the release package, all 13 admin screens were rendered without an error, and the license reported valid.
- The option to delete held photos permanently stays switched off.
A full independent review, and every finding fixed
- Six independent auditors, each covering part of the plugin with every file assigned, and a separate grader reviewed v3.1.324 without access to the builders' notes. The grader confirmed 24 problems: none serious, 3 medium and 21 minor. A second independent AI reviewer scored the same build 99 out of 100.
- v3.1.326 fixed all 24. Among them: choosing Business Name in Data Enrichment now changes the listing title itself, and claimed listings keep that change for review; email and social enrichment is on from the start and no longer switches itself off at the first Settings save; saving anything while a photo check runs no longer triggers a slow scan of the Media Library; a long Hold can be continued; at most two queue workers run at once and a retried item gets a fresh set of attempts; a hand-picked featured image is kept; Perplexity's Extra High preset uses the model Perplexity publishes for it; a picked location in Batch Import is sent with the search; and several small display fixes, such as small text in dialogs raised to 14px. The second reviewer scored v3.1.326 99.
- A test on 50,000 photos on real MySQL and MariaDB databases then found two more minor problems in the photo tool: it could run out of memory on a site already close to its limit, and some temporary data outlived the check. v3.1.328 fixed both, and the same test passed. The second reviewer scored v3.1.328 99, with one minor performance finding accepted.
The photo check rebuilt for large sites
- v3.1.294 ran the developer's own live directory through most of this period. A focused the second reviewer audit of its unused photo holding area scored 96 out of 100.
- v3.1.296 lets an admin send a language report to BrightAdvice support after previewing exactly what it contains. Nothing is sent without that click, and two clicks at once still send one report. The minimum WordPress version is now 7.1.
- The plugin's runtime checks, staging checks and all 13 admin screens were run on MySQL 5.7, MariaDB 10.6 and MariaDB 11.4, with and without a Redis object cache, and at 50,000 listings within 256 MB. The problems those tests found were fixed.
- The Count and Hold photo check was redesigned so it works on very large photo libraries: it reads where photos are used once per check, works in steps of under 20 seconds that pick up where they stopped, keeps its progress across a page reload, marks a photo as in use the moment something saves a reference to it, and stops safely with a clear message when memory is short. The redesign went through several second-reviewer audits and was tested at 50,000 photos on MySQL 5.7, MariaDB 10.6 and MySQL 8.0.
Models kept current, language checks and a photo holding area
- AI models are kept current: a weekly refresh of each provider's model list, warnings from 60 days before a model is retired, and an automatic switch to the named replacement 7 days before the date. The retirement list is published on brightadvice.com, with a copy built into the plugin.
- A note beside the language and country settings when a content language has not been checked on a live directory or a currency is not recognised, with per-language counts of hours lines and prices that could not be read, and an opt-in feedback prompt.
- Each listing type can import, skip or draft businesses that have no street address. Skip Preview flags businesses whose names closely match an existing listing.
- Photos that no listing uses any more can be moved to a holding area and restored at any time. The search box loads Google's map script itself when nothing else has, and opening hours that cannot be read are left blank instead of being marked Closed.
- Two fresh full-plugin audits of v3.1.280 ran in parallel: the second reviewer scored it 84 with four medium and five minor findings, and four independent AI auditors with a grader confirmed nine medium and 28 minor ones. They were fixed across v3.1.282 to v3.1.294, apart from two minor items deliberately deferred.
Moved to Google's Places API (New)
- Google closed its older Places API to new Cloud projects in March 2025. Every Google call in the plugin, on the server and in the browser, now uses Places API (New), so a buyer with a new Google key can use search, Batch Import and autocomplete.
- Each call asks only for the fields it needs, to stay in the lowest Google price group, and the Google usage of each action was measured on a live site. The figures are on the Requirements and pricing tab.
- Perplexity's presets stopped accepting a temperature setting, so the plugin stopped sending one and AI descriptions kept working.
- Opening hours written like "5-10PM" had been read as starting at 5 AM. The parser was fixed, and affected listings on the developer's directory were repaired from their stored records.
- A second-reviewer full-plugin audit of v3.1.276 scored 77 with nine medium and three minor findings. They were taken into the 3.1.278 round, and v3.1.280 was then audited in full again.
Skip Preview imports that survive crashes and overlapping runs
- Each paid search is tracked in its own record. A background import holds a short lease that it renews before every business, and each business is queued inside one database transaction, so a stopped or overlapping run can never import twice or import something you dismissed.
- A business that cannot be added is retried from the results you already paid for, never lost. After three attempts the request shows as failed with a Retry import button, and no new search is needed.
- Every scenario the auditor named was reproduced on a real database, including a second connection trying to write while an import holds the record. The fixed release scored 97 out of 100 with no open high or medium finding.
Independently audited, problems found and fixed
- Four independent auditors and a separate grader reviewed v3.1.236 without access to the builders' notes. The grader confirmed 26 real problems, three of them serious, and rejected none. Earlier audits had scored 96 to 99 because they reviewed each change on its own; this audit traced every import and update path end to end, which is where the problems were. v3.1.238 is the fix release for that audit, and a follow-up the second reviewer audit of the whole write path found its three serious findings addressed.
- A Data Enrichment run limited to AI fields now changes only the fields you selected. Before v3.1.238 it could clear mapped fields nobody chose.
- Claimed, owner-managed listings are skipped by Update Data unless you switch that on. When you do, changes to fields, taxonomy terms and social links are held for review and can be reverted, community and related-listing enrichment is not applied to them, and a listing is restored if an update stops part-way.
- Nothing specific to Roatan is built in any more. Directory location, WhatsApp country codes, local place names and communities excluded from auto-assignment are settings, so the plugin works for a directory anywhere.
- Text containing quotes, backslashes or line breaks is saved exactly as written everywhere the importer writes.
- The second reviewer then audited the whole write path of v3.1.238 and found two more medium problems and two minor ones. v3.1.240 fixes all four: paid Skip Preview requests are no longer lost when two imports are saved at the same moment, and Batch Import skips exact duplicates before it spends a Google lookup, and says so.
Proven on a real database, not only by reading the code
- Every release is installed on a staging copy of a live directory and checked there: 78 runtime checks pass on v3.1.248, covering imports, updates, claimed-listing protection, resumed imports, background imports, merges and settings saves. Any PHP warning from the plugin fails the run.
- Every installed file is compared byte for byte with the release package on both staging and production, and all 13 admin screens are rendered as an administrator on both.
- The raw output of each run is kept with the release, and a short README says plainly what was tested and what was not, so an auditor reads real results instead of assumptions.
- The first of these tests found a problem every earlier review had missed: the "delete plugin data on uninstall" choice could not be saved. It was fixed in v3.1.228 and now has its own form.
Merge Duplicates at 50,000 listings in 256 MB
- A real test on 50,000 listings showed the Merge Duplicates screen ran out of memory at a 256 MB PHP limit, a common hosting default. v3.1.232 moved the duplicate search into the database; the same catalog now needs about 7 MB extra.
- A harder test followed: 75,489 listings with 25,000 sharing one name and one Google place id. The full page and the pre-merge check both complete within 256 MB, and the page now takes 96 database queries instead of 5,296.
- Each new search method was proven to return exactly the same pairs as the one it replaced, on the same real data, before it shipped.
Licensed updates from the BrightAdvice store
- Updates now come from the BrightAdvice store. WordPress shows them on its normal Updates screen with the standard auto-update switch, and a new release is offered at the site's next routine update check.
- Before installing, the plugin downloads the package and confirms it contains exactly the version advertised. Anything else is refused and the site stays as it was.
- Staging copies of a site do not use up a license activation. Release downloads are served only to licensed sites.
- Proven end to end on staging and production: the update offer, a one-click update and a background automatic update.
Tested as a buyer would meet it
- A nine-agent review looked at the plugin as a stranger installing it for the first time. It found that most remaining issues would affect a new buyer rather than the developer's own site, and those were fixed.
- No site-specific user accounts ship as defaults. An opt-in uninstall routine removes the plugin's own tables and settings; imported listings are never touched.
- The optional public submission form is off by default, and when enabled it confirms each business with Google before any paid lookup.
- A four-agent review of v3.1.212 found and fixed a social-link check that could accept the page of another branch of the same chain. Those links now go to the review queue.
- Social links found during an update are now added to existing listings, and queue times are shown in the site's own time zone.
Merge Duplicates, and duplicates stopped at the door
- New Merge Duplicates tool. It keeps the older listing, copies across only what it is missing, checks every copied value was saved, and only then moves the newer listing to Trash. Nothing is ever permanently deleted.
- When two listings share a name but sit in different communities, the tool warns that they may be two branches and offers "Not a duplicate, keep both" first.
- Single Import blocks a confirmed duplicate, asks for confirmation on a possible one, and can link the Google place id to the existing listing in one click so the question does not come back.
- Opening hours in Spanish and other accented languages now import correctly.
Accurate counts and no duplicate jobs
- The database itself now prevents the same business being queued twice, with an upgrade that repairs an older queue safely and reports its status on the diagnostics screen.
- Import screens report what was actually queued, skipped or already waiting, instead of counting rejections as successes.
- AI provider failures are remembered on the health panel, and the plugin runs on hosts that lack optional PHP text extensions.
Descriptions that cannot fail silently
- An AI provider running out of credit used to leave a listing description empty with no record of why. The importer now keeps the scraped description as a fallback, writes the real provider error to the log, and states the cause in plain language on the Queue screen: "Description did not update because the AI account ran out of prepaid credit."
- Provider health panel showing the last successful call and the last error for each of the four AI providers, with a live one-token Test connection check. Prepaid balances are deliberately not claimed, because no provider publishes a balance a plugin could read.
- A persistent admin notice when the active provider starts failing, dismissible per failure so a new failure surfaces again.
- Descriptions are now web-grounded and source-attributed: every page the AI consulted is recorded in the AI log, and the real metered cost of each call is stored rather than estimated.
Duplicate detection for listings the importer did not create
- Duplicate checking previously matched only on the Google place id, so any listing added by hand was invisible to it and could be imported a second time.
- Batch and single imports now also compare business names before anything is created, using token scoring that ignores punctuation, possessives, accents and generic trade words. Flagged as a warning for a human to judge, never an automatic merge, because multi-location businesses are legitimate.
- A field-mapping health report on the diagnostics screen names any listing type whose duplicate detection is switched off because its place id is unmapped.
Migrated ahead of an API retirement
- Perplexity announced the retirement of its Sonar API. The plugin moved to the replacement Agent API, translating saved settings at call time so an existing install keeps working without touching its configuration.
- Live web search is now requested explicitly and verified per call, after testing showed the search was silently not running even though it had been asked for.
- Timeouts and research depth scale with the chosen quality tier.
Licensing, without holding the software hostage
- Every feature works with or without a license key. The key covers automatic updates and support, never the functionality you have already installed.
- Distributed under GPL v2 or later, so the code stays yours to keep, read and modify. There is no kill switch, no phone-home requirement to keep working, and no feature that stops if a subscription lapses.
- License keys travel only in request bodies over HTTPS to a single allowlisted host, and are stored outside WordPress's autoloaded options.
Packaged as a product
- Distributed under GPL v2 or later with the original author credited in the plugin header, license text, and readme.
- Separate stable and beta update channels, so an in-development build can never be offered to a production site.
- AI cost planner: plain-English quality tiers per provider with estimated spend before a bulk import, calibrated against the site's own measured usage.
- First-run onboarding checklist, and a shared suite menu so several plugins occupy one clean admin row each.
Branded, self-describing updates
- Branded plugin icon across the update UI; the WordPress version the release was tested with reported on the Dashboard Updates screen and the details modal.
- Full version history in the details modal; the Plugins-screen row adds quick Settings, Import, View details, and Documentation links, with the plugin-site link pointing to this page.
Security and resilience hardening
- Independent audit at 97/100, no critical, high, or medium findings.
- Safe capped image downloads, hard-bounded admin operations, queue-time taxonomy validation.
Data enrichment engine
- Google/Outscraper "About" data split into curated taxonomies via an alias table and synonym-aware matching.
- Build Synonyms tool, price-range mapping, Located-At picker, shared Highlights, and a claimed-listing guard with a review queue.
AI architecture
- Unified AI Gateway across OpenAI, Claude, Gemini, and Perplexity, with retry and per-task logging.
- Community and geo auto-assignment; opt-in cleanup for resolved review rows.
Enrichment foundation
- AI descriptions with brand-voice consistency and hours-aware attribute gating.
- Social, WhatsApp, and logo verification; first-generation Located-At relations.
Production baseline
- Full audit cycle with every finding fixed; two independent security audits; external remediation in v2.7.266.
- Async batch imports, duplicate-handling redesign, social repeater auto-fill, complete Documentation page, live production deployment.
Multi-provider AI and self-update
- Native self-update channel; four-provider AI with dynamic model fetching and a provider tile selector.
- AI prompt generator; reset-safe settings that survive upgrades.
Security rebuilt, brand UI
- Production posture rebuilt from 62% to 97%: path traversal, frontend XSS, post-type trust, and API-key log leakage all fixed.
- Branded admin UI system, Data Updater owner allowlist, dual-AI review cadence established.
Clean fork
- Forked from Voxel Business Scraper Suite v1.9.3 and rebuilt through early 2.x; the tracked changelog begins at 2.4.16.
- Abandoned license and update machinery and dead code removed; rebranded and repackaged with a correct single-folder structure.
Bad data is worse than no data.
Every AI-assisted step carries a confidence gate. Uncertain matches are never auto-published; they go to a human review queue. Claimed listings are protected from overwrites, hand-set values are never clobbered, and unrecognized inputs are quarantined rather than guessed. Automation serves data quality, not the other way around.