--- title: External search engine optimization (SEO) slug: '2775' canonical_url: https://docs.coveo.com/en/2775/ collection: coveo-for-commerce source_format: adoc --- # External search engine optimization (SEO) When using Coveo to power your public website, it's important to keep in mind how the content crawled from query-based listing pages appear in external search engines such as Google or Bing. This article provides a high-level overview of some leading practices to ensure that your content can be optimally indexed by external search engines (SEs). External search engines (SEs) index the web at frequent intervals and rank pages based on content and confidence. To be ranked effectively, pages that must be indexed by external SEs should meet certain standards. Commerce listing pages powered by the [Coveo Platform](https://docs.coveo.com/en/186/) are typically rich with content that should be indexed by external [crawlers](https://docs.coveo.com/en/2121/). Keep in mind that external SE crawlers trigger queries as well as many requests against your website to index your web pages. You may want to minimize the impact of these queries/requests. To learn how, see [Exclude search interfaces from external search engines](https://docs.coveo.com/en/l9e90128/). > **Note** > > Search-driven content that's frequently changing such as search pages and recommendation interfaces is irrelevant from an SEO perspective and should therefore not be indexed by external SEs. Consider using [static content along with dynamic content](https://docs.coveo.com/en/2775#use-static-content-along-with-dynamic-content). ## Server-side versus client-side rendering It's easier for common SEs to crawl and index server-side rendered (SSR) websites than client-side rendered (CSR) websites as the content is available to external SEs before it's rendered on the end user's browser. Other strategies, such as dynamic pre-rendering or hybrid SSR/CSR solutions, can also be used to optimize the ranking of Coveo-powered search pages on external SEs. While the [Coveo Atomic](https://docs.coveo.com/en/atomic/latest/) and [Coveo JavaScript Search Framework](https://docs.coveo.com/en/187/) are pure client-side solutions, other options are available to build your search interface: * [Coveo Headless](https://docs.coveo.com/en/2775#coveo-headless) * [Search API](https://docs.coveo.com/en/2775#server-side-rendering-using-the-coveo-search-api) * [Atomic or JavaScript Search Framework with pre-rendering tools](https://docs.coveo.com/en/2775#use-the-coveo-atomic-or-javascript-search-framework-with-a-pre-rendering-tool) ### Coveo Headless [Coveo Headless](https://docs.coveo.com/en/headless/latest/) is a library for developing your own Coveo-powered UI components. It wraps the complexity of the Coveo APIs while giving you full flexibility over your UI implementation. It's used, for example, in [Coveo Atomic](https://docs.coveo.com/en/atomic/latest), to handle application state and Coveo interactions. ### Server-side rendering using the Coveo Search API You can leverage the [Coveo Search API](https://docs.coveo.com/en/52/) directly to [build your search interface](https://docs.coveo.com/en/1370/) from scratch. Since this approach gives you full control over your interface implementation, it allows you to implement server-side rendering. ### Use the Coveo Atomic or JavaScript Search Framework with a pre-rendering tool Since [Coveo Atomic](https://docs.coveo.com/en/atomic/latest/) and [Coveo JavaScript](https://docs.coveo.com/en/375/) search frameworks are client-side rendering solutions, it's not optimal from an SEO point of view. If you have to use these frameworks to build your search interface, and need the interface to be indexed by external SEs, you can use a pre-rendering tool, such as [Prerender](https://prerender.io/), to improve the interface ranking on external SEs. ## Stability External SEs usually rank static pages higher than fully dynamic web pages. Whenever an external SE crawls a page, it expects the page to remain similar to the last time it was visited. Due to their dynamic nature, Coveo-powered search pages that must be indexed and made searchable by external SEs may not rank effectively if some precautions are not taken. ### Use static content along with dynamic content Since external SEs seek stability for optimal ranking, a leading practice is to use both static and dynamic content on the pages that must be indexed by external SEs. **Example** On a Coveo-powered ecommerce website, you have a **Gaming Computers** listing page that incorporates [product recommendation](https://docs.coveo.com/en/3132/) interfaces. These interfaces recommend items according to the current user's profile and action history. Those recommendations are dynamic as they differ depending on the user who accesses the page. Since you want this listing page to rank well in external SEs, you incorporate a static interface that always shows the same products regardless of the user who browses the page. Doing so allows external SEs to recognize that some of the content remains the same every time it crawls the **Gaming Computers** listing page. ### Use stable and readable URLs When indexing content, external SEs expect URLs to be stable and well formatted. URLs typically follow the following format: ```http [protocol]://[hostName][urlPathname]#[urlHash]?[queryString] ``` Where: * `protocol` is the protocol that the browser uses to request the resource (for example, `https`). Note that external SEs usually give more importance to URLs that use the `https` protocol over `http`. * `hostName` is the host that holds the resource (for example, `coveo.com`). * [[pathname]] `urlPathname` identifies the page location in the directory structure (for example, `/en/search`). * `urlHash` points the browser to a specific spot in a page or website (for example, `#q=platform`). * `queryString` assigns values to specified parameters (for example, `?q=platform`). **Example** ```http https://coveo.com/en/search/#q=platform/?q=platform ``` When indexing web pages, common external SEs ignore everything that comes after the `++#++` or `?` URL characters. By default, Coveo-powered search pages ([Coveo JavaScript Search Framework](https://docs.coveo.com/en/375/), [Atomic](https://docs.coveo.com/en/atomic/latest/), or [Headless](https://docs.coveo.com/en/headless/latest/)) put facet selections after the `urlHash` (`#`) to avoid external SEs indexing a new page for every facet combination. **Example** You have a search interface that can be accessed through the following URL: ```http https://www.acme.com/en/search ``` When a user selects the `computer` facet value of the `productType` facet, the URL becomes: ```http https://www.acme.com/en/search#f:productType=[computer] ``` Even though a user can type the `https://www.acme.com/en/search#f:productType=[computer]` URL to access a search page that only shows items whose `productType` is `computer`, this URL won't be indexed by external SEs as they ignore everything that comes after the `urlHash`. #### Use facet selections in the URL pathname > **Important** > > Including facet selections in the URL pathname will cause all possible combinations of facet selections for the specified facets to be indexed by external SEs. > This can cause external SEs to make a large number of requests, increasing the [queries per month (QPM)](https://docs.coveo.com/en/1391/) count for the related [Coveo organization](https://docs.coveo.com/en/185/) (see [What counts as a query](https://docs.coveo.com/en/l25h0358#what-counts-as-a-query)). > > To limit the requests made by external SEs in your commerce search interface, you can use canonical URLs to tell external SEs which URL should be indexed when multiple URLs lead to very similar content. > For more information on canonical URLs, and how to configure them, see [Consolidate duplicate URLs](https://developers.google.com/search/docs/advanced/crawling/consolidate-duplicate-urls). Since common external SEs ignore everything that comes after the `++#++` or `?` [URL characters](https://docs.coveo.com/en/2775#use-stable-and-readable-urls) when indexing web pages, this may cause issues if you want a Coveo-powered ecommerce search interface that contains specific facet selections to be crawled and indexed by external SEs. You can make these facet selections indexable by external SEs by moving them directly in the URL pathname. **Example** On a Coveo-powered ecommerce website, you want certain facet selections to be indexed by external SEs to improve organic ranking when customers are looking for specific brands or product categories. Therefore, you set your interface to put facet selections for the `brand` and `productCategory` facets directly in the URL [pathname](https://docs.coveo.com/en/2775#pathname). To avoid having less important facet selections to be indexed by external SEs, you keep the default behavior for other facets, such as `size` and `priceRange`. With this configuration, the following facet selections: * `brand`: `Blurton` * `productCategory`: `Snowboard` * `size`: `160` * `priceRange`: `500-750` will generate the following URL: ```http https://www.acme.com/en/search/brand/blurton/productCategory/snowboard#f:size=[160]&f:priceRange=[500-750] ``` ## Use a sitemap It's a common SEO good practice to have a sitemap for your site. Using a sitemap ensures that your content is indexed by external SEs, hence the item directly related to an end user's search will be returned rather than the search page that contains the item. For more information on sitemaps and how to configure them, see [Learn about sitemaps](https://developers.google.com/search/docs/advanced/sitemaps/overview).