Features · Operations
Run the store from one admin, with every change on the record
Orders, stock, shipping, invoices, refunds and staff, handled from the admin compiled into the GoCommerce binary. Every stock movement lands in a ledger that reconciles, and every change says who made it.
- 12 carrier options, four of them Indian
- 11 kinds of stock movement, all on a ledger
- 50 core rights, given or withheld per role
Orders
-
Order timeline
Each order has a timeline of its events and changes, latest first, internal notes, and a log of every email and SMS sent, with a button to resend.
core/orders.go · Timeline -
Order edits
Add, remove or change lines; stock moves with them and the balance owed either way is reported. Contact details, address and shipments can be corrected too. Line edits stop once anything has shipped, been refunded or returned.
PUT /api/admin/orders/{id}/lines -
Unpaid orders cancel themselves
Every five minutes, orders still unpaid past their window (24 hours by default) are cancelled and their stock released. Staff can run the sweep on demand.
core/orders.go · SweepUnpaid -
ReturnsPartial
Record returns per line on shipped orders, capped at what shipped, with a restock decision and location for each; refunds are a separate step. Missing: exchange orders and customer-requested returns.
core/returns.go -
Order importPartial
Load order history from CSV in the store’s own layout or Shopify’s export, with a dry run. It never moves stock and fires events only when asked. Missing: mapping columns from any file.
core/transfer.go · ImportOrders
Stock and shipping
-
Stock across locations
Stock is held per variant per location, and one order can draw from several. Transfers move stock between locations; a picking sheet groups work by SKU and location.
core/inventory.go · core/locations.go -
A ledger that reconciles
Every stock change — reserve, commit, release, restock, transfer and more — is written to an append-only ledger that gocommerce doctor checks against the balances.
core/movements.go -
Shipping in several parcels
An order ships in any number of parcels by line and quantity, each through its own carrier: manual, Shiprocket, Delhivery, NimbusPost, India Post, Shippo, ShipStation, Easyship, Shippit, USPS, Onfleet or Veeqo. When a carrier refuses a booking, the admin shows the carrier’s own reason.
core/fulfillment.go · ext/fulfill-*/ -
Low-stock report and stock import
A report of variants running low, and CSV stock import that also reads Shopify’s inventory file.
GET /api/admin/inventory/low-stock -
BackordersPartial
A variant can keep selling past zero and ship in parts as stock arrives. Missing: a separate backorder status and partial payment.
core/inventory.go
Catalogue
-
Four ways to import
Product and category files run as upsert, insert only, update only or delete, each with a dry run. Delete runs the dry run first, asks you to confirm the count it found, then deletes through the same path as the delete button, audit included. Drop several CSV files at once: they run one after another, and one that fails does not stop the rest.
core/transfer_products.go · core/transfer_categories.go -
Prices from the products list
Type a product’s price and MRP in its row, or per variant, and it saves when you leave the box. Select several rows to give them one price. Needs a price shows every product with a variant at zero, and Publish refuses, by name, any that still need one.
admin/src/routes/dash/products/+page.svelte -
Categories from the taxonomy
Browse or search one built-in product taxonomy and switch on the categories the store sells; the categories above them and their product fields come too. Switching one off removes its branch, and is refused while products or the store’s own categories are in it. A store keeps its own categories alongside and can rename taxonomy ones.
core/taxonomy_master.go
Money
-
Refunds through the gatewayPartial
Staff refund any amount up to what remains, through the gateway that took the payment, each recorded with the gateway’s id. Missing: cash-on-delivery refunds through the engine, and RevenueCat refunds.
core/payments.go · Refund -
Record payments by handPartial
Mark an order paid with a reference for cash or bank transfer, or record a failed payment. Missing: manual refund records.
POST /api/admin/orders/{id}/mark-paid -
Payouts and reports
Collected, refunded and net per payment method; sales and top products; saved custom SQL reports that run read-only.
core/reports_payouts.go · core/custom_reports.go -
GST tax invoicesPartial
A store in India with a valid GSTIN that sells in rupees issues a GST tax invoice for every paid order, numbered by financial year. It carries both GSTINs, HSN codes and the place of supply, with CGST and SGST (or UTGST) within a state and IGST between states, all from what checkout charged. A tax rate can apply to one product, so mixed rates come out right. Missing: GST on delivery, which checkout does not charge, so delivery prints untaxed.
ext/invoices/gst.go · core/taxes.go -
Export to TallyPrimePartial
A GST store downloads a period’s tax invoices as two TallyPrime import files, ledgers then vouchers, so nobody retypes them. Each invoice becomes one sales voucher that matches it to the paisa, and the ledger names are set once to match the accountant’s company. Missing: a test import into TallyPrime itself. The files follow Tally’s published format.
ext/invoices/tally.go
Customers and staff
-
Customer groups and price lists
Group customers and give each group its own prices, with dates, priority, channel and quantity breaks.
core/pricing.go -
Roles and rights
Four built-in roles (owner, manager, staff and vendor) and any the store makes, each renamable, with rights you can change over 50 core rights plus those modules add. The owner always holds every right. Invite or add team members by email and sign them out everywhere, from a phone too.
core/rights.go · core/roles.go -
Scoped API keys
Keys carry a role and pass the same rights checks as a person. A key for an AI agent carries a list of reads instead, expires and is rate limited. Only owners mint them; revoked keys stay on the record.
core/api_keys.go -
Audit trail
Who changed what, with before and after values, and a history for products, categories, discounts, tax rates and locations. A change made with an API key names the key.
core/audit.go
Messages
-
Notifications you control
Edit every email and SMS template in the admin. Every message is logged with its one-time links and codes hidden, and can be resent unless it carried one. Email goes through Resend or SendGrid, SMS through Twilio or MSG91.
core/notify_templates.go · core/notifications.go -
Order alerts on Telegram
The owner hears about each new order, payment, cancellation and return through a Telegram bot of their own, set up once in the admin. Each alert can be switched off or reworded with a live preview, and the admin shows whether each one arrived, with Send again for any that did not.
ext/telegram-alerts -
Replies and product enquiries
Answer a contact message from the admin: the reply goes by email through the store’s own provider and joins the message’s thread with who sent it, once the provider has taken it. A storefront can post a question about one product into the same inbox, marked as an enquiry, and both forms are rate limited.
ext/contact/replies.go · ext/contact/enquiries.go
Store set-up
-
Each feature on its own screen
Built-in features such as payments, carriers, notifications, menus and customer sign-in are switched on and set up on their own screens. Plugins lists only add-ons: analytics, chat, marketing, search and the rest.
core/plugins.go · PluginDef.Home -
Webhooks by event
Settings › Webhooks lists the 17 events a store sends, in groups, each with a line on when it happens. Tick the ones an endpoint receives and change them later; a name the store never sends is refused.
ext/webhooks/webhooks.go · core/events.go -
The store’s currency
Each store picks the currency it sells in when it is created or later in Settings, and prices are relabelled, not converted. The currency is fixed once the store has an order that was paid or is not cancelled, so test orders cancelled unpaid do not lock it.
core/store_currency.go · core/store_profile.go
Not in GoCommerce yet
What a larger operation may expect and will not find in GoCommerce today.
- Order approvals outside B2BOnly a company buyer’s basket can wait for an approver (ext/b2b); every other order is accepted at once.
- Draft ordersAn order placed by staff is a real order at once.
- Per-channel permissionsStaff rights apply to the whole store.
- Manual price overridesStaff cannot set one line’s price by hand.
- Authorise-then-captureGateway payments settle on the provider’s success webhook.
- Gift cards and store creditNo balances of any kind.
- Single sign-onStaff sign in with email and password.
- A translated adminThe admin is in English; storefront content can be translated.
- Click-and-collectNo pickup option at checkout.
- E-invoices and e-way billsA GST invoice carries no IRN or signed QR code, and no e-way bill is made. Both need an account with a GST Suvidha Provider or the Invoice Registration Portal.
- GST credit notesA return or refund issues no credit note, and there are no bills of supply or cess.
FAQ
Questions about operations
Can staff edit an order after it is placed?
Yes, until anything has shipped, been refunded or returned: lines can be added, removed or changed, stock moves to match, and the admin reports what is owed either way. Contact details and the address can be corrected at any time.
How do I know stock figures are right?
Every movement is written to a ledger, and gocommerce doctor checks the ledger against the balances — from the command line, the admin or the API. A mismatch is reported, not hidden.
Which Indian carriers are supported?
Shiprocket, Delhivery, NimbusPost and India Post, each a module. SMS goes through MSG91 using pre-registered DLT templates, as India requires.
Can different staff see different things?
By role: owner, manager, staff, vendor and any role the store makes, each with rights you can adjust. A vendor login sees only that seller’s records. Splitting access by channel is not built yet.
Does it make GST tax invoices?
Yes, for a store in India with a valid GSTIN that sells in rupees: every paid order gets a tax invoice with HSN codes, the place of supply and the CGST, SGST or IGST split. It does not make e-invoices or e-way bills. The invoices also export to TallyPrime, though an import into TallyPrime itself has not been tested.
Read the code behind every tile
Each file named on this page is in the GoCommerce repository, MIT licensed. Run it and check.