Track and manage your inventory, invoices, customers, vendors, payments and more.
Explore the docs »
Report Bug
·
Request Feature
Table of Contents
In order to start using the loom21 app you need to create an account. Here is the recommended setup flow:
- Create an account and confirm your email.
- Configure General Settings — set your language, currency, VAT, and address.
- Configure at least one payment processor (Stripe, BTCPay Server, etc.) so it appears at checkout.
- Add your Products and Services.
- Create your first Sale.
After you sign up you will receive a confirmation email to confirm your account and then you can sign in.
The Dashboard is the first page you see after signing in. It gives you an at-a-glance overview of your business performance for the selected time period.
Key features:
- Period selector — Choose from the last 30 days or any of the previous 6 calendar months to compare your performance over time.
- KPI cards — At the top you will find summary cards showing:
- Total fiat revenue (card and bank payments)
- Total Bitcoin revenue (in satoshis)
- Number of paid invoices, broken down by payment method (Bitcoin vs. fiat)
- Delivery orders completed and those still pending confirmation
- Paid payment links, broken down by payment method
- Trend indicators (up/down arrows) so you can quickly see whether your numbers are improving.
- Sales chart — A bar chart showing daily sales volume for the selected period.
- Payment Links chart — A bar chart showing daily payment link activity.
- Deliveries chart — A bar chart showing daily delivery order activity.
- Activity feed — A chronological list of recent events across sales, deliveries, and payment links.
- Light / Dark mode toggle — Switch between light and dark themes using the icon button in the top-right corner of the Dashboard toolbar. Your preference is applied immediately across the whole application.
A payment link is a unique URL you can share with customers to accept payments for a product, service, or donation — no login required on the buyer's side. Once created, you can copy the link, send it by email or message, or embed it anywhere.
How to create a payment link:
- Navigate to Payment Links from the sidebar and click New.
- Fill in the details:
- Name — what the buyer will see (e.g. "Workshop Ticket").
- Currency — the currency for this link.
- Amount — the fixed price, or toggle Variable Amount to let the buyer enter their own amount within a min/max range you define.
- VAT — enable and set a VAT percentage if applicable.
- Description — optional details shown to the buyer.
- Image URL — add a product photo that appears on the payment page.
- Short Code — a memorable short identifier for the link (optional).
- Expiration Date — automatically deactivate the link after a specific date.
- Stock Count — limit the total number of purchases through this link.
- Max Per Order — limit how many units a single buyer can purchase at once.
- Select the payment methods to offer (only enabled processors appear here).
- Add promo codes if you want to offer discounts — each code has a name, a discount value, and a type (percentage or fixed amount).
- Click Save.
After saving, the link URL is shown at the top of the page. Use the Copy button to copy it to your clipboard, or Preview to open it as a buyer would see it.
Pausing a link — click the status toggle to pause a published link (buyers will no longer be able to pay) or re-publish it. You will be asked to confirm the change.
| Processor | Payment Type |
|---|---|
| Stripe | Credit / Debit Card |
| BTCPay Server | Bitcoin Lightning & On-chain |
| Misty Breez | Bitcoin Lightning & On-chain |
| Speed Wallet | Bitcoin Lightning & On-chain |
| LNBits | Bitcoin Lightning |
🔔 More payment processors are coming soon.
The Sales page lists all your sale orders. You can search by order number or customer name. Create a new order with the New Order button, or open an existing order by clicking the purple arrow icon.
Order header fields (left panel):
- Serial Number — auto-generated, but editable.
- PO Number — the customer's purchase order reference, if applicable.
- Order Date / Due Date — when the order was placed and when payment is expected.
- Status — track the order through Draft, Sent, Paid, etc.
- Store — select which store the goods are dispatched from (affects inventory levels; not applicable for services).
- VAT — enable or disable VAT per order; the percentage is inherited from your General Settings.
- Discount % — apply an overall percentage discount to the order total.
- Note — any internal note or instructions.
Adding items:
- Type directly into the product search field to add items one at a time.
- Click Select Items to search and tick multiple products or services at once.
- Click Order History (available once a customer is selected) to view that customer's previous purchases and re-add items from past orders in one click.
Automatic price resolution — when you select a product and a customer, the system automatically looks up the best applicable price from your Price Lists and Customer Price Overrides. The unit price field updates instantly; you can still edit it manually if needed.
Customer selection — search and select a customer to automatically populate the shipping and billing address. You can modify the address fields directly on the order if needed.
The toolbar on a saved order gives you quick access to all payment and document actions:
Pay — a dropdown button showing every enabled payment processor. Choose one to open the payment dialog:
- Stripe — the customer enters card details directly in a secure dialog.
- Bitcoin processors (BTCPay Server, Misty Breez, Speed Wallet, LNBits) — a QR code and Lightning/on-chain payment address is displayed. Bitcoin payments are confirmed in real time — the order status updates automatically the moment the transaction is settled, without needing to refresh the page.
Send — saves the order and opens a dialog with the payment URL and print URL that you can copy and share with the customer.
Download — a dropdown to generate and download PDF documents:
- Quote — available before payment.
- Invoice — available once the order is marked as paid.
- Receipt — available once the order is marked as paid.
- Pickup List — available at any time.
Set as Paid — manually mark the order as paid (for cash or other offline payments).
Export JSON — download the full order data as a JSON file.
Copy Order — creates a new draft order pre-filled with the same customer, line items, payment methods, addresses, VAT settings, discount, currency, and notes as the current order. The copy is assigned the next available order number and opens immediately so you can review and adjust it before saving. Use this to quickly repeat a previous order or use an existing order as a starting template.
🔔 All features within the application are protected by authentication, except for the links generated through the Send button.
The Reports section gives you detailed insight into your sales and delivery activity. Navigate to Reports from the sidebar to choose a report type.
The Sales Report shows a full, searchable, and filterable list of every product or service that has been sold — one line per line item across all orders.
How to use:
- Navigate to Reports → Sales Report.
- Use the search bar at the top to find items by product name or serial number.
- Click Filters to expand the filter panel and narrow results by:
- Date range — select a start and end date.
- Category — filter by product category.
- Measure — filter by unit of measurement.
- Brand / Model — filter by brand, and then by specific model within that brand.
- Customer — type a customer name to search and filter by a specific buyer.
- Press the Search button (magnifying glass) to apply your filters.
- Click Clear to reset all filters and start fresh.
- Use the Export menu to download the report:
- Export CSV — downloads a spreadsheet-compatible file you can open in Excel or Google Sheets.
- Export JSON — downloads a structured data file for technical use.
- Results are sortable by clicking any column header. Use the pagination controls at the bottom to navigate through large result sets.
- Click the arrow icon on any row to navigate directly to the original sale order.
Columns shown: Product name, barcode, serial number, quantity, note, unit price, total price, customer name, measure, category, and date.
The Deliveries Report provides the same detailed, filterable view for delivery orders — showing every product that has been received as a delivery, along with supplier and date information.
Use it in the same way as the Sales Report: apply filters, search, sort, and export as needed.
Configure your organization's preferences and payment processors here. Payment processors must be set up in this section before they become available as options at checkout or in payment links.
This is where you configure your organization's core identity and preferences. These settings affect the whole application.
Company details:
- Company Name, Email, Phone — appear on printed invoices and documents.
- Billing Address — your organization's address, also printed on documents.
Localization:
- Language — changes the application language. The page reloads automatically when you save a language change.
- Currency — your primary operating currency. Affects prices, totals, and reports throughout the app.
- Default Store — the store pre-selected when creating new sales and deliveries.
VAT settings:
- Enable VAT — turns VAT on globally. You can still toggle it per order.
- VAT Number — your organization's tax registration number, printed on invoices.
- VAT Percentage — the default rate applied to new orders.
Inventory control:
- Forbid Negative Quantity — when enabled, the system will not allow a sale that would take a product's stock below zero.
Bitcoin settings:
- Hide Bitcoin Prices — removes all Bitcoin price displays and payment options across the app.
- Override Bitcoin Rate — lets you enter a fixed exchange rate instead of using the live market rate. Useful for invoicing in a fixed BTC price.
- Use Bitcoin Only — hides fiat totals and shows only Bitcoin amounts.
Theme:
- Dark Mode — toggle between light and dark theme. This can also be toggled quickly from the Dashboard.
- To accept fiat payments via Stripe, configure your Stripe Publishable and Secret keys.
- Self-hosted Bitcoin payment processor supporting both Lightning and on-chain payments.
- Configure your BTCPay Server URL and API Key to enable it.
- Non-custodial Bitcoin wallet supporting both Lightning and on-chain payments.
- Enter your Misty Breez API Key to enable it.
- Bitcoin wallet supporting both Lightning and on-chain payments.
- Enter your Speed Wallet API Key to enable it.
- Open-source Lightning Network accounts system. Supports multiple wallets and extensions.
- Configure your LNBits URL and API Key to enable it.
The Product Settings section (found under Settings in the sidebar) groups several configuration pages that control how your products are organized, described, and priced. Use the sub-navigation to switch between:
- Brands & Models — manufacturers and product model lines
- Categories — groups for organizing products
- Measures — units of measurement
- Custom Fields — additional fields you define for product data
- Price Lists — tiered and customer-specific pricing rules
Categories let you group related products together, making them easier to find and filter across the app — on the Products list, in Inventory, and in Reports.
Adding a category:
- Navigate to Settings → Product Settings → Categories.
- Click Add (or the + button) to open the category form.
- Enter a Name for the category (e.g. "Electronics", "Clothing", "Raw Materials").
- Click Save. The new category appears in the list and is immediately available to assign to products.
Editing a category:
- Find the category in the list and click the edit icon on its row.
- Update the name as needed.
- Click Save. The change is reflected everywhere the category is used.
Deleting a category:
- Click the delete icon on the category row.
- Confirm the deletion when prompted.
Products already assigned to that category are not deleted — they simply lose the category association and will show no category until you reassign them.
Measures define the units of measurement used when describing product quantities — for example, kilograms, liters, pieces, or meters. Once defined, a measure can be assigned to any product or service and is used throughout the app in inventory, sales, and reports.
Adding a measure:
- Navigate to Settings → Product Settings → Measures.
- Click Add (or the + button) to open the measure form.
- Enter a Name for the unit (e.g. "Kilogram", "Piece", "Liter").
- Click Save. The measure is now available to assign to products and services.
Editing a measure:
- Find the measure in the list and click the edit icon on its row.
- Update the name as needed.
- Click Save. The updated name is reflected wherever the measure is used.
Deleting a measure:
- Click the delete icon on the measure row.
- Confirm the deletion when prompted.
Products already using that measure are not deleted — they simply lose the measure association and will show no unit until you reassign them.
If your products are associated with manufacturers or brand names, you can manage those brands here. Each brand can have multiple models beneath it, which you can then assign to individual products for more detailed categorization and reporting.
How to use:
- Navigate to Settings → Product Settings → Brands.
- Click Add to create a new brand. Enter the brand name, an optional description, and a logo URL if you have one.
- Click a brand in the list to see its details on the right side and manage its models.
- Within the brand detail panel, click Add Model to create models (e.g. specific product lines or versions) belonging to that brand.
- Use the edit and delete buttons to update or remove brands and models as needed.
Once brands and models are set up, you can assign them to products on the product edit page. This lets you filter the Sales Report by brand or model to see exactly which product lines are performing best.
Custom Fields let you add your own data fields to every product in your catalog — beyond the standard fields like name, price, and category. For example, you might add a "Warranty Expiry Date," a "Supplier Reference Number," or a "Certified" checkbox.
How to use:
- Navigate to Settings → Product Settings → Custom Fields.
- Click Add Field to define a new custom field. You will be asked to enter:
- Label — the name shown on the product form (e.g. "Warranty Expiry").
- Field Name — a short internal identifier (no spaces, e.g.
warrantyExpiry). - Data Type — choose from Text, Number, Decimal, Yes/No, or Date.
- Required — whether the field must be filled in before saving a product.
- Default Value — an optional pre-filled value.
- Use the drag handle (the grip icon on the left) to reorder fields — this controls the order they appear on the product form.
- Use the toggle switch to activate or deactivate a field without deleting it. Inactive fields are hidden on product forms but their data is preserved.
- Click the edit or delete icons to modify or remove a field definition.
Once custom fields are defined, they appear as an additional tab called Custom Fields on every product's edit page, where you can fill in the values for each product.
Price Lists give you full control over your pricing strategy. Instead of using a single fixed price per product, you can create multiple price lists — for example, a "Wholesale" list with lower prices, a "Retail" list, or a seasonal promotion — and assign specific prices per product within each list.
Within each price list you can also set quantity-based tiers (the price automatically drops when the customer orders more), apply percentage discounts, or even define a formula that calculates the price dynamically.
In addition, you can set customer-specific price overrides directly on a product — so one particular customer always gets a special price regardless of the active price list.
- Navigate to Settings → Product Settings → Price Lists.
- Click New Price List to expand the creation form.
- Enter a name (e.g. "Wholesale 2025"), select the currency, and optionally set a Valid From / Valid To date range to make the list active only during a specific period.
- Check Default if this should be the primary price list used when no other rule matches.
- Click Save. The new list appears in the left panel.
- Click on a price list in the left panel to open it.
- In the Tiers section, use the product search box to find the product you want to add.
- Fill in:
- Min Qty — the minimum quantity the customer must order to get this price (leave blank for "any quantity").
- Price — the sale price for this product in this list.
- Discount % — an optional percentage discount applied on top of the price.
- Formula — an advanced option that lets you enter a mathematical expression to calculate the price automatically (e.g.
BasePrice * 0.85to always apply a 15% reduction). Available variables:BasePrice,Quantity, and any custom fields you have defined.
- Click Add Tier. You can add multiple tiers for the same product with different minimum quantities to create volume-based pricing steps.
- Use the edit and delete icons on each tier row to modify or remove them.
- Use the toggle switch next to each price list name to activate or deactivate it without deleting it.
- Click the delete icon next to the price list. You will be asked to confirm. Deleting a price list also removes all its tiers.
If you already have a list of products, services, customers, or suppliers in a spreadsheet, you can import them directly instead of entering each one by hand.
Accepted file format: CSV (.csv) only. The first row must be a header row with the exact column names listed below. Column order does not matter, and any column not marked as required can be left out entirely.
How to import:
- Navigate to Settings → Product Settings → Import Templates.
- Download the template for the type of data you want to import (Products, Services, Customers, or Suppliers) to get a pre-formatted CSV file you can fill in.
- Open the template in Excel, Google Sheets, or any spreadsheet application and add your data — one row per item.
- Save or export the file as CSV, then return to the Import Templates page and upload it using the Upload button for the appropriate import type.
- If any rows contain errors (such as a missing required field), the system will show you a list of problems to fix before the import can proceed. Correct the issues in your file and upload again.
Once imported successfully, your records are immediately available in the corresponding section of the app.
| Column | Required | Description |
|---|---|---|
Name |
Yes | The product or service name |
PriceSale |
No | Selling price (must be 0 or greater) |
PriceDelivery |
No | Cost / delivery price (must be 0 or greater) |
Code |
No | Your internal product code or SKU |
Abr |
No | Short abbreviation for the product name |
Barcode |
No | Barcode number |
Category |
No | Category name (must already exist in Product Categories) |
Measure |
No | Unit of measurement (must already exist in Measures) |
Brand |
No | Brand name (must already exist in Brands & Models) |
Model |
No | Model name within the brand (must already exist in Brands & Models) |
Supplier |
No | Supplier name for reference |
Note |
No | Internal note |
Image |
No | URL to a product image |
Discontinued |
No | true or false — marks the item as discontinued |
Services use the same column format as Products.
| Column | Required | Description |
|---|---|---|
Name |
Yes | Company or person name |
ContactName |
No | Name of the primary contact person |
Email |
No | Email address |
Phone |
No | Phone number |
Website |
No | Website URL |
TaxNumber |
No | VAT or tax registration number |
Note |
No | Internal notes |
AddressLine1 |
No | Street address, line 1 |
AddressLine2 |
No | Street address, line 2 |
City |
No | City |
Region |
No | State, province, or region |
Postcode |
No | Postal or ZIP code |
Country |
No | Country name |
BitcoinAddress |
No | Bitcoin address for the contact |
Customers and Suppliers use the same column format.
The Accounts page shows all users who have access to your organization. Each row displays the user's email, first name, last name, company name, website, and phone number.
Inviting a new user:
- Click the Invite button.
- Fill in the new user's email address, password, first name, last name, and phone.
- Assign one or more Roles using the checkboxes — roles control which parts of the app the user can access.
- Save — the user can now sign in with the credentials you created.
Editing a user:
- Click the edit icon on any row to update their details or change their role assignments.
Removing a user:
- Open the user's edit page and click Delete to remove their access.
You can invite an unlimited number of users to your organization.
The Products list lets you search by name or code, filter by Category, Measure, Brand, and Model (selecting a Brand enables the Model filter), and import/export your catalog (CSV or JSON). The table shows each product's name, code, abbreviation, measure, category, barcode, delivery price, sale price, and creation date.
Click New Product to create one, or click the arrow icon on any row to open it. Available fields:
- Name (required), Abbreviation, Code, Note
- Category, Measure
- Brand & Model — assign to a brand and model (configured in Brands & Models); selecting a brand enables the model dropdown.
- Delivery Price — the cost price used when receiving stock via delivery orders.
- Sale Price — the default selling price (can be overridden by Price Lists).
- Bitcoin prices — if Bitcoin is enabled, separate Bitcoin price fields appear with arrow buttons to convert between fiat and Bitcoin at the current exchange rate.
- Barcode & QR Code — enter or scan a barcode; a QR code is generated automatically.
If you have defined custom fields in Settings → Custom Fields, each product's edit page will include a Custom Fields tab. Here you can fill in the values for those extra fields — such as a warranty date, a supplier reference, or any other information specific to your business.
- Open a product by clicking the purple arrow on the Products list.
- Click the Custom Fields tab.
- Fill in the values for each field displayed.
- Click Save to store the custom data for this product.
Each product also has a Pricing tab that lets you view and manage how this specific product is priced across all your price lists, as well as any customer-specific overrides.
Price List Tiers — For each price list you have created, you can see the pricing tiers already set for this product. You can delete a tier here; to add new tiers or edit existing ones, navigate to Settings → Product Settings → Price Lists.
Customer Price Overrides — You can set a special price for a specific customer for this product. Click Add individual price to:
- Search for and select a customer.
- Enter the override price (and optionally a minimum quantity, a formula, or a validity date range).
- Click Save.
Test Price Resolution — Enter a quantity and optionally select a customer, then click Resolve Price to see exactly which price the system will calculate for that combination. The result shows the final price and whether it came from a customer override, a price list tier, or the base product price.
Services are managed from a dedicated Services page in the sidebar. The list supports the same search, filter (Category, Measure), import, and export (CSV or JSON) capabilities as the Products list.
Service fields:
- Name (required), Abbreviation, Code, Note
- Category, Measure
- Delivery Price, Sale Price (and Bitcoin equivalents if Bitcoin is enabled)
- QR Code — auto-generated from the code field for easy scanning.
Services differ from products in two key ways:
- They are not tracked in inventory — selling a service never reduces stock.
- They have no Brand, Model, Barcode, Custom Fields tab, or Pricing tab.
The Inventory page shows current stock levels for all your products across all stores. Stock is updated automatically as you record sales (which reduce stock) and delivery orders (which add stock).
Filtering inventory: Click Filters to expand the filter panel and narrow the list by:
- Search — find a product by name.
- Store — show stock levels for a specific location.
- Category, Measure, Brand, Model — further narrow to specific product groups.
The table shows each product's current quantity, unit of measure, category, brand, and model.
Manual stock adjustments: Click the edit icon on any product row to open the adjustment dialog:
- Add — enter a quantity and select a store to increase stock (e.g. after a physical stock count).
- Remove — enter a quantity and select a store to decrease stock.
This is useful when correcting discrepancies found during a stock count, or recording stock that was damaged or returned.
Stores represent your physical locations or warehouses. Inventory is tracked per store, and each sale or delivery order is linked to a specific store.
Store list — stores are displayed as cards, each showing the store name, abbreviation, address, and phone number.
Adding or editing a store:
- Click Add Store (or the edit button on an existing store card).
- Fill in:
- Name (required) — the full name of the store or location.
- Note — any internal notes.
- Address — street address and phone number for this location.
- Click Save.
To delete a store, open it and click the Delete button.
Delivery orders record incoming stock from suppliers. Each delivery you confirm automatically increases the inventory of the received products in the selected store.
- Create a new delivery order with the New button.
- Search existing orders and open them with the purple arrow icon.
Order header fields (left panel):
- Order Number — auto-generated reference, editable.
- Order Date / Due Date — when the order was created and when it is expected.
- Supplier — search and select the supplier for this delivery.
- Store — the destination store where received stock will be added.
- Include Tax — toggle whether tax is included in item prices.
- Status — track the delivery from Draft through to Delivered.
- Note — any internal remarks.
Adding items:
- Search for products by name and add them one at a time, or use Select Items to multi-select.
- Enter the quantity and unit price for each item received.
- The subtotal, VAT, and grand total are calculated automatically.
Documents — use the Download button to generate and download a PDF:
- Delivery invoice, receipt, or pickup list.
Address — the supplier's delivery address is populated automatically when you select a supplier. You can edit it per order if needed.
This page allows you to easily manage your customer database. Key features include:
- Search Customers: Quickly find customers by name using the search bar.
- Import Customers: Bring in customer data from external sources.
- Create or Edit Customers: Add new customers by pressing the blue button or modify existing customer details by clicking the purple arrow.
On this page, you can manage and update detailed information for each customer. The available fields include:
- Name — the customer's full company or person name.
- Contact Name — the specific person to address at that company.
- Tax Number — the customer's VAT or tax registration number, printed on invoices.
- Note — any internal notes about this customer.
- Phone, Email, Website — contact details.
- Price List — optionally assign one of your Price Lists to this customer. When set, all new sale orders for this customer automatically use that price list instead of the default one.
- Multiple Addresses — add and manage multiple delivery or billing addresses for the customer.
Suppliers are managed in a dedicated Suppliers section accessible from the sidebar. The list view lets you search, import, export (CSV or JSON), and paginate through your supplier records.
Supplier details (when creating or editing):
- Name (required), Contact Name, Tax Number, Note
- Phone, Email, Website
- Multiple Addresses — add as many delivery addresses as needed.
The key distinction from customers is in their usage:
- Suppliers are selected when creating Delivery Orders (incoming stock).
- Customers are selected when creating Sale Orders (outgoing sales).
Unlike customer records, suppliers do not have a Price List assignment.
Click your name or the profile icon in the top navigation bar to access your User Profile. Here you can update your personal information independently of the organization-wide settings.
Profile Information:
- First Name, Last Name
- Email address
- Phone number
- Company Name
- Website
Click Save to apply any changes.
Change Password — a separate form at the bottom of the page:
- Enter your Current Password.
- Enter a New Password (minimum 8 characters).
- Confirm the new password.
- Click Change.
loom21 - @loom21app
Project Link: https://github.com/loom21/loom21doc
















