Disclosure: I make the BookNex bookstore theme for WordPress. The setup below works with plain WooCommerce; I mention BookNex only where it saves work. Full guide: https://nodethemes.com/sell-books-online-with-wordpress/
A bookshop is not a normal shop. One title usually comes as a paperback and an eBook, readers want to try the first pages, and an eBook-only cart should never ask for a shipping address. Here is the setup I use to sell books online with WordPress and WooCommerce.
1. One book = one variable product
Do not create two products for the same book. Create one variable product with an attribute called Format and two variations: Paperback and eBook.
| Paperback | eBook | |
|---|---|---|
| Virtual | No | Yes |
| Downloadable | No | Yes |
| Stock | Managed | Not managed |
| Shipping | Yes | None |
Why it matters: reviews, the product URL and the shop filters are shared. Two products would split all of them.
Note from the WooCommerce docs: variations without a price are not shown, so set a price on every variation.
2. Deliver eBooks from the protected folder
Upload the eBook file from the product edit screen (Downloadable files → Choose file). WooCommerce then stores it in its protected woocommerce_uploads folder. If you upload through the general Media Library instead, the file URL can be public.
Virtual and downloadable orders are completed automatically once paid, so the buyer gets the download link right away. You can also set a download limit and an expiry in days.
Docs: https://woocommerce.com/document/digital-downloadable-product-handling/
3. Offer a reading sample
A free sample of the first pages helps readers decide. Cut the first pages into a small PDF with a tool such as qpdf:
qpdf book.pdf --pages . 1-12 -- sample.pdf Publish the sample as a separate file and keep the full eBook protected. (pdftk and Ghostscript do the same job.) BookNex has a "reading sample" button on the product page, but any theme can link a sample file in the description.
4. Shipping messages that follow the cart
If the cart holds only eBooks, hide shipping notes and the "free shipping" progress bar. Mixed carts should still show them. Also check how your tax settings treat digital products in your country.
5. Filters readers actually use
Format, author, language, price and series are the filters people expect in a bookshop. Use attributes for them, not tags, so WooCommerce can filter by them.
Mistakes to avoid
- Two products for one book (split reviews, double the pages)
- Uploading eBook files to the public Media Library
- Forgetting to set a price on a variation
- Asking for a shipping address on eBook-only orders
- No sample, so readers leave to compare elsewhere
Launch checklist
- One variable product per title, with Paperback and eBook variations
- eBook uploaded from the product edit screen
- A test order of an eBook-only cart and a mixed cart
- Download link in the order email works
- Sample file opens on a phone
- Shipping and tax messages checked for both cart types
Where to read more
The full version, with a FAQ and screenshots, is on our blog: https://nodethemes.com/sell-books-online-with-wordpress/
If you want a theme built for this, BookNex is a paid theme (https://nodethemes.com/product/booknex-bookstore-woocommerce-theme/). The steps above need no theme at all.



