# External Importer Pro Plugin

Project URL: [www.keywordrush.com/externalimporter](https://www.keywordrush.com/externalimporter)

Email: <info@keywordrush.com>

*Copyright © 2026 by keywordrush.com. All Rights Reserved.*


# Installation and activation

### Requirements

* PHP version 7.4 or higher.
* The most current release of WordPress.
* The most current release of the WooCommerce plugin (free).

### Recommendations

* Dedicated IP address.

### Installation

1. Download the ZIP archive with plugin distribution from your user panel.
2. In the WordPress admin interface, go to `Plugins > Add new`.
3. Click `Upload`.
4. Click `Choose File` and select the file external-importer.zip.
5. Click `Install Now`.
6. Wait a few minutes for the install to finish and activate the plugin.

### Licensing

After the plugin is installed and activated, you must enter your license key in the plugin settings. You can find your license key in [your user panel](https://www.keywordrush.com/panel).

If you want to use your key for a new domain:

1. Deactivate and delete the plugin from the current domain.
2. Revoke your license in the user panel.
3. Install the plugin on your new domain and activate it with your key.


# Plugin updating

{% hint style="success" %}
[Make sure](https://www.keywordrush.com/panel) your updates subscription hasn't expired.
{% endhint %}

You'll receive a notification when a new update is available. You can update the plugin directly from your website's admin panel. Always use the latest available version.

![](/files/-MJVnRUSDJ-ws__XTp0a)

### Changelog

You can find release notes [here](https://www.keywordrush.com/changelog/external-importer/readme.txt).


# General information

Extracting product data from external websites and normalizing it is the first stage of importing products to your website. To start using the plugin, navigate to `External Importer > Import`.

Open the online store's website and copy the URL of the product you want to promote from your browser's address bar. Depending on the parser, you can extract data from two types of pages:

1. **Product Detail Page**: This is the specific product card page, which usually contains a description, photo, price, and other information. You can specify a list of multiple product URLs.

![](/files/-MJHs-3aWmVCvUqvaRSn)

2. **Listing Page**: This page contains a list of products based on a category or search query. In this case, the parser will first extract the links to the product detail pages and then automatically go through all the product URLs.

![](/files/-MJHslm52dxtMoZMD7Jq)

The second option is faster and more convenient because it allows you to bulk import products by entire categories. Listing pages are available for all advanced parsers and nearly 75% of structured parsers.

Some parsers support **automatic pagination**. In these cases, you'll see both the number of products found and additional listing pages in the parsing log.

![](/files/-MJHt7go_iM1DiNnPGBa)

If pagination can't be detected automatically, only products from the current page will be extracted. You can manually specify the next page if necessary.

All extracted data is processed, and the normalized products can be viewed in a special section.

![](/files/-MJHtbJ2WYNWo2qS_egE)


# Supported stores

External Importer allows you to import products from many (but not all) public eCommerce websites worldwide. We have developed a set of special parsers to extract product data from target HTML pages.

### **General requirements**

External Importer retrieves data directly from store websites. Therefore, target websites must comply with the following requirements:

* The website's content must load without JavaScript or Ajax.
* The target website must not block bot access.
* Your server IP must not be blocked on the target website.

Please note that you can still [develop advanced parsers](/extracting-products/custom-advanced-parsers) for dynamic websites that use JavaScript.

### **1. Advanced parsers**

These parsers are designed for a **fixed list** of popular online stores around the world.

{% hint style="success" %}
You can find the complete list of advanced parsers [here](https://www.keywordrush.com/ei-advanced).
{% endhint %}

The biggest advantage of advanced parsers is their ability to extract complete product data, including:

* Title
* Image
* Price
* Currency
* Availability
* Description
* Gallery images
* Old price
* Brand
* Category path
* Specifications
* User reviews

![](/files/-MJHvNzolD2Wp3BACfdS)

These parsers usually also support:

* Listing pages
* Automatic pagination

![](/files/-MJHveMnFGBZx7UQ_-JU)

The only disadvantage of this approach is that each store requires a unique parser to be developed.

{% content-ref url="/pages/-MJHyOjsxrhEZ7finT-I" %}
[Custom advanced parsers](/extracting-products/custom-advanced-parsers)
{% endcontent-ref %}

### **2. Structured data parsers**

These are generic parsers that can extract data from pages containing structured data and **product schema**. Supported markup formats include:

* JSON-LD
* RDFa
* Microdata
* Open Graph
* Twitter Card
* and others…

![](/files/-MJHx6neLeCv88BHHbhn)

You can use the [Structured data testing tool](https://search.google.com/test/rich-results) to check if the page contains data markup.

![](/files/-MJHwvh7qCoAEodSHew7)

The amount and volume of available data depend on the store. Typically, structured data parsers can extract less product information than advanced parsers.

![](/files/-MJHxbC2IB6-kLnpTvir)

### **3. Adaptive AI Parsers**

We developed this level of parsers by training ChatGPT on more than 1,000 ready-made parsers to find a universal solution compatible with typical eCommerce sites and themes.

These parsers will be used if the source site does not have micro markup for products.

### **4. Affiliate Egg parsers**

If you've installed our other plugin, [Affiliate Egg Pro](https://www.keywordrush.com/affiliateegg), you can use its parsers inside External Importer (including custom parsers).

{% hint style="success" %}
Make sure you are using the latest Affiliate Egg version.
{% endhint %}

{% content-ref url="/pages/-MJMcfl3rawMDQJF9NnP" %}
[Affiliate Egg plugin](/integration/affiliate-egg-plugin)
{% endcontent-ref %}

### **5. Custom parsers**

If none of the solutions work for your source or incomplete data is being extracted, we can create a custom parser specifically for your source. We offer this as a paid service.

{% content-ref url="/pages/-MJHyOjsxrhEZ7finT-I" %}
[Custom advanced parsers](/extracting-products/custom-advanced-parsers)
{% endcontent-ref %}


# Custom advanced parsers

How to Order a Custom Parser for External Importer

In some cases, default parsers may not be sufficient—for example, when a website doesn't use a standard product schema or if you need full product details such as specifications, short descriptions, or image galleries. Product variations are also not supported by default parsers. For these scenarios, we offer custom advanced parsers tailored to your specific needs.

### Request a Custom Parser

Our team can develop advanced, site-specific parsers upon request.

#### Pricing

| Parser Type                                                                                                                     | Price    |
| ------------------------------------------------------------------------------------------------------------------------------- | -------- |
| Websites **without a product schema** or requiring additional fields (e.g., gallery images, specifications, short descriptions) | $50      |
| Websites with **dynamic content** rendered via JavaScript                                                                       | from $50 |
| **Supplier websites** that require authentication (login/password) to access product data or pricing                            | from $50 |
| Stores with **product variations** (e.g., color, size options)                                                                  | from $50 |

> **Note:** Final pricing may vary based on site complexity. Please send us the list of websites for a custom quote.

#### How to Request a Parser

1. **Contact Support**\
   Email [our support team](https://www.keywordrush.com/contact) with your parser request.
2. **Provide Site Links**\
   Include the URLs of the websites you want us to support.
3. **Turnaround Time**\
   Most custom parsers are completed within **1–2 business days**.

#### What’s Included

* Extraction of all standard and extended product fields, where available
* A **6-month warranty** on each custom parser. If the site changes during this period, we’ll update your parser at no additional cost.

### FAQs

**Will my parser work for all websites?**\
No. Each website has its own unique layout and data structure. A separate parser is required for each individual site.

**Will my custom parser be shared with other users?**\
No. Your custom parser will not be included in the public plugin distribution.

**What if the website changes and my parser stops working?**\
We provide **free support and updates** for a period of **6 months** after delivery. If the site structure changes during that time, we’ll update your parser at no additional cost.

### **Create Your Own Parser**

If you have basic PHP and XPath skills, you can [create advanced parsers](/for-developers/custom-parsers) for the stores you need.

### **Installing Custom Parsers**

Custom parsers are delivered as PHP files. To install them on your website, follow these steps:

1. **Create Directory**: Use a file manager plugin, file manager in your hosting panel, or an FTP client to create the directory:

```
/wp-content/ei-parsers
```

2. **Copy Files**: Copy the provided parser files to this directory.

Installation is now complete.

{% hint style="success" %}
Custom parsers work the same as default parsers. You can safely update the plugin or WordPress; the directory with custom parsers won't be overwritten.
{% endhint %}


# How to avoid getting blocked

Scanning and fetching data directly from store websites have several advantages:

* A simple, clear process for importing products.
* You can work with stores that have no API or data feeds.
* Up-to-date and complete data.

But large-scale data extraction and product data parsing have their own challenges. One of them is that some websites can implement anti-bot mechanisms. Sometimes, your bot can be blocked if it sends too many requests per day/hour. Usually, a restriction is imposed on your hosting's IP address.

The most obvious reason for bots being blocked is preventing heavy automated traffic that could affect website performance. Please note that getting a product and updating a price requires a separate HTTP request to the target website.

That's why the general rule for stable use of External Importer is to ***send as few requests to the target websites as possible***!

### Anti-blocking settings

External Importer was developed to be a good bot, not to cause inconveniences to other websites. For example, the plugin will follow the rules from *robots.txt* and has request limits. To find these settings, go to `External Importer > Settings > Extractor`.

![](/files/-MJHzhzffekgFHdvkoVd)

Please pay attention to the `Daily limit`. It's an important value. The plugin will count any requests to every domain for every 24 hours and block automated queries that exceed this limit.

There's also an option for 1- or 24-hour blocking available to prevent new requests if several errors in a row are received from the target website.

{% hint style="info" %}
Only automated requests, price updates, or auto import will be blocked. These limits aren't considered if you extract the products by manually entering the URL on the Product Import page.
{% endhint %}

So please, don't try to import too many products at a time from one source. It's better to split big tasks into several days.

We also recommend setting as long a pause as possible between requests for each product:

![](/files/-MJHzuATgl_jb_qWy2hK)

What else can you do to avoid getting blocked?

{% hint style="warning" %}
Don't update prices too often.
{% endhint %}

![](/files/-MJI-ECmy49ObDfVa1uU)

### What can you do if you're already blocked?

Your server's IP may be temporary or permanently blocked on the target website's side for the following reasons:

* You're sending too many requests.
* You use a shared IP with a bad reputation or bad hosting neighbors.
* The website has low bot tolerance and blocks bots globally.
* The country where your server is located is blocked on the website.

You can get the following errors because of blocking:

* 403 - Forbidden
* 503 - Service Unavailable
* 429 - Too Many Requests
* 408 - Request Timeout
* 400 - Bad Request

![](/files/-MJI-7Y0BA5SARE9Qs3Y)

What you can do:

* Temporarily disable price updates, and don't send new requests. Temporary blocks are usually removed a day later.
* Try negotiating with the website owners to whitelist your IP. Some advertisers might do you a favor as you promote their products and generate traffic.
* Use a dedicated IP instead of a shared IP.
* Change the hosting. We don't recommend using large-scale cloud hosting providers like Amazon Web Services or Google Cloud, as some websites block entire subnets of these services.
* Use proxies.
* Use built-in [crawling services](/extracting-products/crawling-services).

{% content-ref url="/pages/88rvKocjkzgFhIYlEJ6o" %}
[Crawling services](/extracting-products/crawling-services)
{% endcontent-ref %}


# Crawling services

Using Crawling / Scraping Services / IP Rotation

External Importer supports multiple crawling services that automatically rotate IP addresses to prevent blocking and rate-limit issues.\
The currently supported services are:

* [Scrapingdog](https://www.keywordrush.com/go/scrapingdog)
* Scrapeowl.com
* [Scraperapi](https://keywordrush.com/go/scraperapi)
* Crawlbase
* Decodo

{% hint style="warning" %}
These services are paid, but each typically provides **around 1,000 free requests per month**.
{% endhint %}

<figure><img src="/files/UxJTUBaTsV9xKyeziOQD" alt=""><figcaption><p>You can view the crawler service used for the last request on the product import page, in the right-hand panel.</p></figcaption></figure>

### How to Route Requests Through a Scraping Service

#### 1. Add API Keys

1. Open **External Importer → Settings → Extractor**
2. Enter your API keys for the providers you want to use

You may enable one or multiple providers at the same time.

<figure><img src="/files/0VH7PH2z0sSJ7CBD9aqX" alt="" width="563"><figcaption></figcaption></figure>

#### 2. Configure Routing Rules

Under the **Routing rules** table:

1. Click **Add rule**
2. Enter a domain or pattern
3. Select the scraping provider
4. (Optional) Add additional parameters for the provider API

<figure><img src="/files/piNNi1W7P6WhuUwhE4qT" alt=""><figcaption></figcaption></figure>

#### Pattern Examples

You can use **simple domain names** or advanced patterns:

* `example.com`
* `*.example.com` (any subdomain)
* `example.com/path/*` (match only specific URL paths)

#### Additional Parameters

Additional parameters are appended to the provider API request.\
Each provider uses its **own parameter names** and accepted values.

**ScraperAPI Parameters**

* `country_code=us` — Geotargeting
* `premium=true` — Premium residential/mobile IPs
* `ultra_premium=true` — Advanced bypass mechanism
* `render=true` — JavaScript rendering

**Scrapingdog Parameters**

* `country=de` — Geotargeting
* `premium=true` — Premium residential proxies
* `dynamic=true` — JavaScript rendering

**Combining Parameters**

Multiple parameters can be joined using `&`:

```
country_code=us&premium=true&render=true
```

### Rule Priority

Routing rules are evaluated **from top to bottom**.\
The **first rule that matches** a URL is selected, and the chosen provider will handle the request.


# Custom cookies

Custom cookies can be useful in the following situations:

* Extracting data when product pages or prices are only available after logging in to the supplier’s website
* Changing the default currency or shipping address

### How to set custom cookies

1. Open the product page on the source website and configure all necessary settings (e.g., log in, select currency, set shipping address).
2. Refresh the page to ensure settings are applied.
3. Open your browser’s developer tools (usually by pressing **F12**).
4. Go to the **Network** tab.
5. Find and select the product URL in the left-hand panel.
6. In the right-hand panel, select the **Headers** tab.
7. Scroll down to the **Request Headers** section and locate the **Cookie** field.
8. Copy the full cookie string.
9. In the **EI Settings**, navigate to **Extractor > Settings > Custom Cookies**, and paste the cookie string for the appropriate domain.

<figure><img src="/files/t4O79KPohqhDhdtwZ4dQ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/0oA3LM4lRvWSPX6yq02q" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
**Notes:**

* ⚠️ Not all websites support cookie-based data extraction.
* ⏳ Cookies may expire over time. If extraction stops working, repeat the steps above to refresh your cookie settings.
  {% endhint %}


# General information

{% hint style="success" %}
For full compatibility, make sure you use the latest versions of the External Importer Pro and WooCommerce plugins.
{% endhint %}

{% embed url="<https://www.youtube.com/watch?v=GiUZF1U3bYM>" %}

After extracting products, you can easily import them to your WooCommerce catalog. You can do that in the following ways:

* Click Import next to the desired products.
* Import all selected products.
* Automatically import all extracted products.

![](/files/-MJI0PFX6_hA2oubGBUy)

### Import settings

You solely control what data to import and its volume. For settings, go to `External Importer > Settings > Import`.

![](/files/-MJI0rkuve0OFUy6O3nU)

### Product type

You can import the following products:

* External/Affiliate products
* Simple products

Grouped, Variable, Virtual, and other product types aren't supported. External/Affiliate products will be created by default. These products can't be added to the cart on your website. Instead, visitors will be redirected to external websites to make a purchase.

Simple products are suitable for creating your own store or a [dropshipping store](/monetization/dropshipping).

### Duplicates

To avoid adding duplicate products to your website, the plugin will check for duplicates by product URL.

![](/files/-MJI0kX51hu3jSAKIORt)


# Importing images and galleries

You can import product images in two ways:

1. **External URLs**\
   Reference images hosted elsewhere via their URLs.
2. **Local WordPress Library**\
   Download and store images in your WP Media Library.

<figure><img src="/files/5wMcCCcKReDIN5nxOINY" alt=""><figcaption></figcaption></figure>

#### Local Storage & Background Processing

* When you choose to **save images locally**, only the **main product image** appears immediately.
* **Gallery images** are fetched and saved in the background via a cron job.
* Admins will see a notification on the frontend if a product still has images queued for processing.
* The plugin processes **\~20 products every 5 minutes**.\
  → Make sure your cron system is running correctly if gallery images remain unprocessed for an extended period.

<figure><img src="/files/KWtM0OxDA9piVNOfDL6c" alt=""><figcaption></figcaption></figure>

#### External Gallery Limits

* External galleries support up to **9 additional** images per product.

**Troubleshooting**

* **Cron not running?**\
  Verify your server’s cron or WP-Cron setup.
* **Gallery images not extracted**\
  Not all shops provide product microdata for galleries. In this case, a custom parser will be required to scrape gallery images.

<figure><img src="/files/QcEHzYhB1hsuyf8VL2Ps" alt=""><figcaption></figcaption></figure>


# Currency

### Base currency

{% hint style="info" %}
WooCommerce allows only one base currency.
{% endhint %}

To set the currency for your store, go to `WooCommerce > Settings > General > Currency Options`.

Target websites may have prices in a different currency from your store's currency. If you import products as simple products, the plugin will try to **convert prices** to the default currency.

For External/Affiliate products, you can either convert prices or keep the original currency. For settings, go to `External Importer > Settings > Import > Currency`.

![](/files/-MJI37J0UystkXillSp1)

Selecting 'Add original' does not make your website multicurrency. This option only replaces the currency symbol on the frontend of your WooCommerce catalog. Since external products can't be added to the cart, this is usually sufficient.

### Automatic exchange rates

To convert currencies, External Importer will use [European Central Bank](https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html) exchange rates. This service doesn't require sign-up, but the set of currencies for which rates are provided is limited. If the desired currency is not listed, you can use Fixer.io as an alternative.

Fixer API has a free plan, but you have to [sign up](https://fixer.io/signup/free) to get your own API access key.

![](/files/-MJI4T98ElIFWWL6Aa8Q)

To set your key, go to `External Importer > Settings > General > Fixer API key`.

You can set the exchange rate manually. Add the following code to *functions.php* of your theme or child theme:

```php
function my_ei_currency_rate ($rate, $from, $to)
{
    if ($from == 'USD' && $to == 'KES')
        return 100.15; // <--- rate
    if ($from == 'KES' && $to == 'USD')
        return 0.01; // <--- rate
}
add_filter( 'ei_currency_rate', 'my_ei_currency_rate', 0, 3 );

```

### How to change the currency when extracting products

Some target websites display prices in different currencies based on the visitor's IP address (in this case, your server IP). For example, if your server is located in the United States, prices will usually appear in USD. However, many sites also allow you to manually set the currency in their settings.

![](/files/-MJI53i7WzhK8XNuBMcU)

To extract prices in a specific currency:

1. Visit the target website and manually set your desired currency and language.
2. Follow the [Custom Cookies Guide](/custom-cookies) to capture and apply the cookie settings.

This ensures that all requests are made with the appropriate currency preferences.

{% hint style="warning" %}
Note: This method doesn't work for all websites.
{% endhint %}

Some Chinese online marketplaces (such as bangproduct.com, geekbuying.com, and gearbest.com) also support changing the currency via the address bar. To do this, add the `currency=EUR` parameter to the product URL.

![](/files/-MJI6KjJraVxG0ynNhHr)


# Importing attributes

{% hint style="warning" %}
Product attributes are generally available for advanced parsers only.
{% endhint %}

![](/files/-MJLvQK8RjzSuVaFk80M)

By default, all attributes are added as **local attributes** and will display as the product specs list.

You may need to add some **global attributes**. To do so, go to `Products > Attributes` and create the desired global attributes before importing products.

{% hint style="info" %}
Global attributes are taxonomies, so don't create too many of them because they can significantly slow down your website.
{% endhint %}

Archive pages are available for global attributes. To filter products, you can also use WooCommerce widgets or plugins.

![](/files/-MJLwEvTxAkVvD4h3OoD)


# Auto import

{% embed url="<https://www.youtube.com/watch?v=yNiPBcTBjNw&t=6s>" %}

Auto import periodically checks the specified Listing URL and automatically imports new products to your website. Products are checked by URL. Pagination doesn't apply.

![](/files/-MJLwbidvOhYTYpnIhzr)

Bear in mind that only **new products** are imported when selecting a listing URL. For example, you can use a listing URL where products are sorted by the date they were added to the store. So new products will display at the top of the list.

![](/files/-MJLwqJFD66gLSvqdcXR)

\
Not all parsers support extracting products from listing pages. It's recommended to test the URL and your import settings on a manual product import page.


# Products limit

External Importer allows you to bulk import products. Some of our users may wonder, "*Why not make a website with 1 million products?*" That's a bad idea, and here's why.

* WordPress is not the most optimized platform. After a quick search, you'll notice multiple performance penalty reports when the website enlarges to thousands or tens of thousands of posts. WooCommerce will require additional resources because it's a WordPress add-in.
* Web parsing is not very suitable for large-scale data extraction. You may face [getting blocked](/extracting-products/how-to-avoid-getting-blocked), low data processing speed, and other obstacles.
* Having more products doesn't mean getting more search engine traffic. Google expects tons of incoming links to big websites. The chances are high that a huge website will be pessimized.

External Importer is the best choice for creating a **niche affiliate website** with **several hundred or several thousand products** and skillfully selected sections and products. We recommend splitting massive parts into separate domains because they're easier to administer and promote.

However, External Importer doesn't set strict limits, so if you need a bigger website, you can still do that. But please note that this may require a more powerful hosting, proxy rotation, and website optimization work.


# EAN import

### Native WooCommerce EAN

* Navigate to **External Importer > Settings > Import**.
* Activate the "Import GTIN/EAN" checkbox.
* This will import the EAN into the **GTIN, UPC, EAN, or ISBN** field in WooCommerce.

<figure><img src="/files/3OvKU9ajFQZtqkFqBp6l" alt=""><figcaption></figcaption></figure>

### Third-party EAN Plugins

* Install the **EAN for WooCommerce** plugin.
* The EAN will be stored in the product meta with the `_alg_ean` key.
* Go to **External Importer > Settings > Custom Fields** and configure the settings accordingly:

<figure><img src="/files/aEumPiaxY3hBG7pXM20W" alt=""><figcaption></figcaption></figure>

As a result, EANs will be imported into EAN for WooCommerce:

<figure><img src="/files/ZaKFDOqgDw755szAc5E4" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Please note that not all parsers have methods for getting EANs. [Custom parsers](/extracting-products/custom-advanced-parsers) may be required.
{% endhint %}


# General information

The External Importer plugin uses advanced AI technologies to rewrite existing content or generate new, unique content for the title, description, short description, and product reviews during the import process.

{% embed url="<https://youtu.be/7uoNGhOXyXI>" %}

### Supported providers

* [OpenRouter](/ai/openrouter-api)
* [OpenAI](/ai/openai-api)
* [Anthropic Claude](/ai/claude-api)

{% hint style="warning" %}
You need to set your own API key, and charges apply for using these AI models.

Please be aware that some models may be more expensive than others.
{% endhint %}

{% hint style="warning" %}
Our default prompts are tested with OpenAI GPT and Claude models. If you use other models via OpenRouter, the results may be unpredictable. In such cases, we recommend using custom prompts.
{% endhint %}

### How to activate AI features

To enable the AI rewrite features, navigate to `External Importer > Settings > AI`. Here, enter your API key and configure the desired settings for title and description generation to suit your content needs.

<figure><img src="/files/Ro8M2cZrgcIOmnf2zneA" alt=""><figcaption></figcaption></figure>

Once enabled, the AI settings are automatically applied to all products during the **manual import**.

You have the ability to temporarily disable the AI functions for imported products by unchecking the checkbox here:

<figure><img src="/files/0Ro8Dv5e8l2YMMFLs49K" alt=""><figcaption></figcaption></figure>

For [**Auto import**](/importing-to-woocommerce/auto-import), use the following option (disabled by default):

<figure><img src="/files/76NmnZwEaxsu0XSztuRw" alt=""><figcaption></figcaption></figure>

### Prompts

Various content creation options are accessible through the following prompts:

* Rewrite: Modify the original text to convey the same message in a different manner.
* Paraphrase: Express the same information with different wording.
* Summarize: Condense the content to highlight the key points.
* Translate: Convert the text from one language to another.
* Bullet Points: Organize information in a list format for clarity and conciseness.
* Turn into Advertising: Craft compelling advertising content for the product.
* Generate CTA Text: Create persuasive Call-to-Action text to drive user engagement.
* Craft a Product Description: Develop a detailed and appealing description of the product.
* Write a Few Paragraphs: Produce several paragraphs of content on the given topic.
* Write an Article: Compose an article related to the product.
* Write a How-to-Use Instruction: Provide clear and concise usage instructions for the product.
* Write a Review: Develop an insightful review based on the product’s reviews.
* Write a Buyer’s Guide: Create a helpful guide for prospective buyers.

{% hint style="success" %}
Also, the [custom prompts](/ai/custom-prompts) feature is available, allowing you to add any prompts of your own.
{% endhint %}

### Tips

It is advisable to align the title with the type of description text being generated. For instance, if you are generating a product review, it is recommended to select 'review' as the option for the title as well.

<figure><img src="/files/8AipE2o4gj3DFWd7KqLE" alt=""><figcaption></figcaption></figure>


# OpenRouter API

{% hint style="warning" %}
Our default prompts are tested with OpenAI GPT and Claude models. If you use other models via OpenRouter, the results may be unpredictable. In such cases, we recommend using custom prompts.
{% endhint %}

### **How to Obtain an OpenRouter API Key**

1. Create an [OpenRouter](https://openrouter.ai/) account or sign in.
2. Go to the **API Keys** page.
3. Click **"Create key"**, enter a name for the key, and save it.

### **How to Set OpenRouter Models**

{% hint style="warning" %}
By default, if no model is set, **'openrouter/auto'** will be used.
{% endhint %}

{% hint style="warning" %}
**Free limit**: If you are using a free model variant (with an ID ending in `:free`), then you will be limited to 20 requests per minute and 200 requests per day.
{% endhint %}

OpenRouter acts as a proxy and unified interface for 300+ paid and free LLMs, each with its own pricing and rate limits. [**Click here**](https://openrouter.ai/models) to view all available models.

1. Click **"Copy model ID"** for your chosen model.
2. Add the model ID in the **"OpenRouter Models"** field in the plugin settings.
3. You can set multiple model IDs, separated by commas. The plugin will prioritize them in order, using the first model first and others as fallbacks.

<figure><img src="/files/2lPLCs6XEcvjGP7I0w9E" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ufIeHMlzEc0aCOqEF56N" alt=""><figcaption></figcaption></figure>


# OpenAI API

### How to Obtain an OpenAI API Key

* Create an [OpenAI account](https://platform.openai.com/signup) or [sign in](https://platform.openai.com/login).
* Navigate to the [API key page](https://platform.openai.com/account/api-keys).
* Click "Create new secret key" and optionally name the key.

{% hint style="warning" %}
Please be aware that free trial accounts are subject to a low request limit of only 3 requests per minute. To **increase API limits**, top up your OpenAI balance with at least $5.
{% endhint %}

{% hint style="info" %}
OpenAI implements a usage-based charging model for access to its API. Be sure to monitor your account to keep track of your usage and manage costs effectively.
{% endhint %}


# Claude API

### How to Obtain a Claude API Key

1. If you don't already have an Anthropic account, visit the [Anthropic console](https://console.anthropic.com/) and create one.
2. Once your account is active, create your API key in the [API Keys](https://console.anthropic.com/settings/keys) section of your account.

{% hint style="warning" %}
Please note that Evaluation trial plans have a low request limit, allowing only 5 requests per minute. To increase your request capacity and use Claude in production, upgrade to the Build plan, which offers a significantly higher rate limit and allows you to add funds to your balance.
{% endhint %}

{% hint style="info" %}
Be sure to monitor your account to keep track of your usage and manage costs effectively.
{% endhint %}


# Custom prompts

{% hint style="warning" %}
This section is intended for advanced users who have expertise in writing Chat GPT prompts.
{% endhint %}

### Recommended placeholders

<table><thead><tr><th width="257">Content type</th><th>Placeholders</th></tr></thead><tbody><tr><td>Title generator</td><td>%title%, %lang%</td></tr><tr><td>Description/post generator</td><td>%title%, %description%, %description_html%, %lang%, %features%, %reviews%, %title_new%</td></tr><tr><td>Short description generator</td><td>%title%, %description%, %description_html%, %lang%, %features%, %reviews%, %title_new%, %description_new%, %description_html_new%, %short_description%, %short_description_html%</td></tr><tr><td>Reviews (comments) generator</td><td>%review%, %title%, %lang%</td></tr></tbody></table>

<figure><img src="/files/5YQQFuAesZ5WMy4GJQGF" alt=""><figcaption></figcaption></figure>


# General information

Keep your WooCommerce catalog up to date with automated price and stock synchronization. Learn how External Importer sync modes and controls work.

### Synchronizing products

External Importer can automatically update **prices** and **stock status** for imported products in your WooCommerce store.

You can configure synchronization at:\
**External Importer → Settings → Synchronization**

<figure><img src="/files/IFh5qw6cToKlqKlByw2g" alt="" width="563"><figcaption></figcaption></figure>

#### How synchronization works

Many online stores change prices and availability frequently.\
External Importer doesn’t provide *real-time* prices in your WooCommerce catalog, but it will periodically refresh product data based on your sync settings.

A few important points:

* **No real-time pricing**\
  External Importer updates products on a schedule, not instantly on every price change at the source.
* **Avoid too-frequent updates**\
  If you sync very often – especially for many products from the same store – you increase the risk of being throttled or blocked by that source.\
  We recommend using a **moderate update interval**, not the shortest possible one.
* **Show last update date on the frontend (optional)**\
  You can display when a product was last updated on the product page.\
  Go to: **External Importer → Settings → Frontend → Update period** and enable the option.

<figure><img src="/files/DbgG2b4ZeNsQwvMZjBX6" alt="" width="563"><figcaption></figcaption></figure>

#### Synchronization modes

<figure><img src="/files/0DcvTvkwFg6HvacE0C6C" alt="" width="563"><figcaption></figcaption></figure>

External Importer offers two ways to update products:

**1. Frontend synchronization**

When **Frontend synchronization** is enabled, a product can be updated **when a visitor opens its product page**.

**Pros:**

* Only products that actually receive traffic will be updated.
* Reduces unnecessary requests for products that nobody views.

**Cons:**

* Occasionally, visitors may notice a **slight delay** when loading the product page, while new data is being requested from the source.

**2. Cron synchronization (recommended for background updates)**

With **Cron synchronization**, External Importer runs a scheduled sync in the background using the built-in **WordPress cron** system.

* **No additional cron setup is required.**
* The sync script is launched approximately every **10 minutes**.
* Under typical conditions, it can update up to **2,500 products per day** (depending on your hosting and source throttling).

This mode keeps your catalog updated **without impacting page load time** for visitors.

#### Per-product sync controls

You can control synchronization for each product individually on the product edit screen.

<figure><img src="/files/6AHgRUBp6GSrwUvWXYa2" alt=""><figcaption></figcaption></figure>

On the **product edit page**, look for the **External Importer Sync** meta box (sidebar):

* **Last update & status**\
  You’ll see the **last synced time**, current **availability**, and sync **status** (success/error).
* **Manual update (“Sync now”)**\
  Click **Sync now** to immediately refresh this product’s data from the source.
* **Disable automatic sync for a product**\
  If you don’t want External Importer to update a specific product automatically:
  1. Open the product in the editor.
  2. In the **External Importer Sync** widget, enable **“Disable auto-sync”**.
  3. The product will **no longer be included** in automatic synchronization, but you can still use **Sync now** at any time.

This is useful when you’ve manually edited a product and don’t want your changes to be overwritten.

<figure><img src="/files/7flVhO2iLdJI0KbefXQ4" alt=""><figcaption></figcaption></figure>


# Out of Stock products

{% hint style="info" %}
Stock status updates aren't available for all [structured parsers](/extracting-products/supported-stores#structured-data-parsers).
{% endhint %}

To select actions for out of stock products, go to `External Importer > Settings > Synchronization`.

![](/files/-MJM1VpRfa5qCbT_WBWi)

By default, WordPress doesn't delete attached files from the media library when a product is deleted. You can enable the option '`Delete attached media`' to delete images and galleries automatically. Make sure you don't use these media resources in other posts or for other products.

![](/files/-MJM1jZP9g5Ub10fNLic)

You can check the current status for the External type only on the product edit page.

<figure><img src="/files/VRT5NBQVMbMVv1IvQ2ck" alt=""><figcaption></figcaption></figure>


# Why prices don't update

If you've noticed that product prices in your store differ from the target website, don’t worry—this is **usually expected behavior**. Real-time price updates are not possible when using web scraping methods. Some stores frequently change their prices, while External Importer syncs products on a set [schedule](/synchronizing-products/general-information).

If you suspect that prices are not updating as they should, follow these steps to identify and resolve the issue.

### Troubleshooting Steps

#### 1. Check the Last Synced Date

* Navigate to the **product edit page**.
* Locate the **External Importer Sync** widget in the right sidebar.
* Verify the **Last synced** date.
* If needed, manually trigger a synchronization by clicking **Sync now**.

<figure><img src="/files/byB1hbHLgUwBQhAq8s32" alt="" width="563"><figcaption></figcaption></figure>

#### 2. Review Synchronization Settings

* Go to **External Importer > Settings >** [**Synchronization**](/synchronizing-products/general-information).
* Confirm that **Price synchronization** is enabled.
* Check your **Update period** settings to ensure they match your expectations.

<figure><img src="/files/BKMwIl1WcJJNzsUb34yL" alt="" width="563"><figcaption></figcaption></figure>

#### 3. Verify if the Source Domain is Throttled

If the source website is throttling requests, price updates may be delayed.

* Go to **External Importer > Settings > Extractor**.
* Check for messages about:
  * **Exceeding the daily request limit**.
  * **Too many consecutive errors**.
* You can adjust or disable limits to improve synchronization.
* Visit **External Importer > Logs** to check for errors related to throttling.

<figure><img src="/files/l6XikeYeKRMouBCAPIop" alt="" width="368"><figcaption></figcaption></figure>

<figure><img src="/files/NajsG1t2J1vXpgS5diXA" alt=""><figcaption></figcaption></figure>

![](/files/-MJM4JHT1rac0wVN9Ajc)

#### 4. Check for HTTP Errors and IP Blocking

* In the **Product Synchronization** widget, look for HTTP-related error messages.
* If your **server IP is blocked** (you will see errors like **503** or **403**) by the source website:
  * Consider activating a [**scraping service**](/extracting-products/crawling-services) to bypass restrictions.
  * Try extracting the product using **External Importer > Import Tool** to get more details about potential scraping issues.

<figure><img src="/files/FEmImaTbl2PiA0zhz678" alt="" width="336"><figcaption></figcaption></figure>

<figure><img src="/files/WGP8JD4b0nlDYV56ULyL" alt="" width="563"><figcaption></figcaption></figure>

#### 5. Test Synchronization with Different Methods

If you are using **Cron synchronization**:

* Switch to **Frontend synchronization** and refresh the page.
* If the price updates successfully, Cron may not be working correctly.

<figure><img src="/files/sWn31CjFfFzqZ3QX1LW7" alt=""><figcaption></figcaption></figure>

To fix potential Cron issues:

* Go to External Importer > Settings > Synchronization and **re-save your settings** to restart all scheduled tasks.
* Please install a cron manager plugin such as [WP Crontrol](https://wordpress.org/plugins/wp-crontrol/) to check and manage scheduled tasks. Then go to **Tools > Cron Events**, locate the “**ei\_sync\_products**” task, and confirm that it is running on time and not overdue.
* Ensure your website has **regular traffic**, as WordPress cron tasks rely on visitor activity.
* If your website has low traffic, set up a **real Cron job** on your server to ensure scheduled tasks run consistently. Contact your hosting provider for assistance.

#### 6. Understand Cron Synchronization Limits

* The synchronization script runs **every 10 minutes**.
* It can update **up to 2,500 products per day**.
* If you have a large inventory, consider adjusting your synchronization strategy.


# Creating affiliate links

Use this guide to turn ordinary product URLs into revenue-generating affiliate links.

{% hint style="success" %}
**AI Helper: Generate Your Deeplink Automatically**

You can now use our **specialized GPT assistant** to generate correct Deeplink templates.

👉 [Open Deeplink Setup GPT](https://chatgpt.com/g/g-6911df85b340819188ccf04452586c6e-deeplink-setup-for-content-egg)

Simply:

1. Paste your sample affiliate link(s) from your network dashboard.
2. The assistant will detect your format and build a proper Deeplink template for External Importer.
3. Copy the suggested template into your **Deeplink Settings**.
   {% endhint %}

### 1. Start with Clean, Direct URLs

Import products **without** any affiliate parameters. External Importer will handle the tracking bits later.

> **Tip**: You don’t have to join affiliate programs up front. Your site will work fine with direct links; you can add monetization once you’re approved by an advertiser or network.

<figure><img src="/files/TYsg7VhAOnEOqOWX6s7u" alt=""><figcaption></figcaption></figure>

### 2. Add New Domains

1. **Automatic** – Every time you import a product from a new domain, that domain is added to\
   **External Importer → Settings → Deeplinks**.
2. **Manual** – To add merchant domains manually, go to the same page and enter them yourself.

![](/files/-MJMBbnQ3SmM7hiv5IRM)

### 3. Choose a Link-Building Method

Affiliate programs fall into two broad categories. Configure each domain accordingly:

| Method                        | Used by                                                         | How It Works                                                                                               | What You Configure                                              |
| ----------------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
| **A. Deeplink (redirect)**    | Most affiliate networks (Admitad, AWIN, Impact, etc.)           | Visitor hits the network’s tracking URL → network records the click → visitor is redirected to the product | A single **Deeplink template**                                  |
| **B. Affiliate-ID parameter** | Direct programs (Amazon Associates, eBay Partner Network, etc.) | Your unique ID is appended to the product URL; no extra redirect                                           | The **parameter name** (e.g., `tag=`) and your **affiliate ID** |

### 4. Set Up Deeplinks (Redirect Method)

1. Generate a valid affiliate link for any non-homepage product in your network panel.

   ![](/files/-MJMCZFMrAJAq21IwJft)

   Example:

   ```
   https://ad.admitad.com/g/383ee6455773fd57830a7d95a12660/?ulp=https%3A%2F%2Fwww.lightinthebox.com%2Fen%2Fp%2Fkids-girls-rainbow-dress-purple_p7923807.html
   ```
2. Replace the encoded product part with the template token:

   ```
   https://ad.admitad.com/g/383ee6455773fd57830a7d95a12660/?ulp={{url_encoded}}
   ```
3. Paste this template into **Deeplink** for the corresponding domain.

   ![](/files/-MJMCoxuiXHoRcM4fBW-)

**Template tokens you can use**

| Token                                              | Replaced with                      |
| -------------------------------------------------- | ---------------------------------- |
| `{{url_encoded}}`                                  | Percent-encoded product URL        |
| `{{url}}`                                          | Plain (unencoded) product URL      |
| `{{post_id}}`, `{{author_id}}`, `{{author_login}}` | Useful sub-IDs for tracking clicks |

> **Verify**: Refresh a product page on your site, click its button, and confirm the redirect lands on the correct product page.

### 5. Set Up Affiliate-ID Parameters (Direct Method)

Some affiliate programs—like **Amazon Associates**—don’t use redirects. Instead, they rely on a tracking **parameter** directly in the product URL.

#### Correct Setup (Example: Amazon)

Affiliate link example:

```
https://www.amazon.com/dp/B07XKF5RM3/?tag=yourtag-20
```

Breakdown:

* **Parameter name:** `tag=`
* **Affiliate ID:** `yourtag-20`

![](/files/-MJMajTyq4t7OjF5ZEUi)

In **Deeplinks settings** for Amazon (or any similar domain):

**Enter the full parameter:**

```
tag=yourtag-20
```

This includes both:

* The **parameter name** (`tag=`)
* Your **unique ID** (`yourtag-20`)

External Importer will automatically insert it into the correct place in all product URLs from that domain.

![](/files/-MJMayR01F1X83vSEQ0I)

#### Common Mistakes (Don't Do This)

The following inputs are incorrect or discouraged:

| Incorrect Input   | Why it’s wrong                                                  |
| ----------------- | --------------------------------------------------------------- |
| `yourtag-20`      | ❌ Missing parameter name                                        |
| `?tag=yourtag-20` | ❌ Do not include `?` — it will be added automatically if needed |
| `&tag=yourtag-20` | ❌ Do not include `&` — External Importer handles it             |

> Even though External Importer may try to correct these, always use the clean `param=value` format for best results.

### 6. Edit Anytime, Track Instantly

External Importer rewrites links on the fly. Change your Deeplink or ID settings whenever you:

* Switch affiliate networks
* Update to a new tracking ID

After each change, check your network’s reporting panel to ensure clicks are being registered.


# Dropshipping

Dropshipping is a retail model in which the store doesn't have its own inventory. When a product is ordered in your online store, you buy it from a third-party vendor and send it directly to the customer.

External Importer offers default features to create a Dropshipping store on WooCommerce:

* Import products from various eCommerce stores to your WooCommerce store. Note that Variable Products are currently not supported.
* Automated price and stock update.
* Flexible Pricing rules to set your margin.

Select *Simple* as the product type in the Import settings to allow products to be added to the cart on your website.

![](/files/-MJMbXP5zuD2U0JMUSBi)

To set margin rules, go to `External Importer > Settings > Dropshipping`. These rules must be configured before you import products to your website. The new markup will be applied when updating prices.

You can set different values for every domain and price range. The rules are processed from top to bottom.

{% hint style="info" %}
Only the first rule that meets all criteria will be applied, so set custom rules at the head and default rules at the end of the list.
{% endhint %}

![](/files/-MJMbn1NvKXKuz-whhC3)


# General information

External Importer works with any WooCommerce-compatible themes. That means your website's appearance depends on your theme. To enable some additional useful features, go to `External Importer > Settings > Frontend`.

![](/files/-MJMcHQSIxhq3MDJkb6_)


# Translation

For quick and simple frontend localization, all strings are available in the plugin settings.

Go to: **External Importer > Settings > Frontend > Translation**.

<figure><img src="/files/uOy6V3iHoW0pgHPOqmXF" alt=""><figcaption></figcaption></figure>


# Checkout on Amazon Feature

Let visitors add Amazon products to a WooCommerce cart, then complete payment on Amazon. Your site stays “local” (no visible affiliate links for Google), while your Associate Tag is applied on Amazon.

Check this video guide for a very similar feature in the Content Egg plugin:

{% embed url="<https://www.youtube.com/watch?v=KcYtCWcSUCQ>" %}

#### Activate

1. **Use a Simple WooCommerce product**
   * This feature works only with **Simple** products (not **External/Affiliate** products).
   * Go to **External Importer → Settings → Import → Product type** and select **Simple/Variable Product**.
2. **Enable the Amazon checkout button**
   * Go to **External Importer → Settings → General**
   * Set **Amazon Checkout Button** to **Enable Amazon checkout button**.
3. **Customize button text (optional)**
   * Go to **External Importer → Settings → Frontend → Frontend Texts**.
4. **Set your Affiliate ID (Associate Tag)**
   * Go to **External Importer → Settings → Deeplinks**
   * Add your parameter, for example: `tag=yourid-20`

#### How it works

1. Customer adds Amazon items to your **WooCommerce cart**.
2. On the **cart page**, the default WooCommerce checkout button becomes **“Checkout on Amazon”**.
3. Clicking it redirects to Amazon’s **“Add to Shopping Cart”** confirmation page.
4. Customer clicks **Add to Cart** on Amazon → items go into their Amazon cart and your **Associate Tag** is applied automatically.

<figure><img src="/files/opnY8tslf04kKqpIQXhR" alt=""><figcaption></figcaption></figure>

#### Tips

* Don’t mix products from different Amazon locales (e.g., `amazon.com` and `amazon.de`) in the same WooCommerce cart.
* If the cart contains **Amazon + non-Amazon** items, **only Amazon items** are sent to the Amazon cart.


# Affiliate Egg plugin

If you have our other plugin, [Affiliate Egg Pro](https://www.keywordrush.com/affiliateegg), installed on your website, External Importer can use AE parsers to extract products. It refers to both default and custom AE parsers.

To enable this feature, go to `External Importer > Settings > Extractor > Affiliate Egg integration`

![](/files/-MJMcwfuM0DcPEKu_Y5V)


# Content Egg plugin

You can use External Importer to initialize WooCommerce products and [Content Egg Pro](https://www.keywordrush.com/contentegg) plugin to add:

* Additional relevant content (video reviews, photos, news).
* Product blocks (accessories or related products).
* Price comparison blocks.

This makes your website more professional, unique, and useful for visitors. But some features of both plugins may conflict with each other.

When using both plugins together, disable [automated synchronization](https://ce-docs.keywordrush.com/integrations/woocommerceintegration#product-synchronization) with WooCommerce in the Content Egg settings, and don't use manual synchronization.

<figure><img src="/files/rz2ytgl58rKLuMlRIWwt" alt=""><figcaption></figcaption></figure>

Disable *Update Date Display* by going to `Content Egg > Settings > WooCommerce`.

<figure><img src="/files/XaasV11Viyz5te4rq3RJ" alt=""><figcaption></figcaption></figure>

### How to add Content Egg products automatically

If you import products from Amazon, eBay or Aliexpress, you can add **the same products** to the appropriate CE modules automatically. In this way, you can for example add price alert/history features for WooCommerce products.

Use the following settings for this (`External Importer > Settings > Import`):

![](/files/UuA9NCD1LS5KKG1TnLqv)

This will add product IDs as [auto-update keywords](https://ce-docs.keywordrush.com/updating-products/updating-the-product-list). When you first open product pages, the appropriate CE products will be found through APIs.

![](/files/yM8fObGwrM4cvrJv4ZPB)


# External Importer VS Content Egg VS Affiliate Egg

External Importer, Content Egg, and Affiliate Egg all add affiliate products to WordPress — but they differ on two things: **where the products go** (a WooCommerce catalog or blog posts) and **how they get the data** (an official API, or by reading the store's own pages). This page helps you pick the right one.

## At a glance

|                       | External Importer                                                         | Content Egg                                             | Affiliate Egg                                                      |
| --------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------ |
| **Where products go** | WooCommerce products                                                      | Blog posts (blocks/shortcodes); can sync to WooCommerce | Blog posts (blocks/shortcodes)                                     |
| **How it gets data**  | Web parser — no API                                                       | Official APIs + CSV/XML feeds                           | Web parser — no API                                                |
| **Finding products**  | Product & listing URLs                                                    | Keyword search                                          | Product & listing URLs                                             |
| **Store coverage**    | Almost any store; full product data from advanced parsers on popular ones | Merchants with a module or feed                         | Almost any store; a custom parser for richer data or tricky stores |
| **Best for**          | Niche WooCommerce affiliate catalogs                                      | Review blogs, price-comparison & deals sites            | Product blocks in posts; data source for Content Egg               |

## Which should you use?

* **External Importer** — you're building a **WooCommerce catalog** of affiliate products.
* **Content Egg** — you're writing **posts or reviews** and want keyword search, price comparison, and official APIs/feeds across many networks.
* **Affiliate Egg** — you want product blocks in posts from **stores that have no API or feed** — and to feed those stores into Content Egg.

They aren't mutually exclusive — many sites run two or all three together (see [Using them together](#using-them-together)).

## The three plugins in detail

### External Importer Pro

* Does not require access to the API. Extracts data directly from store websites.
* Has a fixed set of [advanced parsers](https://www.keywordrush.com/ei-advanced) that can extract complete product data (attributes, description, images, reviews).
* Has generic [structured parsers](/extracting-products/supported-stores) that can retrieve data from 75-85% of random eCommerce websites.
* Only works with WooCommerce. It also offers a user-friendly interface to quickly auto import to WooCommerce.
* Can import both individual products by URL and products from listing pages.
* Offers auto import, which can import new products from listing pages to your website.
* Is the best choice for creating niche **affiliate catalogs on WooCommerce**.
* Offers AI features to craft unique product content.

### Content Egg Pro

* Works via official Product APIs and has a large number of modules for [various affiliate networks](https://www.keywordrush.com/contentegg#supported-modules).
* Requires you to search for products by keyword.
* Has modules to add additional relevant content (images, videos, news, etc.).
* Can handle CSV and XML feeds.
* Offers autoblogging based on keywords.
* Can synchronize with WooCommerce.
* Lets you add many products to one post.
* Allows you to display products via shortcodes. It also includes various display templates.
* It's the best choice for **product review blogs, price comparison websites**, daily deals websites.

### Affiliate Egg Pro

* Works as a web parser; no API access required.
* Reads almost any online store — no fixed list of supported shops; some stores may need a [custom parser](https://ae-docs.keywordrush.com/supported-shops-and-custom-parsers/customparsers).
* Extracts products by product direct URL or listing URLs.
* Doesn't support WooCommerce (possible via [integration with Content Egg](https://ce-docs.keywordrush.com/modules/affiliate-egg-integration)).
* Lets you connect **Affiliate Egg stores as separate modules in the Content Egg plugin**.
* The best choice is to embed product blocks in a blogpost and as a data source for the Content Egg plugin (to support stores without an API).

## Using them together

Many clients combine the plugins to build a site more effectively:

1. **External Importer**: Quickly initialize a WooCommerce catalog, including an image gallery, specifications, and a unique description/short description using AI functions. Note that for full product data such as specifications and galleries, a [custom parser](/extracting-products/custom-advanced-parsers) may be required.
2. **Content Egg**: Add price comparison blocks.
3. **Affiliate Egg**: [Connect your merchants as separate Content Egg modules](https://ce-docs.keywordrush.com/modules/affiliate-egg-integration) with Affiliate Egg — by domain, adding a custom parser only if a store needs one — especially when Content Egg doesn't support a merchant by default.


# Useful hooks

### How to Enable This Filter

To enable these filters, **paste the code into the `functions.php` file of your active theme** (preferably a **child theme**) by following these steps:

* Go to **Appearance → Theme File Editor** in your WordPress dashboard,\
  or access the file via **FTP / file manager**.
* Open the `functions.php` file.
* Paste the code at the bottom of the file and save.

*Using a child theme is recommended to avoid losing changes during theme updates.*

### Disabling synchronization for selected products

To disable synchronization for selected products, add the following to the functions.php file of your theme:

```php
add_filter('ei_disable_sync_product_ids', 'my_ei_disable_sync_product_ids');
function my_ei_disable_sync_product_ids() {
    return array(111, 222, 333, 444);
}
```

Replace 111, 222, 333, 444 with the actual product IDs.

### Enabling synchronization only for selected products

```php
/**
 * Only sync products 101, 202 and 303.
 *
 * @param int[] $ids  Current list of IDs to sync (empty by default).
 * @return int[]      Filtered list of IDs to sync.
 */
add_filter( 'ei_enable_sync_product_ids', function( $ids ) {
    // Override any existing list—only these three will be synced.
    return array( 101, 202, 303 );
} );

```

```php
/**
 * Enabling synchronization only for products in a specific category.
 *
 * @param int[] $ids  Current list of product IDs to sync (empty by default).
 * @return int[]      Product IDs belonging to the 'featured-products' category.
 */
add_filter( 'ei_enable_sync_product_ids', function( $ids ) {
    // You can change 'featured-products' to any category slug
    $category_slug = 'featured-products';

    // This runs on every sync, so for large catalogs, consider caching the IDs
    $products_in_category = get_posts([
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'tax_query'      => [
            [
                'taxonomy' => 'product_cat',
                'field'    => 'slug',
                'terms'    => $category_slug,
            ],
        ],
    ]);

    return $products_in_category;
} );

```

### **Allowing HTML and images in product descriptions**

To disable description sanitization and include all images and HTML formatting from the source site, add the following to the functions.php file of your theme:

```php
add_filter('cegg_description_sanitization', '__return_false');
```

### Import domain as brand taxonomy

For the Rehub theme only, to import the domain as the "brand" taxonomy, add the following to your functions.php file:

```php
add_filter('ie_import_brand', '__return_false');
add_filter('ie_import_store', '__return_true');
```

### Custom parameters for scraping services

```php
// Add country_code parameter to ScraperAPI requests
add_filter('ei_parse_url_scraperapi', 'my_ei_parse_url_scraperapi', 10, 1);
function my_ei_parse_url_scraperapi($url) {
    return add_query_arg('country_code', 'de', $url);
}

// Add country parameter to ScrapingDog requests
add_filter('ei_parse_url_scrapingdog', 'my_ei_parse_url_scrapingdog_country', 10, 1);
function my_ei_parse_url_scrapingdog_country($url) {
    return add_query_arg('country', 'de', $url);
}

// Add dynamic parameter to ScrapingDog requests
add_filter('ei_parse_url_scrapingdog', 'my_ei_parse_url_scrapingdog_dynamic', 10, 1);
function my_ei_parse_url_scrapingdog_dynamic($url) {
    return add_query_arg('dynamic', 'true', $url);
}

// Add premium parameter to ScrapingDog requests
add_filter('ei_parse_url_scrapingdog', 'my_ei_parse_url_scrapingdog_premium', 10, 1);
function my_ei_parse_url_scrapingdog_premium($url) {
    return add_query_arg('premium', 'yes', $url);
}
```


# Custom parsers

You can create custom advanced parsers if you have the necessary technical skills. Note that this section is intended for developers. We don't provide support for customization tasks, but we do offer services on [custom advanced parsers development](/extracting-products/custom-advanced-parsers).

### Debug mode

Before getting started with the new parser, we recommend enabling debug mode for the External Importer. To do so, add the following line to your *wp-config.php*:

```php
define('EXTERNAL_IMPORTER_DEBUG', true);
```

In this mode, some helpers will be enabled to debug your parser:

* Parsing task quick restart button
* Names of parsers used
* Raw product data

![](/files/-MJMfSHwJ3VC9H171Xn3)

In *debug mode*, **caching of all requests** to external websites is enabled. It allows External Importer to skip making many new requests when debugging the parser. You can also check the page returned to the plugin bot.

All temporary cache files are stored in `wp-content/uploads/ei-debug/`.

![](/files/-MJMg2Z1ZqpwSpKaofHI)

After the parser is finished, remember to disable debug mode and manually delete `wp-content/uploads/ei-debug/` directory with all temporary files.

### Creating a parser

All custom parsers must be stored in `wp-content/ei-parsers/`. Create this directory if you don't have one. Never directly edit plugin files. Otherwise, you risk losing all changes with the next plugin update.

Let's say we want to create a parser for <https://www.example.com>.

1\. Create a file named *ExamplecomAdvanced.php* in `wp-content/ei-parsers/`.

2\. Create a class named *ExamplecomAdvanced* that extends *AdvancedParser*.

3\. Use namespace, enter the domain name in the comments block, as shown in the following example.

```php
<?php
namespace ExternalImporter\application\libs\pextractor\parser\parsers;

/*
 * URI: https://www.example.com
 */

class ExamplecomAdvanced extends AdvancedParser {
    
}
```

4\. Now you need to implement methods to extract product data from the target website:

`parseLinks()`

`parsePagination()`

`parseTitle()`

`parseDescription()`

`parsePrice()`

`parseOldPrice()`

`parseImage()`

`parseImages()`

`parseManufacturer()`

`parseInStock()`

`parseCategoryPath()`

`parseCurrencyCode()`

`parseFeatures()`

`parseReviews()`

We recommend studying the implementation of the ready parsers in `external-importer/application/libs/pextractor/parser/advanced/parsers/`

In most cases, you'll use XPath requests:

```php
$this->xpathScalar($xpath); 
$this->xpathArray($xpath);
```

If you need to use regular expressions, this is how to access the HTML source:

```php
preg_match($regex, $this->html, $matches);
```

Advanced parsers have priority when extracting data, but you can implement only a few methods if some data can be extracted through default structured parsers.

### Variations

To add support for variations, implement the `parseVariations()` method as shown below:

```php
public function parseVariations()
{
    $variations = [];

    // Variation 1
    $v = new \ExternalImporter\application\libs\pextractor\parser\Variation;
    $v->attributes = [
        ['name' => 'Size', 'value' => 'S'],
        ['name' => 'Color', 'value' => 'Red'],
    ];
    $v->sku = 'SKU111';
    $v->price = 123.99;
    $v->image = 'https://m.media-amazon.com/images/I/61He0SxcS2L._AC_SX679_.jpg';
    $v->inStock = true;
    $v->availability = 'OutOfStock';
    $v->stockQuantity = 10;
    $v->gtin = 'GTIN1';

    $variations[] = $v;

    // Variation 2
    $v = new \ExternalImporter\application\libs\pextractor\parser\Variation;
    $v->attributes = [
        ['name' => 'Size', 'value' => 'M'],
        ['name' => 'Color', 'value' => 'Blue'],
    ];
    $v->sku = 'SKU222';
    $v->price = 345.99;
    $v->image = 'https://m.media-amazon.com/images/I/713uxj6JdYL._AC_SX679_.jpg';
    $v->inStock = true;
    $v->availability = 'InStock';
    $v->stockQuantity = 20;
    $v->gtin = 'GTIN2';

    $variations[] = $v;

    return $variations;
}
```

This method returns an array of `Variation` objects. Only the `attributes` field is required.


