Open to product and project roles

Hello,

Hello,

Harsh Upadhyay

Harsh here!

Harsh here!

Product and project manager who designs and builds

Product and project manager who designs and builds

A storefront that costs the same next year as it does this year.

Varxity is a streetwear brand I moved onto Shopify behind a Framer front end. The decisions that mattered were recurring cost, duty at checkout, and one inventory permission nobody had ticked.

Role

Product lead and build

Timeline

2026

Team

The product owner and me, built solo

Live

varxity.co ↗

A Varxity product page, an oversized boxy tee at sixty nine dollars with size options and an add to cart button

01

The problem

Varxity needed a real store: a designed front end, international shipping, and a checkout that doesn't surprise a buyer in another country with a customs bill on delivery. The brand is small, so anything carrying a yearly fee has to earn that fee every year.

It also arrived with a set of quiet errors. Product pages read as out of stock while inventory sat at ten. The shipping policy described a pricing model the store no longer used. The footer social links still pointed at the template author.

02

What I did

I took the one time fee over the subscription

There were two credible ways to connect Framer to Shopify. One costs roughly the same amount once. The other costs roughly the same amount every year. At this stage the difference isn't the price, it's that the second one keeps taking after the store stops being new.

I diagnosed the out of stock bug against the API, not the interface

Every product showed as unavailable. Calling the storefront API directly with the same token showed the items were purchasable, but the quantity field came back null with an access error, because one inventory permission had never been enabled on the headless channel. The front end read the quantity, saw null, and called it zero. It was a checkbox four levels deep that no amount of looking at the site would have found.

I told the founder his broken currency converter wasn't broken

A sixty nine dollar tee was showing at around nine thousand five hundred rupees, and he read it as a bug. It was import duty and tax included in the price, which is what landed pricing does. I laid out three options, recommended keeping duty inclusive, and named the trade honestly: a higher sticker price, against a customs bill arriving at the buyer’s door that only one of his carriers could even support.

I rewrote the copy that contradicted the store

The shipping page still promised flat rates and free delivery over a threshold that no longer existed in any setting. Publishing it would have been a promise the checkout couldn't keep. The policy text was rewritten against what the shipping profiles actually do.

The bug was not in the front end and it was not in the design. It was one inventory permission nobody had ticked.

03

How I ran it

This was a small job with an expensive failure mode, so the discipline sat in triage rather than in ceremony. Every claim made about the store got checked against the platform’s own API before it was treated as a bug.

Two of the three reported bugs turned out to be correct behaviour nobody had explained, and finding that out first saved the work of fixing things that weren't broken. The third was one inventory permission nobody had ticked.

The recurring cost decision was made the same way. I compared a one time fee against a yearly subscription over three years before choosing, and wrote down why, so whoever owns the store after me knows what the trade was.

04

The journey

A shopper lands on a black page with one word on it and has to choose to go further, which is the brand's whole argument. From the home page the route is shop, then a collection, then a product.

The product page is where the work is. The garment sits full bleed, the size finder answers the question that causes most returns, and the shipping cost is calculated by the carrier at checkout rather than guessed at with a flat rate.

Checkout is the one place the journey leaves Framer. The storefront is Framer and the transaction is Shopify, because checkout can never share a headless domain, and pretending otherwise costs either money or trust. Contact is the only other exit.

05

What shipped

It shipped as a live Framer storefront on the brand's own domain against a Shopify back end, with carrier calculated shipping across three zones, duty inclusive international pricing, product structured data for search, local currency in the cart by location, and a scroll lock bug traced to a single overflow rule left behind after in page navigation.

06

Impact

Storefront fee, against a yearly alternative

One time

Shipping zones, all carrier calculated

3

Flat rates and handling fees left in the store

0

Inventory permission behind the bug nobody could find

1

07

The work

The Varxity home page and its full scroll
The shop, browse all
A product page with the size finder, the accordion answering returns and international shipping, and the related pieces below
About Varxity, stripped of excess and built with intent
The sweatshirts collection with the full product description
The contact page
The Varxity home page and its full scroll
About Varxity, stripped of excess and built with intent
The shop, browse all
The sweatshirts collection with the full product description
A product page with the size finder, the accordion answering returns and international shipping, and the related pieces below
The contact page

The homepage, the story behind the brand, the shop and a collection, then a full product page with the size finder and the answers on returns and shipping, and contact.

08

Go deeper

Design system and Figma

The storefront is built directly in Framer against live product data, so the design and the catalogue are the same object. There's no separate design file to fall out of sync, which is deliberate for a store one person maintains.

Build and handover

Shopify holds the catalogue, the checkout and the inventory, a headless storefront token feeds Framer, and a merchant of record handles international duty and tax, with structured data and policy pages written against the live settings rather than the template defaults. Two written guides went over with it, so the team can run the store without me.

More

All work

→