Skip to content
kaleemsajid.com
← All posts
· 2 min read

The pandemic pushed a bookstore to ship a lending library in six weeks

product ecommerce shipping

In early 2020 my longest-running client sold books, audiobooks, and video lectures through WooCommerce. Then people were stuck at home and many were out of work, and the owner asked a product question, not a technical one: can we just give some of this away, for free, for as long as this lasts?

The instinct on a request like that is to design a whole new system. The better move was to notice I already had one.

Reuse the shelf you already built

The store’s centerpiece was a digital delivery dashboard, a customer library where everything you bought lived and streamed. A borrowed book needs exactly the same shelf. So “lending” was not a new feature; it was one new way for a book to land on a shelf customers already understood.

That reframing killed most of the scope. No new dashboard, no new player, no new delivery pipeline, just a free, time-boxed path onto the existing one.

Make the smallest new surface possible

The owner flags any product as borrowable, its page grows a Borrow now button, and a logged-in click drops the book onto the customer’s shelf at no cost:

function otp_grant_loan( $user_id, $product_id ) {
    if ( ! product_is_borrowable( $product_id ) ) return;
    add_to_library( $user_id, $product_id, [
        'source'     => 'loan',
        'expires_at' => strtotime( '+30 days' ),
    ] );
}

Access checks already ran on every stream and download, so honoring expires_at was a one-line change in code that was tested by years of real purchases, not a new risk surface.

Ship the generous version, not the perfect one

We launched in about six weeks because we scoped to the owner’s actual goal, let people keep learning right now, and not to an imagined lending platform. The store became something generous exactly when that mattered, and the same shelf still sells and lends today.

The lesson stuck: the fastest feature is usually the one you don’t build twice.