Skip to content

Company software, built for humans.

Selling, picking, and closing the books shouldn’t be three jobs that meet once a month. Here a quote holds the stock. The warehouse picks it, packs it, and sends it. The tax invoice already matches — and so does the VAT201 you copy into eFiling.

sales / orders

Orders

ReferenceCustomerItemsStatusTotal
SO-1042Northridge Wholesale4 linesPickedR 24 150
SO-1041M. Naidoo1 linePackedR 12 990
SO-1039Harbour Logistics2 linesLoadedR 31 400
SO-1037Walk-in2 linesDeliveredR 3 780
Isolation
One Postgres database and hostname per company.
Documents
Quote → sales order → pick/pack/deliver → tax invoice.
Books
GL 2300 for deposits. 15% VAT on the line. VAT201 is a draft.
In use
Vellano is company one — own database, not a row in a shared table.

00/How a sale moves

Ten states. Skip one and the next is blocked.

That is slower at the till on day one. It is cheaper in a dispute six months later, when someone asks what left the building and what was invoiced.

  1. 01QuoteLines, tax, validity. Numbered QT-.
  2. 02AcceptThe customer accepts. There is no second document type invented at this step.
  3. 03Sales orderThe quote becomes an SO. Stock is reserved at a location.
  4. 04HoldAvailable-to-promise drops. Other quotes cannot take the same units.
  5. 05PickPhone or desk. Short, over, substitute — recorded on the line.
  6. 06PackWhat left the bin is what the packing sheet says.
  7. 07LoadA load has a status. Tracking is optional.
  8. 08DeliverProof of delivery closes the warehouse step.
  9. 09InvoiceRemainder after any deposit. A tax invoice, not a screenshot of the quote.
  10. 10PaidCash, EFT, or allocation against the debtor. The VAT201 draft can see it.

01/What posts

Stock, till, and books already share a chart of accounts.

A pick on the floor, a take at the till, and a line on the invoice are the same numbers. Month-end is a read, not a reconstruction.

WH-A82%
WH-B46%
Returns12%
Transit28%

Stock and warehouse

Locations, transfers, stocktakes, landed cost from the purchase order. Pick, pack, load, deliver on a phone — the warehouse console is the same quantities as the desk.

  • Bin-level if you set bins. Location-level if you do not.
  • A hold from a sales order is visible to the next picker.
  • A short pick is recorded. It does not become ‘delivered’.
Acme (Pty) Ltd — till 1
SKU-4412R 14 500
SKU-1088 ×6R 8 400
Layby deposit− R 5 000
SubtotalR 17 900
VAT 15%R 2 685
BalanceR 20 585

Sell

Till with cash-up. Layby. Quotes that become sales orders with stock held. Trade customers log in on your hostname and place orders that land as drafts.

  • Walk-in and account customers on the same till.
  • Deposit on GL 2300, not a note in a comment field.
1100Debtors control24 150
4000Sales21 000
2200VAT output3 150
2300Customer deposits5 000
1000Bank5 000

Books

Invoices, bills, credit notes, bank import, aged AR/AP. The VAT201 is a draft you copy into eFiling. We do not file it.

  • 15% on the line. Credit notes reverse the tax, not just the total.
  • Opening balances and Cin7/Xero-shaped CSVs after you are in.

02/Isolation

A company is a database, not a column.

The usual cheaper design is one Postgres and a company_id on every table. A missed WHERE clause then returns someone else’s debtor list. Each company here is CREATE DATABASE plus a hostname. Provisioning takes tens of seconds. Deploy has to migrate every ready database. Both of those are accepted costs.

Hostname
acme.stockroom.example opens only Acme. An unknown host returns 404, not the first company in a table.
Database
Own role, own database, migrations to the same schema head. Vellano’s rows are not queryable from another company’s session.
Cookie
Host-only. A session from one hostname is not sent to another. A replayed cookie with the wrong company claim is 401.
Files
Object keys are prefixed per company. Existing Vellano keys stay as they are.
Fail closed
No default company. If the host cannot be resolved, the request does not fall through to company one.

03/Company model

Who signs in, and which document posts where.

Permissions are keys on the login, not a shared password in a drawer. Trade customers use a separate cookie on the same hostname. Staff tokens and customer tokens are not interchangeable.

Roles and what each login can do
LoginCanCannot
OwnerUsers, locations, CSV import, settings, full books.Nothing hidden. This is the login created at signup.
WarehousePick, pack, load, deliver, transfer, stocktake.Price lists, posting invoices, other companies’ hosts.
Till / salesQuotes, sales orders, cash-up, layby, walk-in customers.Cost, if the permission is off. Books close and VAT201.
BooksInvoices, bills, credit notes, bank import, VAT201 draft.Skipping warehouse states to ‘make the invoice match’.
Trade customerCatalogue at their prices. Draft sales orders on your hostname.Staff screens, cost, other customers, your books.
Documents and general ledger effect
DocumentNumberWhat it does
QuoteQT-No stock hold, no GL.
Sales orderSO-Hold at a location. ATP drops.
Pick / pack / deliverWarehouse quantity. Shorts recorded.
Customer depositGL 2300 Customer deposits.
Tax invoiceINV-1100 Debtors, 4000 Sales, 2200 VAT output.
Credit noteCN-Reverses tax and, where configured, stock.
VAT201draftA read of the ledger. You copy it into eFiling.

Chart of accounts is seeded for the owner. You can add accounts. You cannot delete ones the documents still post to. Opening balances and Cin7/Xero-shaped CSVs are in settings after the first login — there is no live two-way sync on day one.

04/Defaults

Rand first. VAT on the line. eFiling stays yours.

Documents are written as if the company is already a VAT vendor. A currency dropdown on a US product still thinks in dollars and then converts.

ZAR

Home currency. Cents where the document needs them; rand rounding where SARS does.

15%

VAT on the line of the quote, the till slip, and the credit note. Not a year-end adjustment.

VAT201

A draft return, boxes filled from the ledger, for you to copy into eFiling. We do not submit it.

WhatsApp

Invoices and statements on the channel the order often already used. SMTP still works.

POPIA

The company that owns the workspace is the responsible party. We are the operator. Hosting is in the United States; that is stated on the signup form, not only in a footer. We will sign a written operator agreement on request. On a breach we notify the company so it can notify the Regulator.

05/Onboarding

Email first. Database second.

A signup that immediately provisions compute is how you get empty spam companies. We wait for the verify click. Then: a role, a database, migrations, one owner. No default till passwords, no sample locations.

  1. 1

    Company details

    Legal name, optional trading name, the hostname you want, owner email and password. Two acknowledgements: you may bind the company, and you have read that hosting is outside South Africa.

  2. 2

    Verify email

    One link, 24 hours, single use. Until you click it there is no database and no workspace. Resend is capped.

  3. 3

    Empty workspace

    Owner login only. Import SKUs or start from zero. Cin7 and Xero shaped CSVs are in settings.

    • https://acme.stockroom.example
    • https://northridge.stockroom.example
    • https://harbour-co.stockroom.example

06/Also in the workspace

Trade customers log in on your hostname. Nia reads this company’s ledger.

01

Trade portal

You invite a customer. They see your catalogue at their prices on your address — not a generic storefront. Orders arrive as draft sales orders for someone with permission to confirm. If they should not see cost, they do not.

SKU-4412
R 14 500
SKU-2201
R 12 990
SKU-7740
R 1 890
02

Nia

Questions against this company’s books: laybys past 90 days, SKUs under minimum, debtors over 60. Caps apply; it is not an unbounded chat bill. If the model key is unset, the UI says so instead of failing quietly.

Ask
Which laybys are past 90 days?
From ledger
LB-221 R 4 200 · LB-234 R 1 950 · LB-240 R 7 800. Reminder drafts if you want them sent.

07/Not this product

Do not create a workspace if any of these are true.

These are stops we already know. If your case is one of them, wait or use something else — we will not stretch the product to cover it this year.

  1. 01

    You do not hold stock

    Agencies, consultancies, and pure dropship without a location will spend their time on empty warehouses. Use something thinner.

  2. 02

    You need a custom domain on day one

    shop.yourco.co.za is on the registry later. v1 is slug.stockroom.example. If that is a board blocker, wait.

  3. 03

    You want us to be the responsible party

    We operate the software. Your company remains the responsible party under POPIA. We will not take that hat.

  4. 04

    You need billing, SSO, or cross-company memberships today

    No card on the form. No Google login. One email can exist in two company databases because users are per database; public signup does not manage that for you.

08/Questions

Before you type a company name.

If a sentence would be true of any back-office product, it is not on this list.

Is our operational data in the same database as another company?

No. Each company is a Postgres database and a hostname. Requests that cannot be resolved to a company return 404. A cookie from another hostname does not open yours.

Can warehouse staff sign in without seeing cost or the VAT201?

Yes. Permissions are keys on the login. Warehouse, till, and books are separate. Trade customers use a different cookie on the same host; staff and customer tokens are not interchangeable.

What posts when a customer pays a deposit?

GL 2300 Customer deposits. The remainder tax invoice later moves the balance. The VAT201 draft sees both when they belong on it.

What does it cost?

Nothing while we onboard the first companies. When a price exists it will be per company, in rand, with at least 60 days’ notice to workspaces already running. There is no card on the signup form.

Where is data hosted, and who is the responsible party?

Managed infrastructure in the United States. Under POPIA the company is the responsible party and we act as operator. Cross-border transfer is disclosed before signup. We notify you of a breach so you can notify the Regulator.

Can we bring SKUs from Cin7 or Xero?

CSV templates in owner settings after you are in — SKUs, customers, suppliers, opening balances. There is no live two-way sync on day one. If you need that before you move, wait; do not import twice.

Next

Create the company. Verify the email. Get a hostname and an empty database.

yourcompany.stockroom.example — no card. If the slug is taken you will find out before submit. Questions: hello@stockroom.example.