# 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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJVnPyA4EtV11GKJMQF%2F-MJVnRUSDJ-ws__XTp0a%2Fimage.png?alt=media\&token=7136b1f6-7299-4d1c-9810-63ef907c947c)

### 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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHqOifXFo3at21PbnI%2F-MJHs-3aWmVCvUqvaRSn%2Fexternal-importer-1.png?alt=media\&token=60011f9f-36f4-47fa-8060-cef205c71b0f)

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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHsSq9uCA5LY3kYQrD%2F-MJHslm52dxtMoZMD7Jq%2Fexternal-importer-2.png?alt=media\&token=a53be816-3b84-449e-a394-7b4773830247)

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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHsSq9uCA5LY3kYQrD%2F-MJHt7go_iM1DiNnPGBa%2Fexternal-importer-3.png?alt=media\&token=62528c28-36c9-4123-a6f3-4828ff96c025)

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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHtXclLpRkNjvL82-P%2F-MJHtbJ2WYNWo2qS_egE%2Fexternal-importer-4.png?alt=media\&token=327980a9-1273-482f-907e-a79e0d780e7f)


# 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

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHvIHbU0nzolow6JMj%2F-MJHvNzolD2Wp3BACfdS%2Fexternal-importer-5.png?alt=media\&token=4dab4ef4-1450-472c-9e64-10c81b52e378)

These parsers usually also support:

* Listing pages
* Automatic pagination

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHvZxDUsu-1kuaj4cB%2F-MJHveMnFGBZx7UQ_-JU%2Fexternal-importer-6.png?alt=media\&token=c42c7d90-3dd4-4ae1-a35e-b7eaf3aa13d9)

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…

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHws-QGjGxkL6XYONs%2F-MJHx6neLeCv88BHHbhn%2Fexternal-importer-7.png?alt=media\&token=e0fa5700-99cd-4f8e-816a-903e28a860cb)

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

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHws-QGjGxkL6XYONs%2F-MJHwvh7qCoAEodSHew7%2Fexternal-importer-7-a.png?alt=media\&token=ef0c7690-d9d5-4c0d-8385-ae36db00ab98)

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

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHws-QGjGxkL6XYONs%2F-MJHxbC2IB6-kLnpTvir%2Fexternal-importer-8.png?alt=media\&token=d9608e30-feaa-4c2c-8f88-a392cbc2caf2)

### **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`.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHz1DuNuexmGST3Nv7%2F-MJHzhzffekgFHdvkoVd%2Fexternal-importer-10.png?alt=media\&token=81b3db90-4d66-46a2-9cfb-9f5fcabc7169)

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:

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHz1DuNuexmGST3Nv7%2F-MJHzuATgl_jb_qWy2hK%2Fexternal-importer-11.png?alt=media\&token=c00602c6-f40f-412b-a451-a00178a6e93f)

What else can you do to avoid getting blocked?

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

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHz1DuNuexmGST3Nv7%2F-MJI-ECmy49ObDfVa1uU%2Fexternal-importer-12.png?alt=media\&token=f90c78ad-b34f-49b1-a90f-13c898dd545f)

### 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

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJHz1DuNuexmGST3Nv7%2F-MJI-7Y0BA5SARE9Qs3Y%2Fexternal-importer-12-a.png?alt=media\&token=f2de2117-f9ab-4534-9141-e43453cd8308)

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)
* [Bright Data](https://www.keywordrush.com/go/brightdata)
* Crawlbase
* Decodo

{% hint style="warning" %}
These services are paid. See free-tier and pricing details below.
{% endhint %}

### Scraping Service Pricing

| Service         |              Free Usage | Free Allowance Renews? | Minimum Paid Plan |       Pay-as-you-go      |
| --------------- | ----------------------: | :--------------------: | ----------------: | :----------------------: |
| **ScraperAPI**  |           1,000 credits |        ✅ Monthly       |         $49/month |             ❌            |
| **ScrapingDog** |             200 credits |        ✅ Monthly       |         $40/month |        ✅ From $10        |
| **ScrapeOwl**   |           1,000 credits |       ❌ One-time       |         $29/month |             ❌            |
| **Decodo**      | 2,000 standard requests |        ✅ Monthly       |         $19/month |             ❌            |
| **Crawlbase**   |     1,000–5,000 credits |       ❌ One-time       |         $99/month |     ✅ $0 monthly fee     |
| **Bright Data** |          5,000 requests |        ✅ Monthly       |        $499/month | ✅ $1.50 / 1,000 requests |

**Notes:**

* **ScraperAPI:** Standard requests normally cost 1 credit, but difficult websites may consume more — Amazon specifically uses 5 credits per request.
* **ScrapingDog:** The free plan includes 200 monthly credits. Pay-as-you-go credits can be purchased without a monthly subscription.
* **ScrapeOwl:** 1,000 free credits are provided when you create an account; they do not appear to renew monthly.
* **Decodo:** The free plan provides up to 2,000 standard requests per month. Premium proxies and JavaScript rendering consume the allowance faster.
* **Crawlbase:** New accounts receive 1,000 free credits and can unlock up to 5,000 initial credits. After that, you can continue with pay-as-you-go without a subscription. Only successful requests are billed.
* **Bright Data:** The free tier includes 5,000 requests every month. After the free allowance, Web Unlocker can be used on a pay-as-you-go basis at $1.50 per 1,000 successful requests.

*Pricing and terms can change at any time — always verify current details directly on each provider's website.*

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FxHV95h1nehXFMUe5YabP%2Fimage.png?alt=media&amp;token=f9922192-9a18-4b3d-8e78-669f9754bd6e" 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
   * **Bright Data** also needs a **zone** name from your Bright Data control panel. Click **Test connection** next to the zone field to check your key and list your account's active zones.

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

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FfUyq5IOQhAXfRwGptrU6%2Fimage.png?alt=media&amp;token=1326d017-4830-4252-9bfe-423d0bdd2fa9" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FJYdnFHmPoGNXRAfAuaM8%2Fimage.png?alt=media&amp;token=5411c9d0-963d-45a2-8735-37551d850dbd" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FjP7qnw501zqVzyLmsWbq%2Fimage.png?alt=media&amp;token=d22f4ede-8197-42dd-92eb-1ad940c8f985" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2F6IL8kHaw4IwmyDi4ENRv%2Fimage.png?alt=media&amp;token=2706d224-927b-4408-b3f2-e36edc37084c" 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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJI0-Bh6-WtM-66_1nt%2F-MJI0PFX6_hA2oubGBUy%2Fexternal-importer-14.png?alt=media\&token=621b3a98-e558-4d23-a703-61f4a9fd6612)

### Import settings

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

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJI0-Bh6-WtM-66_1nt%2F-MJI0rkuve0OFUy6O3nU%2Fexternal-importer-16.png?alt=media\&token=8d47c480-b092-43d5-ae4a-48f2c39c23c0)

### 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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJI0-Bh6-WtM-66_1nt%2F-MJI0kX51hu3jSAKIORt%2Fexternal-importer-15.png?alt=media\&token=2d65f93b-cd80-4ede-a854-c74920ff0a6d)


# 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FlTjN3XS2ZfCroI6NuiDC%2Fimage.png?alt=media&amp;token=25717ff0-03b0-4763-a404-0391ac3cf58d" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FP5XjPjUJuYjSizO3ZP99%2Fimage.png?alt=media&amp;token=53a5a025-7262-4051-a569-bb3949ee9705" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FRwFjbTWndPwttO9Vw0JP%2Fimage.png?alt=media&amp;token=cf3bf66c-4850-4831-b6d4-7c7b4fbf0b4b" 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`.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJI32ltNvgdwcSL8sjW%2F-MJI37J0UystkXillSp1%2Fexternal-importer-20.png?alt=media\&token=dafff7bc-7eb8-4b5f-bcc4-a607f6f5430a)

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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJI4NYOdifOrjXgzBta%2F-MJI4T98ElIFWWL6Aa8Q%2Fexternal-importer-21.png?alt=media\&token=21bc4954-2c7e-475f-81d5-c89f7b26dac9)

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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJI4NYOdifOrjXgzBta%2F-MJI53i7WzhK8XNuBMcU%2Fexternal-importer-22.png?alt=media\&token=99e993b7-04dd-4b31-94ba-ea14be6e0a01)

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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJI5cclwJROUr5DQmsw%2F-MJI6KjJraVxG0ynNhHr%2Fexternal-importer-25.png?alt=media\&token=d799852a-7319-4c3b-8572-28cec0f61252)


# Importing attributes

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

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJI6T0nnRyFGfvJI855%2F-MJLvQK8RjzSuVaFk80M%2Fexternal-importer-26.png?alt=media\&token=7218ecbb-6080-4d82-8d45-609c79dc0f49)

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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJI6T0nnRyFGfvJI855%2F-MJLwEvTxAkVvD4h3OoD%2Fexternal-importer-29.png?alt=media\&token=1cd78a7a-6d1d-43d3-be0c-ea23a46c49db)


# 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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJLwJwIMn_f5M3ZqzVk%2F-MJLwbidvOhYTYpnIhzr%2Fexternal-importer-29-a.png?alt=media\&token=9b38d60b-9693-40be-b9be-a69489566813)

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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJLwJwIMn_f5M3ZqzVk%2F-MJLwqJFD66gLSvqdcXR%2Fexternal-importer-30.png?alt=media\&token=9edf06fb-b381-4050-bf8f-02d614a33ae5)

\
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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FsGIJXeS1XQomnmGpwhjK%2Fimage.png?alt=media&amp;token=44192098-1dd5-4a33-ae52-f3252197cc85" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2Fx2i7S9vMd2CQnmcp0oYN%2F%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%BD%D1%8F.png?alt=media&amp;token=f40943e0-7cb5-4485-972b-36605a07b1c1" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FYIH61Q733sBjARyCzSvr%2F%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%BD%D1%8F.png?alt=media&amp;token=2cfd7f35-b694-418a-b656-21394b711326" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FeSEAX1zmUabLE7XqqqSn%2Fimage.png?alt=media&amp;token=8ea6f62a-f9a2-4713-b0f0-6598f0e7e3cb" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FBWB6XGpZe7vzWloinpdS%2Fimage.png?alt=media&amp;token=07b7d471-d0f7-4def-891c-b68d61e9d81f" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FTaHdaE3pVrOjA1hfUCfy%2Fimage.png?alt=media&amp;token=aa6090ef-e0b5-4e9a-acf4-4658ce7bbe48" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FWDBmCdCJqwU2wZSWKB8U%2Fimage.png?alt=media&amp;token=fd49a134-9f5d-4480-8b36-97e5fd4a5771" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FoWMbra3x7DNJ52vKnrKl%2Fimage.png?alt=media&amp;token=7624956b-bada-46ac-a919-ad7b58f05a66" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FSRuHuk4ChtQEUR7REAH6%2Fimage.png?alt=media&amp;token=7b90a69a-207e-4d89-96af-61e69984b1e6" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FtOiXwKrkHIpbDDk0ODHg%2Fimage.png?alt=media&amp;token=098cad03-d09b-42ab-a37c-22c265fdefc0" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FbNSVSPcicYIHisExkE3K%2Fimage.png?alt=media&amp;token=ae3f78e5-3722-4024-aedd-01b65f8ea8bf" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FwyXJNgA3cMukr8lV0T58%2Fimage.png?alt=media&amp;token=b90bcdf1-6cd9-423d-a65f-23729716dc75" alt="" width="563"><figcaption></figcaption></figure>

#### Synchronization modes

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2F7zneWg8ixY3KRk7BRvHe%2Fimage.png?alt=media&amp;token=956b0f1a-f9dd-46f4-be40-c5f0104220d6" 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 updates products in the background, on a schedule, without affecting page load time for your visitors.

* **No additional cron setup is required**, although WordPress needs regular traffic to run scheduled tasks. On a site with very few visitors, ask your host to set up a real cron job.
* Products are updated **one at a time**, so a slow or unreachable store cannot hold up everything waiting behind it.
* Updates are **spread evenly across your stores**, and each store's daily request limit is used gradually through the day rather than all at once.

How many products can be updated per day depends on your hosting and on how quickly each source responds – a store behind a scraping service can take fifteen times longer than a fast one. Rather than guess, External Importer measures it: the [Sync status](/synchronizing-products/sync-status) page shows how many updates a day your site is actually capable of, and warns you if your update period asks for more than that.

{% hint style="info" %}
Use the [Sync status](/synchronizing-products/sync-status) page to check that synchronization is running, see which stores are blocked, and confirm your settings can be met.
{% endhint %}

#### Per-product sync controls

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

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FfHYcr1C5ZLtiKSvqkHn0%2Fimage.png?alt=media&amp;token=7175a7d4-7545-4513-bbe2-6a4884d81753" 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.

#### Checking synchronization across your catalog

The per-product widget answers questions about a single product. For the whole catalog – what is being updated now, which stores are blocked or out of requests, and which products are failing – see the [Sync status](/synchronizing-products/sync-status) page.

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FCoAXFB1PeCQ25P86CaZ1%2Fimage.png?alt=media&amp;token=2697cb02-6ee0-4025-8054-2b0063e3470c" alt=""><figcaption></figcaption></figure>


# Sync status page

Check whether External Importer is updating your products, which stores are blocked, and whether your synchronization settings can actually be met.

The **Sync status** page answers one question: is External Importer keeping your prices and stock up to date, and if not, why?

You can find it at:\
**External Importer → Sync status**

It is the fastest way to diagnose synchronization problems, and the first place to look before contacting support.

### The three panels at the top

**Synchronization** tells you whether products are being updated right now:

* **Working** – updates are running. The line below shows how many products are being updated at this moment, or when the last one was updated.
* **Not running** – nothing has been updated for a while, although your settings say it should be. See [Why prices don't update](/synchronizing-products/why-prices-dont-update).
* **Updated when viewed** – you are using Frontend synchronization, so products refresh as visitors open them.
* **Switched off** – the update period is set to *Disabled*.

**Waiting** shows how many products have passed their update period and are queued for an update. A number here is normal: products are updated gradually. What matters is whether it goes down over time.

**Last 7 days** shows how many products were updated successfully, and how many attempts failed.

### Settings

The **Settings** section repeats your current synchronization settings in one line so you can check them without leaving the page: update mode, update period, daily request limit per store, and how many products are under synchronization.

It also works out whether those settings can actually be met, and warns you when they cannot:

{% hint style="warning" %}
**domus.hr**: 4,200 products on this period need 600 requests a day, but the daily limit is 500. Raise the daily limit to 600, or set the update period to 9 days or more.
{% endhint %}

Two limits are checked:

* **The daily request limit for each store.** If a store has more products than its daily allowance can cover within your update period, those products can never keep up, no matter how long you wait.
* **How much this site can actually update in a day.** This is measured from how long updates have really taken on your server, so it accounts for slow sources and scraping services. Until enough updates have run, it shows *not enough history yet* rather than a guess.

### Stores

The table lists every store you import from, with:

* **Waiting** – products from this store whose update period has passed.
* **Failing** – products whose last update returned an error.
* **Last success** – when a product from this store was last updated successfully.
* **Updated (7 days)** – successful updates over the last week, with failures noted separately.
* **Today** – requests made to this store today, against its daily limit.
* **State** – whether the store is accepting requests:
  * **Active** – updating normally.
  * **Throttled** – too many errors from this store recently, so requests are paused for a while. It is retried automatically.
  * **Daily limit reached** – the store has used its whole daily allowance and resumes tomorrow.
  * **Waiting for budget** – the daily allowance is spread across the day, and this store has used its share so far. It resumes shortly.

Each row has an action: **Update now** for an active store, or **Reset throttle** for a store that has been paused, which clears its recorded errors so it can be tried again immediately.

{% hint style="info" %}
Throttling protects you. If a store is blocking your requests, continuing to hammer it usually makes the block worse. Fix the cause first – see [How to avoid getting blocked](/extracting-products/how-to-avoid-getting-blocked) – and use **Reset throttle** afterwards.
{% endhint %}

### Needs attention

Products that will not come right on their own:

* Products with **no store recorded**, which are skipped whenever another store is throttled.
* Products that were **paused** because updating them repeatedly failed to finish – usually a source that hangs until the request times out.
* Products that have **not been updated successfully for a long time**.

The **Repair** button fixes the first two categories: it fills in the missing store and lets paused products be tried again. On a large catalog it repairs up to 100 products per click, so run it again if there are more.

### Recent failures

The most recent failed updates, with the product, the error code and the message returned by the source store. **Retry failed products** queues every failing product for another attempt without waiting for its update period.

Common codes:

* **403** – the source is blocking your server. Use a [scraping service](/extracting-products/crawling-services).
* **404 / 410** – the product no longer exists at the source. It is marked Out of stock.
* **503** – the source is temporarily unavailable or rate limiting you.

### Buttons

* **Update products now** – adds the products that are due to the background queue. They are updated over the next few minutes, not while you wait.
* **Restart synchronization** – appears only when updates have stopped running. It re-registers the background task.

### Diagnostics

At the bottom of the page is a plain-text summary of everything above. If you contact support about synchronization, copy it into your message – it usually removes several rounds of questions.


# 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`.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJM0uwQOV8lAl7j2FMf%2F-MJM1VpRfa5qCbT_WBWi%2Fexternal-importer-33.png?alt=media\&token=7743d801-e55e-4bad-90b2-6fff86b03c42)

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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJM0uwQOV8lAl7j2FMf%2F-MJM1jZP9g5Ub10fNLic%2Fexternal-importer-34.png?alt=media\&token=afd41db9-6e39-44ea-a52b-8b144d8c7725)

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

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FM8xRAARbbYfjlGOZHjhM%2Fimage.png?alt=media&amp;token=0f905f1b-4e53-40a7-94b9-c0f9cce52ead" 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.

### Start here: the Sync status page

Open **External Importer → Sync status**. It answers most of the questions below in one screen: whether updates are running at all, which stores are blocked or out of requests, which products are failing and why, and whether your update period can be met by your catalog at all.

If the page says **Not running**, use the **Restart synchronization** button on it, then continue with step 5 below.

See [Sync status page](/synchronizing-products/sync-status) for what each part means.

### 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FHCoRPF71l5bJfNnf3iSO%2Fimage.png?alt=media&amp;token=374a7fe6-5871-4a67-836a-d726658f2f1e" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2Fe0pkHLEi9xHKT6LlfBk6%2Fimage.png?alt=media&amp;token=ffe29363-d0f8-48ea-90a2-155049f1feaa" 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 → Sync status** and find the store in the **Stores** table.
* The **State** column shows whether it is **Throttled** (too many recent errors), has reached its **Daily limit**, or is **Waiting for budget**.
* **Reset throttle** on that row clears the store's recorded errors so it can be tried again immediately – but fix the underlying cause first, or it will simply be throttled again.
* The limits themselves are set in **External Importer → Settings → Extractor**.
* Visit **External Importer → Logs** to check for errors related to throttling.

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FlpaXHHrb7I9VF0GBQgbV%2Fimage.png?alt=media&amp;token=c6d9b34a-787e-400a-95bd-aad3af2c580c" alt="" width="368"><figcaption></figcaption></figure>

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FxANlXOcJlZ1rulAvd8Bn%2Fimage.png?alt=media&amp;token=3d2d786c-0358-4a7a-bcca-b998bfcfa627" alt=""><figcaption></figcaption></figure>

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJM44uRGkdDs_NGcecM%2F-MJM4JHT1rac0wVN9Ajc%2Fexternal-importer-39.png?alt=media\&token=b95650e3-5f42-4836-9004-8d05ea6d48ed)

#### 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FpyNXm4jlZIsJQKcGdOlO%2Fimage.png?alt=media&amp;token=ec7b1322-32b4-4264-aa9e-291592796d94" alt="" width="336"><figcaption></figcaption></figure>

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FdsfiLv5My1UKruWVuKsX%2Fimage.png?alt=media&amp;token=a9fd28bd-78e6-41f7-99a9-a94096e610a2" 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.

To fix potential Cron issues:

* Go to **External Importer → Sync status** and use **Restart synchronization**. This re-registers the background task, and replaces re-saving your settings.
* Background updates are run by WooCommerce's scheduled task system. You can inspect them under **WooCommerce → Status → Scheduled Actions**, in the group **external-importer**.
* Ensure your website has **regular traffic**, as WordPress scheduled 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.
* If `DISABLE_WP_CRON` is set in your `wp-config.php` and no server cron job is running, scheduled updates will never start.

{% hint style="info" %}
Earlier versions used a WordPress cron event named `ei_sync_products`. From version 2.29.0 it no longer exists, and you will not find it in WP Crontrol.
{% endhint %}

#### 6. Understand Synchronization Limits

Products are updated one at a time, so how many you can update per day depends on your hosting and on how quickly each source responds.

The **Sync status** page measures this for your site and shows it under **Settings → Capacity**, alongside the number of updates a day your current update period actually requires. If the required rate is higher than your capacity, the page tells you the shortest update period your catalog can keep up with.


# 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FDhOrCYIE5ThJ1pS9jDPY%2Fimage.png?alt=media&amp;token=30e58090-9cca-4bbf-b4d6-bc0808037730" 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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJMBYcg9vTQt7fadNwW%2F-MJMBbnQ3SmM7hiv5IRM%2Fexternal-importer-42.png?alt=media\&token=896f3b6b-1a74-40dc-9731-413f2de56d45)

### 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.

   ![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJMBYcg9vTQt7fadNwW%2F-MJMCZFMrAJAq21IwJft%2Fexternal-importer-43.png?alt=media\&token=0e3a368d-5428-4e89-82da-1485ad7bc855)

   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.

   ![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJMBYcg9vTQt7fadNwW%2F-MJMCoxuiXHoRcM4fBW-%2Fexternal-importer-44.png?alt=media\&token=9bbb0cfb-803a-4c0f-8281-5a8b803dfe70)

**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`

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJMaKrulhy5qCf3zgyV%2F-MJMajTyq4t7OjF5ZEUi%2Fexternal-importer-45.png?alt=media\&token=e5a32adf-277c-4c1a-a081-5494a41aae39)

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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJMaKrulhy5qCf3zgyV%2F-MJMayR01F1X83vSEQ0I%2Fexternal-importer-46.png?alt=media\&token=98cc9bfb-3b9d-4e78-ac77-6d1149527ba9)

#### 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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJMbF5XMNkz4fqCzA87%2F-MJMbXP5zuD2U0JMUSBi%2Fexternal-importer-47.png?alt=media\&token=ff507aef-240b-49e5-bbb9-983d30aa12c0)

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 %}

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJMbF5XMNkz4fqCzA87%2F-MJMbn1NvKXKuz-whhC3%2Fexternal-importer-48.png?alt=media\&token=653c546a-9132-4548-8b8a-ad20714161eb)


# 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`.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJMcD_fydDnm2-AJvQT%2F-MJMcHQSIxhq3MDJkb6_%2Fexternal-importer-49.png?alt=media\&token=9226bc11-4409-432d-99b6-25fbed2c08d2)


# 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FreVqgA4EhcP79kASJ1Gg%2Fimage.png?alt=media&amp;token=56674579-55e9-4e68-a35f-51cca5b8cd86" 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2F7C4O6nyFLljxgzQ6XT1n%2Fimage.png?alt=media&amp;token=631a9d42-c8ed-4646-a26f-7e311ca62d76" 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`

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJMcD_fydDnm2-AJvQT%2F-MJMcwfuM0DcPEKu_Y5V%2Fexternal-importer-51.png?alt=media\&token=e718fc33-2e2a-4938-a46c-417a45687426)


# 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="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2Fl3ls3qCzeT40o8GfQLHp%2Fimage.png?alt=media&amp;token=2628b827-dcb8-4c94-bf3d-c0cc627b61b7" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FL6Xy8HOpCEAfVRdDQmhZ%2Fimage.png?alt=media&amp;token=890fb9cc-2006-4732-ae61-60ab3c03afaf" 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`):

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FZ4XeNd1H5xlBvyIaJbm8%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=65144a9c-ec72-4728-aa97-7b8fda3b6fa6)

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.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MJHhS3qgDA1lCM6b1Nw%2Fuploads%2FMU8OtMqoUbagIH3kxqYh%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=689e8897-18c3-4e01-92c0-0b44eed87be3)


# 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);
}
```

### Tuning synchronization

These filters change how the background synchronization queue behaves. The defaults suit most sites – the [Sync status](/synchronizing-products/sync-status) page will tell you if yours cannot keep up before you reach for these.

```php
// How many products may be queued for updating at once. Kept small so that
// WooCommerce's own background jobs are not stuck behind product updates.
add_filter('ei_sync_queue_window', function ($window) {
    return 50;
});

// How many products from the same store may be updated at the same time.
add_filter('ei_sync_domain_concurrency', function ($limit) {
    return 5;
});

// How often the plugin checks for products that are due, in seconds.
add_filter('ei_sync_dispatch_interval', function ($seconds) {
    return 120;
});

// Daily request limit for one store, overriding the Extractor setting.
add_filter('ei_sync_daily_limit', function ($limit, $domain) {
    return $domain === 'amazon.de' ? 2000 : $limit;
}, 10, 2);

// The daily limit is normally spent gradually through the day. Return false to
// allow it to be used as fast as the queue can go.
add_filter('ei_sync_daily_pacing', '__return_false');

// A product whose update never finishes - a source that hangs until the
// request times out - is paused after this many attempts, and retried no more
// often than the backoff below.
add_filter('ei_sync_max_attempts', function ($attempts) {
    return 10;
});

add_filter('ei_sync_attempt_backoff', function ($seconds) {
    return 2 * HOUR_IN_SECONDS;
});

// Turn scheduled synchronization off entirely without changing the settings.
add_filter('ei_sync_enabled', '__return_false');

// How often the backlog is counted for the admin warning, in seconds. This is
// a scan of every imported product, so it runs in the background twice a day
// rather than while anyone is waiting for a page.
add_filter('ei_sync_backlog_scan_interval', function ($seconds) {
    return 6 * HOUR_IN_SECONDS;
});
```

{% hint style="info" %}
`ei_sync_product_limit` still works and now sets the size of the queue, so existing code that used it keeps behaving sensibly.
{% endhint %}


# 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

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJMet-UY-xn5PLU0UH6%2F-MJMfSHwJ3VC9H171Xn3%2Fexternal-importer-54.png?alt=media\&token=6ac33152-8401-44ad-bb1b-54cb76998225)

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/`.

![](https://2204606725-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJHhS3qgDA1lCM6b1Nw%2F-MJMet-UY-xn5PLU0UH6%2F-MJMg2Z1ZqpwSpKaofHI%2Fexternal-importer-55.png?alt=media\&token=b9a89f56-90d0-4393-ae6f-25da83561a9b)

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.


