←all writing
2315 Feb 2024/4 min read

Shopify SEO, phone login and delivery: the setup behind PetsFirst's 15x order growth

The Shopify setup I worked on for PetsFirst: SEO changes in the theme, OTP login for Indian customers, delivery, and two stores running on one codebase. Orders grew 15x in eight weeks.

ShopifyE-commerceSEO
Illustration for the post: Shopify SEO, phone login and delivery: the setup behind PetsFirst's 15x order growth

In early 2023 PetsFirst was one pet retailer in Bangalore. Between February and May that year I worked on its two Shopify stores, a retail store and a pharmacy. In the eight weeks after launch, orders grew 15x and sales grew 23x. Customers were ordering from more than twenty cities.

It is easy to look at numbers like these and give the credit to the design of the store. The design had little to do with it. If I put the work in order of how much it mattered, the list looks like this.

Search came first

More than 10,000 people found the store through Google in the first ten weeks, with no ads behind them.

The stores run on a paid theme, heavily customised. Most of the SEO work was small changes inside that theme. These are the ones I would do again on any store.

One canonical URL per collection. On Shopify a collection can be reached through many URLs: with a tag, with a filter, with a sort order. Google sees them as separate pages with the same products. We cut the canonical back to the bare collection URL, so all of those versions point to one page:

{%- assign get_canonical_url = canonical_url -%}
{%- if template.name == 'collection' -%}
  {%- assign collection_end = 'collections/' | append: collection.handle -%}
  {%- assign parts = get_canonical_url | split: collection_end -%}
  {%- assign get_canonical_url = parts[0] | append: collection_end -%}
{%- endif -%}
<link rel="canonical" href="{{ get_canonical_url }}">

Keep helper pages out of Google. The theme stores the content of its popups as normal Shopify pages. Left alone, those pages get indexed and show up in search as thin, strange results. They get a noindex tag.

Landing pages for how people search. Pet parents do not search for “dog food”. They search for “food for husky” or “shampoo for shih tzu”. So the store has landing pages by breed: pugs, huskies, German shepherds, golden retrievers, shih tzus, Indian breeds and boxers. Each one is a real page with products for that breed.

Text on collection pages. A collection page is a grid of products, and a grid has almost no words for Google to read. A rich text section at the bottom of the page holds a few paragraphs about the category.

Structured data. Product pages carry product data with an offer for every variant, so price and availability can show in search results. The header carries the organisation and the site search.

Later the store collected over 600 customer reviews, and the reviews helped the search traffic further.

Delivery made the cities possible

A store can write “we deliver all over India” on the home page in one afternoon. Keeping that promise is the hard part.

Shipping across the country runs through Shiprocket, with order tracking linked from the store header. The count of twenty-plus cities is a result of delivery working, not of anything on the storefront.

Login had to suit Indian customers

On a phone, asking for an email and a password loses people.

So login is by phone number with a one-time code. This is an app, not custom code, and I think that is the right call for login. The app sits on top of Shopify’s normal customer accounts. After the code is confirmed, it signs the customer in through the standard login form in the background. If the app is ever switched off, the theme falls back to email and password.

Payments go through Razorpay at checkout, with the methods Indian customers use every day.

Customers who buy in volume get tiered pricing through a discount app.

Two stores, one codebase

PetsFirst has a retail store and a pharmacy. They are two separate Shopify stores with separate catalogues, so medicines do not show up between toys and food.

In code they are the same theme. Only eight files differ between the two: the settings, one stylesheet, and a few templates and sections. A fix made for one store goes to the other with almost no extra work, and a customer moving between them does not feel a change.

I would set up any two-store brand this way. Keep one theme, and let the differences live in settings and a small number of files you can list.

← all writing nextBuilding a help search that finds the right article, without a search server →