Algolia e-commerce search and discovery

Accelerate conversions.
Increase engagement.
Build customer loyalty.

Algolia enables e-commerce and retail businesses to create personalized, intuitive product search and discovery experiences that shoppers love.

iPad mockup

World’s leading e-commerce and retailers chose Algolia

BetterWorldBooks logo

+10%

Conversion rate

Birchbox logo

+13%

Average order value

JB Hi-fi logo

+35%

Conversion rate

Underarmour logo
LVMH logo
Fanatics logo
Lacoste logo
the Kooples logo
Arc'teryx logo
Goat logo
Vestiaire Collective logo
Personalization illustration

Deliver personalized shopper experiences

Your customers send you signals every time they interact with your brand; online and even offline. Capture that data into Algolia to serve your customers the right products based on purchase history, preferences, demographics, favorite store or anything else.

Query rules illustration

Stay in control with built-in merchandising and business logic

Your store is unique. Use our visual dashboard to fine-tune the products ranking based on their popularity, reviews, profit margins or any data that matters to you. Your e-commerce store is living. With Query Rules, you can promote specific results, display promotional banners or redirect your customers when they search for the latest trends.

Analytics illustration

Understand your customers with powerful Analytics

With Algolia Analytics, understand what your customers are searching for, what filters they use, what results they click and how their searches turn into conversions. Use those insights to improve your product catalog, adapt your SEO strategy, fuel merchandising initiatives and fine-tune your search relevance.

Learn more

Integrating Algolia to your e-commerce use case is a breeze

Use our APIs to customize and integrate great search and discovery in your e-commerce website.

Backend
Frontend
my_index = Algolia::Index.new('contacts')
my_index.add_object :firstname => "Jimmie",
                    :lastname => "Barninger",
                    :company => "California Paint"

class Contact < ActiveRecord::Base
  include AlgoliaSearch

  algoliasearch do
    attribute :firstname, :lastname, :company
  end
end

myIndex = apiClient.init_index("contacts")
myIndex.add_object({
  "firstname": "Jimmie",
  "lastname": "Barninger",
  "company": "California Paint"
})

from django.contrib.algoliasearch import AlgoliaIndex

class YourModelIndex(AlgoliaIndex):
    fields = ('firstname', 'lastname', 'company')

$myIndex = $apiClient->initIndex("contacts");
$myIndex->addObject([
    "firstname" => "Jimmie",
    "lastname" => "Barninger",
    "company" => "California Paint",
]);

/**
 * @ORM\Entity
 */
class Contact
{
  /**
   * @var string
   *
   * @ORM\Column(name="firstname", type="string")
   * @Group({searchable})
   */
  protected $firstname;
}


use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class Contact extends Model
{
    use Searchable; // Simply add a trait
}


const myIndex = apiClient.initIndex('contacts');
myIndex
  .addObject({
    firstname: 'Jimmie',
    lastname: 'Barninger',
    company: 'California Paint',
  })
  .then(content => console.log(content))
  .catch(err => console.error(err));

Index<Contact> index = client
  .initIndex("contacts", Contact.class);

index.addObject(
  new Contact()
    .setFirstname("Jimmie")
    .setLastname("Barninger")
    .setCompany("California Paint")
);


import algolia.AlgoliaDsl._
import scala.concurrent.ExecutionContext.Implicits.global

case class Contact(
  firstname: String,
  lastname: String,
  company: String
)

val indexing: Future[Indexing] = client.execute {
  index into "contacts" `object` Contact(
    "Jimmie",
    "Barninger",
    "California Paint"
  )
}


object := algoliasearch.Object{
    "firstname": "Jimmie",
    "lastname":  "Barninger",
}
res, err := index.AddObject(object)

Index myIndex = apiClient.InitIndex("contacts");
var jsonObject = new JObject();
jsonObject.Add("firstname", "Jimmie");
jsonObject.Add("lastname", "Barninger");
jsonObject.Add("company", "California Paint");
myIndex.AddObject(jsonObject);

let myIndex = apiClient.getIndex("contacts")
let n = [
    "firstname": "Jimmie",
    "lastname": "Barninger",
    "company": "California Paint"
]
myIndex.addObject(n)

Index myIndex = apiClient.initIndex("contacts");

JSONObject jsonObject = new JSONObject()
  .put("firstname", "Jimmie")
  .put("lastname", "Barninger")
  .put("company", "California Paint");

myIndex.addObjectAsync(jsonObject, null);

<div id="searchbox"></div>
<div id="hits"></div>

<script>
  const {
    searchBox,
    hits
  } = instantsearch.widgets;

  search.addWidget(
    searchBox({ container: "#searchbox" })
  );
  search.addWidget(
    hits({ container: "#hits" })
  );
  search.start();
</script>

const App = (
  <InstantSearch>
    <SearchBox />
    <Results />
    <Pagination />
    <RefinementList
      attribute="company"
    />
  </InstantSearch>
);

<RelativeLayout
  xmlns:algolia="http://schemas.android.com/apk/res-auto"
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <com.algolia.instantsearch.ui.views.SearchBox
    android:id="@+id/search_box"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

  <com.algolia.instantsearch.ui.views.Stats
    android:id="@+id/search_box"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

  <com.algolia.instantsearch.ui.views.Hits
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    algolia:itemLayout="@layout/hits_item"/>
</RelativeLayout>

<ais-index>
  <ais-search-box />
  <ais-results>
    <template scope="{ result }">
      <h2>{{ result.name }}</h2>
      <p>{{ result.description }}</p>
    </template>
  </ais-results>
  <ais-refinement-list attributeName="company" />
  <ais-pagination />
</ais-index>

@Component({
  selector: 'search-ui',
  template: `
    <input type="search" (input)="search()">
    <div *ngFor="let result of results">{{result.title.highlighted}}</div>
    `
})
export algolia(App);

import InstantSearch

override func viewDidLoad() {
  super.viewDidLoad()

  let searchBar = SearchBarWidget(frame: ...)
  let statsWidget = StatsLabelWidget(frame: ...)
  self.view.addSubview(searchBar)
  self.view.addSubview(statsWidget)

  // Add all widgets in view to InstantSearch
  InstantSearch.shared.registerAllWidgets(in: self.view)
}

Use our pre-built extensions to improve your store experience in a few minutes.

Shopify logo Magento logo
Landscape with a giant book

Discover how Better World Books increased their conversion rate by 10%

“Customers are quickly finding the products that they are looking for, and we are seeing the benefits.”

Matt Byers
Sr. Director of technology

Learn more