Webshop source
The Webshop source crawls an entire PrestaShop store from its sitemap. Every page becomes one content item in your assistant, and product pages additionally get a structured record with the exact price and stock. So your assistant never guesses: the chat renders real product cards, and the product_prices tool returns the price straight from the database — no rounding, no math in its head.
On this page
Why use this
- You run a PrestaShop store and want your assistant to answer with exact price and stock, not just the product description text.
- You want the chat to render product cards with image, name and price, linking straight to the product page.
- You want to import the whole store in one step — the Webshop source processes every page in the sitemap, not just products.
- On an unsupported engine? Use the Website source instead — it also crawls the catalog, but without structured price/stock or product cards.
How it works
The crawl behaves like the Website source — it starts from the sitemap — but it processes each page based on whether it's a product page or not.
- Discover. EchoAI reads the store's sitemap and collects every URL. CDATA-wrapped URLs (common on PrestaShop) are parsed correctly.
- Classify. Depending on the detected platform, each URL is classified as a product page or another page (category, blog, static). Shopify and WooCommerce use the public product listing (JSON API); the other platforms use the sitemap's product links; on UNAS the product links are collected from each category page's product list.
- Process a product page. EchoAI fetches the page, extracts the product data (name, price, currency, stock, SKU, brand, category, attributes, images), and writes two things:
- a structured record with the exact price and stock — this powers the product cards and exact pricing in chat;
- a content item (RAG corpus) linked 1:1 to that structured record — this counts toward your content limit and makes the product searchable by text (attributes like "Colour: Natural" are included in the searchable body).
- Process other pages. Non-product pages become a plain content item only, without price/stock — exactly like the Website source.
The crawl runs in the background and processes pages concurrently. It is idempotent: re-syncing skips already-imported pages, so no duplicates are created and your content limit isn't wasted.
product_prices tool straight from the database and computes line items and totals server-side. So it never invents a price or does math in its head — even a quantified order has a deterministic total.
Product cards in chat
When a visitor asks about products, the assistant doesn't just reply with text: it renders product cards in a two-column grid (up to 6 cards) inside the conversation. Each card is clickable and opens the product page in a new tab.
A card shows:
- Product image (if available) — dimmed for out-of-stock products.
- Product name.
- Price — formatted for the conversation language (thousands separator, currency).
- Stock status — a coloured dot plus a label (green = in stock, gray = out of stock). The label is localized (e.g. "In stock" / "Out of stock"); the exact quantity is never shown, only the binary state.
Card order is gently re-ranked so the most useful products surface first:
- first the in-stock products,
- then those that have a price,
- finally those that have an image.
The search relevance order is preserved within products of equal score. Out-of-stock products don't disappear — they're just shown more dimly and in gray, so they stay informative without being alarming.
http(s) links and images — javascript: and data: schemes are filtered out (XSS protection).
Step-by-step setup
- Open Integrations (content sources) in the dashboard.
- Find the Webshop product data card.
- Enter your webshop URL. For a multi-locale store you can narrow to one language with a path prefix (e.g.
https://yourshop.com/en). - Select which assistant should receive the imported products.
- Click Connect webshop. EchoAI starts the crawl, and you can track status on the card:
connecting→crawling→active.
When the crawl finishes, the card shows how many products were synced. You can refresh prices and stock later by re-syncing — the idempotent crawl only picks up what's new.
Why prices stay correct (currency-lock and geo-proxy)
PrestaShop can decide which currency to render based on the visitor's IP country. That means if the crawler "looks at" the store from another country, the price can come back in the wrong currency — and the correct one is physically absent from the fetched bytes. EchoAI guards against this with two mechanisms.
Currency-lock
On the first crawl, EchoAI detects the currency from the store homepage and locks it on the source. From then on, the crawler validates every product against that locked currency:
- A product in the correct currency → imported.
- A product in the wrong currency → rejected, written neither as a structured record nor as content. Any existing, correct data is left intact — "stale but correct" always beats "fresh but wrong".
Geo-proxy
So the store renders the correct currency in the first place, EchoAI crawls geo-gated stores through a residential proxy in the store's country. EchoAI learns the connecting admin's country from the connection and stores it on the source, so the crawl "looks into" the store from there.
Limits and behaviour
| Aspect | Behaviour |
|---|---|
| Platform | 5 platforms — PrestaShop, WooCommerce, Shopify, ShopRenter, UNAS |
| Content limit | Every crawled page (product and other) consumes your plan's content limit. The limit is not monthly: it doesn't reset, space is freed only by deleting content. Exact numbers: Limits. |
| Reaching the quota mid-crawl | If the crawl reaches the content limit it doesn't error; it stops gracefully and reports how many pages were skipped — so it surfaces as a partial import. |
| Re-syncing | Idempotent — already-imported pages are skipped, only new ones are picked up. No duplicates. |
| Structured records | Created only from product pages; other pages become plain content. |
| Stock display | In chat, stock is binary (in stock / out of stock) — the exact quantity is never shown. |
Common errors and troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| "Connection failed" | The submitted URL is unreachable, isn't a PrestaShop store, or no sitemap was found. | Check the URL in your browser and that the store exposes a public sitemap. On PrestaShop, make sure the sitemap module is enabled. |
| Some products are missing | The product page wasn't recognised as a valid product, or didn't render properly. | Open the product in your browser and check that it's a standard PrestaShop product link (e.g. /123-product-name.html). |
| Prices in the wrong currency | The crawler didn't "look into" the store from the store's country (geo-proxy egress issue). | Currency-lock filters out wrong-currency products; if every product is wrong-currency the crawl errors out. Check the geo-proxy setting, then re-sync. |
| The crawl ended in an error state | Currency-blocked crawl: EVERY product came back in the wrong currency relative to the locked one. | The geo-proxy egress didn't crawl from the right country. Fix the egress setting and re-sync — existing correct data is preserved. |
| "Content limit exceeded" | The store has more pages than your plan's content limit allows. | Narrow to one locale with a path prefix, delete content to free space, or upgrade your plan. |