npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@pinelab/vendure-plugin-popularity-scores

v1.8.0

Published

Sort products and collections by popularity based on previously placed orders

Downloads

312

Readme

Sort by popularity Vendure plugin

Sort products and categories by popularity based on previously placed orders.

This plugin periodically scores products and categories based on the amount of times they occur in previously placed orders. The goal is to be able to order products and categories by their popularity, so we can present the most popular products and categories to our customers first.

Getting started

  1. Install the plugin in your vendure-config.ts
import { PopularityScoresPlugin } from '@pinelab/vendure-plugin-popularity-scores'

...
plugins: [
   PopularityScoresPlugin.init({
     endpointSecret: 'test',
      productFieldUiTab: 'Scores',
      collectionFieldUiTab: 'Scores'
   }),
   ...
];
  1. Run a database migration to create the custom fields needed for this plugin
  2. Start your vendure server
  3. Go to http://localhost:3000/popularity-scores/calculate-scores/<YOUR CHANNEL TOKEN>/<YOUR ENDPOINT SECRET> to calculate the popularity scores of products and collections. You can also use the default channel's token to generate scores for all channels. Ideally you would do this periodically, like once a week or so.

How it works

This plugin exposes an endpoint that can be periodically called: /popularity-scores/calculate-scores/:yourchanneltoken/:yoursecret. This will push a job named calculate-popularity to the worker. The worker will handle this message and do the following:

  1. Get all orders from the past 12 months.
  2. Calculate the amount of times each Variant has been sold.
  3. It then calculates the sum of all variants per Product, so that we have the amount of times a Product has been sold in the past 12 months.
  4. It normalizes this value to a score of 0 to 10000, because we don't want to expose our number of sales publicly.
  5. The normalized score will the be stored on Product.customFields.popularityScore
  6. It then calculates the popularity of collections, based on the product scores and it's child collections
  7. Collection scores are stored on Collection.customFields.popularityScore
  8. Both the Product and Collection popularity scores are publicly available in the GraphQL Shop API.

Popularity scores

Popularity scores should only be used to sort products and collections. The actual values are normalized and don't have any absolute meaning.

Scores of products are based on the amount sold of the past 12 months and normalized to a score of 0 to 1000.

For collections, only the leaf collection scores are normalized. Any parent collection scores are just the sum of their sub-collections. This is to keep the popularity relation between parent/child collection in tact. I.e. a parent's score should be much higher, because it inherits all popularity from it's child collections.

You can compare popularity scores of products with those of other products, but it doesn't really make sense to compare collection scores, because each collection will have a different amount of products in them.