The warehouse system built for 3PLs.

Receive, store, pick, ship and bill for every customer you serve, with scanning on the floor and a portal your customers will actually use.

Now onboarding our first warehouses.

One scan updates the stock, the customer, the invoice and the API.

From the dock door to the invoice

Everything a 3PL warehouse does in a day, in the order the goods move.

  1. Receiving

    Scan in against the order. Good or damaged, lots and expiry, over and short receipts.

  2. Putaway

    Aisle, bay, shelf and bin locations with printable QR labels. Staging until it's shelved.

  3. Picking

    Shelfie builds the pick list, earliest expiry first. Stock can't go negative.

  4. Shipping

    Ship from the dock on a phone or at the desk, with BOL and tracking numbers and a printed bill of lading.

  5. Inventory

    Every customer's stock by location, low-stock alerts and the full movement history.

  6. Billing

    Storage and handling charges itemised from that history, with invoice PDFs.

  7. Customer portal

    Customers see their stock, place orders, read invoices and message you.

  8. API and webhooks

    Integration tokens, a published API and signed event notifications.

On the floor

Scan-first, on the phone in their pocket.

Open Shelfie on a phone and it becomes the floor app: receive, put away, pick and ship, with every scan checked against the order.

  • Receive against the order: good or damaged, lot and expiry, over and short
  • Pick lists built for you, earliest expiry first, with the bin to go to
  • Put away to a bin now, or leave it in staging until there's time
  • Scan any product or bin to see what's where, and what's due today
The Shelfie floor app on a phone: Receive, Putaway, Pick, Ship, Look up and Today, with live counts A pick task on a phone: product, bin location and quantity, with the camera scanning a carton label

In the office

Every customer's stock, and the bill that goes with it.

See inventory by location for every customer you store, with one history of every movement. Billing reads that history, so storage and handling charges add up on their own.

  • Low-stock alerts against each product's reorder point
  • Storage, receiving, picking and shipment fees itemised per customer
  • Invoice PDFs, and a CSV export for your accounting system
Warehouse map in Shelfie: bins coloured by occupancy and a banner listing two products below their reorder point Billing screen listing this month's invoices for two customers with their totals

For your customers

A portal your customers will actually use.

Each customer signs in to see their own stock, orders and invoices, and nothing else. They send in orders and message your team without an email chain.

  • Live stock, and every receipt, pick and shipment as it happens
  • Inbound and outbound order requests, and their product catalogue with CSV upload
  • Their own users, with admin, manager and user roles
Customer portal dashboard for Harbor Coffee: units on hand, open deliveries and shipments, unread messages and recent activity

For your developers

An API and webhooks, not an export button.

Give each system its own token with its own role. Shelfie publishes its API reference and tells your systems when things happen, so nobody has to poll.

  • A token per integration; revoke one without touching the rest
  • Safe retries with Idempotency-Key, and clear rate limits
  • Signed webhooks for receipts, picks, shipments and low stock

Read the API reference

# Verify a delivery before trusting it
def verify(secret, header, body):
    parts = [p.split("=", 1) for p in header.split(",")]
    t = next(v for k, v in parts if k == "t")
    if abs(time.time() - int(t)) > 300:   # refuse replays
        return False
    want = hmac.new(secret.encode(),
                    t.encode() + b"." + body,
                    hashlib.sha256).hexdigest()
    return any(hmac.compare_digest(want, v)
               for k, v in parts if k == "v1")
An integration in Shelfie with its token and a webhook listening for inbound.received, outbound.shipped and stock.low

Built so the numbers hold up

  • One history

    Every stock change writes one ledger row in the same transaction. Inventory and billing read the same record.

  • No negative stock

    Picks are guarded in the database. Two pickers can't take the same last carton.

  • Roles enforced on the server

    Staff and customer roles are checked on the server against the live account, so removing someone's access takes effect at once.

  • Each customer sees only their own

    Every query is scoped to your company, and the portal to the customer signed in.

  • Signed and hashed

    Webhooks carry an HMAC signature. Integration tokens are stored hashed, never in plain text.

See it with your warehouse in mind

Pricing is set per warehouse; we'll walk you through it on the demo.

Book a demo

Thirty minutes on your receiving, picking and billing. We'll reply within one business day.

Join early access

Not ready for a demo? We'll tell you when Shelfie opens to more warehouses.