Parsware
All articles

Parsware Platform

How we run parsware.com on Parsware

The website you're reading sells Parsware, and the business behind it runs on Parsware: our leads, plans, subscriptions, trials and support tickets are tables in three ordinary solutions, and the site reaches them only through named Custom APIs. Here is what that looks like, and what it means when you start a trial.

The Parsware Sales app listing three leads that arrived through the website’s Contact us form, next to the title "How we run parsware.com on Parsware"

A company that sells an app platform could run its own business on a CMS, a CRM it bought and a spreadsheet of licences. We don't. Behind parsware.com is a Parsware tenant of our own, and the records our business runs on are tables in it, built the way any customer would build them. Every defect in the platform that our own site trips over, we find before you do.

The site in front

parsware.com is a website like any other, written in Next.js:

The parsware.com home page: The applications your business runs on, built in weeks, with Platform, For Power Apps, Pricing, Blog and Contact in the menu

Most of it is pages: the product, pricing, this blog. The parts that do something, such as Contact us, signing up, starting a trial and the account area, are where it talks to the platform:

The sign-up page on parsware.com: One account for everything: start a 30-day platform trial, manage a Parsware for Power Apps licence and its downloads, or both. Your name, Work email, Password, Confirm password and Create account

A visitor who signs up becomes a portal user: an account for an outsider, separate from the tenant's own staff, the same kind any customer's portal has (see A customer portal on your own data).

The business behind it

Our tenant has an environment called Commerce. These pictures are from a copy of it on our own machine, built from the same files. It holds four apps:

Apps in Commerce: Organisation, Parsware Commerce, Parsware Sales and Parsware Support, all model-driven

They come from three solutions, imported in order, exactly as a customer imports a sample:

Solutions in Commerce: Main, then Parsware Commerce 2.0.0, Parsware Sales 1.0.0 and Parsware Support 1.0.0, all managed and published by Parsware

  • Parsware Sales is the CRM: leads, accounts, contacts and their activities. It's also a product we sell on its own.
  • Parsware Commerce is what we sell and to whom: plans, subscriptions, licences, releases, tenant provisions, orders.
  • Parsware Support is the tickets customers open from their account.

Commerce's tables are ordinary tables a maker declared:

The Parsware Commerce solution's tables: Lead, Licence, Order, Payment event, Plan, Release, Release file, Subscription, Subscription environment and Tenant provision

Commerce is a Production environment, so when we imported Parsware Sales, the platform refused its 66 rows of demonstration data. That rule is for every customer's production environment, and it held for ours.

The site only calls named operations

The website never reads or writes a table directly. Each thing it needs is one Custom API, a named, versioned operation with its own route, in the Commerce solution:

Custom APIs in Parsware Commerce: Attach checkout session, Contact us, Create my company, Current release, Download release, Issue activation code, My account, My licences, My orders, My subscriptions, My trial, Record payment event, Record provision, Start checkout and Start trial, each with its method, path and required scope

Each operation is a short script in BS, the platform's scripting language. Contact us checks the address and writes a lead, setting the fields a form must not choose for itself (its state, its source and when it arrived):

The Contact us script: a valid email address is required, the product interest is mapped, then createRecord('pw_lead', …) with the name, email, company, phone, message, product interest, source, state and received-at

The site calls them as an App Registration, which holds one role, Website, and nothing else:

App Registrations, searched for parsware.com: parsware.com website, with the scopes modelapps.read and modelapps.write and the role Website

So the website can't do anything the list above doesn't name: no "read any table" and no "update any row". We sent three enquiries through Contact us exactly as the site does, and they're in Parsware Sales a moment later, for our sales staff to answer:

Leads in Parsware Sales: Sasha Novak of Adatum, Jamie Okafor of Fourth Coffee and Morgan Diaz of Wide World Importers, each New, received a moment ago

One customer never sees another

The operations a signed-in visitor calls, such as My subscriptions, My trial or My licences, take no customer as an input. The visitor's company comes from their own sign-in, and every script starts from it. My subscriptions opens with:

// The filter is the token's claim, and nothing else is.
var customerId = portalCustomerId();

There's no customer id in the request for anybody to change, so there's nothing to try.

Starting a trial makes a real tenant

When an Owner of a company starts a trial, Start trial writes the trial subscription and a Tenant provision row, and the site asks the platform to create a whole new tenant: a first environment and an administrator, who gets a welcome message with a link to set a password (see Sign in and open an app). The provision row follows each step, so our staff can see one that stopped half way, in the Commerce app:

The Parsware Commerce app: Subscriptions, Plans and Customers under Selling; Licences, Releases, Release files, Tenant provisions and Subscription environments under Delivery; Orders and Payment events under Money

The tenant is real from the first minute. It appears in the operator's tenant list with its trial end date:

Tenants: Wide World Importers, administrator morgan.diaz@wideworld.example, in good standing, 100 MB storage limit, trial ends 2026/11/15

When the trial ends, the rules in What happens when a trial ends apply to it like to anyone else.

What it costs us

Running the shop on the product has one cost we take seriously: the server that sells Parsware is also the one that holds customers' data. That's why the site gets one role and a fixed list of operations rather than broad access, and why the platform's own security model is the thing standing between them. The upside is the same sentence the other way round: every rule we ask you to rely on, we rely on first.

Try it

Send us a message from the Contact page and it lands in the same Leads view. Or start a trial, and your tenant is made the way this article describes.

Next: the Parsware for Power Apps series, starting with its own Start here.