

Have you ever had that moment when your client says, “By the way, we’re adding digital products, so no shipping is needed,” and you just know the checkout flow is about to get weird?
One minute, you’re handling physical goods (quite standard), and the next, you’re wrangling shipping forms for items that live in the cloud.
Customers end up scratching their heads over why they have to enter a shipping address for a file they’ll download or stream.
You start hacking conditionals into your code; hiding shipping steps, jumping around the standard flow… and pretty soon the checkout feels like a maze.
We’ve all been there.
Instead of forcing you to rip out shipping logic by the roots, Saleor gives you a neat switch - isShippingRequired - so you can elegantly adapt your checkout for digital items.
Below is a step-by-step tutorial that shows exactly how to update Nimara’s checkout flow to skip shipping for digital items.
isShippingRequired Field to the Checkout FragmentBegin by telling your front end whether shipping is needed. Modify your checkout GraphQL fragment by adding the isShippingRequired field like so:
Without this field, your front end has no clue that some items don’t require shipping. Since Saleor can differentiate between physical and digital items, that field will tell Nimara whether or not to show the shipping steps.
Anytime you modify a GraphQL fragment, you must regenerate your TypeScript types:
This keeps your codebase typesafe, so you can rely on the fact that the isShippingRequired is recognized everywhere.
Next, open up your checkout domain object. Since your GraphQL fragment now has a new field, your domain object should reflect that:
Your domain layer is critical—it’s where your application’s business logic comes together.
This step assures your domain layer aligns perfectly with the data coming from Saleor. It’s a small but crucial detail in maintaining a clean architecture.
isShippingRequired in Nimara’s InfrastructureBefore the front-end can properly use isShippingRequired, make sure to serialize it in the Nimara infrastructure.
We’re mapping the GraphQL data into our Checkout type.
The double-bang !! operator is a neat way of converting whatever value isShippingRequired into a strict boolean value:true or false.
So downstream components don’t have to guess or handle nullish values.
Now comes the fun part: making sure Nimara knows to skip shipping screens for digital products by centralizing the logic in the validation action.
All validation and redirect logic for checkout steps is handled by a single action called validateCheckoutStepAction, which is invoked when rendering the main checkout page.
checkout.isShippingRequired to see if we need to redirect the shipping address and delivery method steps.If a user manually navigates to the shipping or delivery method pages for a digital-only checkout, we’ll politely send them back to the main checkout page.
It's a good user experience - there is no sense in letting them wonder into a shipping page if they don't need it.
Keeping users on the correct path means reducing confusion and fewer errors. It’s a small detail that contributes to a smoother overall experience.
Now, let's update the updateUserDetails action to handle what happens after users update their details.
By default, Nimara sends them to the shipping address step, but if shipping isn't required, they should go straight to payment:
Finally, let’s hide any irrelevant shipping sections, such as the shipping address form: ShippingAddressSection and the delivery method selector: DeliveryMethodSection.
Some forms, like billing address, are still crucial for taxes and compliance (especially if you’re selling internationally). Hide or show relevant sections in payment/page.tsx:
It’s good to mention that digital goods will be delivered electronically, especially if your customers are used to shipping for all purchases.
Where to include such information on the checkout page - is up to you. Just make sure it’s hard to miss so buyers know exactly how they’ll receive their digital products.
If you’ve followed all these steps, you should now have a working checkout that streamlines the process for non-shippable products.
The changes revolve around a single property isShippingRequired that influences multiple screens in your app, guiding customers to the right place.
There’s always room for more customization, but hopefully, this guide gives you a solid, real-world example of extending Nimara for a digital-first shopping experience.
If you have any questions or want to share your own checkout customizations, feel free to reach out in the Nimara community. We’d love to see what you build next!