License Store

Before you open your store

The License Store sells keys for your products using your vendor Stripe account. Create an internal product first, then configure payment credentials, the license issued after checkout, and the details shown to buyers.

Work through a test purchase before sharing the store. Confirm that checkout, payment webhooks, license delivery, invoice details, and cancellation behavior all match your sales model. Use matching Stripe test credentials throughout that test.

For your own PermitCore subscription and account exports, see Account & team. For license lookup and device self-service, see the Customer portal.

Licensing Features

License Store

The License Store lets your customers buy licenses directly from a branded public storefront — no coding required on your end. PermitCore hosts the checkout page and automatically creates and emails a license key when payment succeeds. You connect your own Stripe account, so revenue goes directly to you with 0% PermitCore commission.

Public license store

A branded public store at /store/{yourSlug} — your logo, your colors, your products.

How it works

1
Connect your Stripe account
Go to License Store → Settings and paste your Stripe publishable key, secret key, and webhook secret. PermitCore uses your keys to create Stripe Checkout sessions — all payments flow directly to your Stripe account.
2
Create store products
Each store product links to one of your internal products. You set the display name, tagline, description, feature bullet list, image, pricing (one-time, monthly, or annual), and which license settings to create on purchase.
3
Auto-setup Stripe products (one click)
Click Auto-Setup Stripe Products in Store → Settings. PermitCore creates a Stripe Product and the correct Prices (one-time / monthly / annual) for every active store product in your Stripe account and saves the Price IDs back to the database. Idempotent — re-running skips prices that haven't changed. A progress bar and per-product result list confirm what was created or skipped.
4
Share your store URL
Your store is live at https://permitcore.dev/store/yourSlug. Add it to your website, email footer, or documentation.
5
Customer pays → key delivered instantly
Customer selects a product, enters their email, and pays via Stripe Checkout. PermitCore receives the webhook, auto-creates a license key, and emails it to the customer within seconds.
Store product editor with live preview

The Create Store Product form before entry, with display fields and a live preview. Pricing and generated-license settings continue below.

License Store admin management

A new Store before setup: Products, Orders, Settings, and Shop Designer. Add a product and configure Stripe before accepting purchases.

Auto-Setup Stripe Products

After creating your store products, click Auto-Setup Stripe Products in Store → Settings. PermitCore automatically creates the matching Stripe Products and Prices in your Stripe account and stores the Price IDs. You never need to copy-paste price_xxx IDs manually. Re-running the setup is safe — prices that haven't changed are skipped.

Store product settings

SettingDescription
Name & SlugDisplay name and URL identifier (e.g. /store/yourco/pro-edition)
Tagline & DescriptionShort marketing text shown on the product card
Long DescriptionFull marketing copy shown on the product detail page
Feature BulletsUp to 6 bullet points shown on the card and detail page (e.g. "Unlimited exports")
PricingOne-time, monthly, and/or annual prices. Set at least one. Currency selectable.
Stripe Price IDsAuto-filled by "Auto-Setup Stripe Products" button, or enter manually for recurring subscriptions managed directly in Stripe.
BadgeOptional label on the card (e.g. "Most Popular") with custom color
Generated licenseMax activations, node-locked, trial days, expiry days, feature flags — applied to every license created on purchase
FeaturedFeatured products are shown larger at the top of the store grid

Stripe webhook setup

In your Stripe Dashboard, create a webhook endpoint pointing to:

Webhook URL
https://api.permitcore.dev/api/store/webhook/yourSlug

Enable these events: checkout.session.completed, payment_intent.payment_failed, checkout.session.expired, customer.subscription.deleted

Copy the webhook signing secret and paste it into Store → Settings → Webhook Secret.

Monthly/annual licenses are revoked on cancellation.

If you sell a monthly or annual store product, PermitCore listens for customer.subscription.deleted and automatically deactivates the license when the customer's Stripe subscription ends — no manual revoke needed. Make sure this event is enabled on your webhook endpoint, or cancelled customers will keep an active license.

0% PermitCore commission. PermitCore does not charge a sales commission. Your payment processor's fees depend on your Stripe account, region, and payment method.

Tax & Pricing

PermitCore supports configurable tax rates at checkout — a default rate that applies to all countries, plus optional per-country overrides for any country in the world (not just EU). Tax is added on top of the product price and shown as a separate line in the cart.

SettingWhereDescription
Default tax rate (%)Store → Settings → TaxApplied when no country-specific rate matches. Set to 0 for untaxed by default.
Per-country ratesStore → Settings → Tax → Country overridesEnter a comma-separated list of CC:rate pairs, e.g. DE:19, AT:20, US:0. Supports all ISO 3166-1 alpha-2 country codes.
Country shown on PDPProduct detail pageWhen a non-zero tax rate is configured, the product detail page shows a "+X% tax may apply at checkout" notice.

At checkout, the customer selects their country from a dropdown. The cart immediately recalculates and shows a subtotal / tax / total breakdown. If the buyer later enters a valid EU VAT number, the tax drops to 0% (see B2B exemption below).

Country selection is optional — customers can still purchase without entering a country. When no country is selected, the default tax rate applies. Anonymous purchases are always allowed.

EU VAT B2B Exemption

When a business customer provides their EU VAT number at checkout, PermitCore validates it in real time via the VIES SOAP API (the official EU VAT Information Exchange System). If valid, the tax rate is set to 0% under the reverse-charge mechanism — the buyer accounts for VAT in their own country.

How it works at checkout:

  1. Buyer enters their country (EU member state) in the cart.
  2. A VAT number field appears for EU countries.
  3. Buyer enters their VAT number (e.g. DE123456789).
  4. PermitCore calls VIES in real time — validation result shown instantly.
  5. If valid: tax drops to 0%. The order is flagged VatExempt = true.
  6. The generated invoice includes a reverse-charge notice as required by EU law.
VIES validation has a 5-second timeout. If the VIES service is temporarily unavailable, validation is skipped and the buyer proceeds without exemption. The VAT number is still stored on the order for your records.

B2B Invoicing

PermitCore generates professional HTML invoices for every order that can be printed as PDF from the browser. Invoices include your vendor details, the buyer's details, a line-item breakdown, tax treatment, and a reverse-charge notice when applicable.

Setup: your vendor details

Before invoices are meaningful, add your company details in Store → Settings → Invoicing:

FieldDescription
Legal Company NameYour registered company name — printed as "Sold by" on every invoice.
Your VAT NumberYour own VAT registration number — printed on invoices for B2B compliance.

Cart fields collected from buyer

FieldRequiredDescription
Company NameOptionalPrinted on the invoice as "Buyer company". Leave blank for personal purchases.
CountryOptionalDetermines the applicable tax rate. Also printed on invoice.
VAT NumberOptional (EU only)VIES-validated. When valid, triggers reverse-charge (0% tax).

Accessing invoices

WhoHow
Admin Store → Orders → click Invoice next to any order. Opens in a new tab and auto-triggers the print dialog.
Customer My Account → Orders → click Invoice next to any order. Link uses a short-lived access token — no separate login required.
The invoice opens as a full HTML page and immediately calls window.print(). Use your browser's Save as PDF option in the print dialog to get a PDF copy. Keep a downloaded copy for your accounting records.

Customer Accounts (My Account)

Buyers can create a store account to access their order history, re-download licenses, and manage their profile — without contacting you for support. Accounts are per-store (each vendor's store has its own account system).

Registration & Login

A Sign In button appears in the store header. Customers can register with name, email, password, and optional address. After registration, a verification email is sent automatically.

PageURLDescription
Login/store/{slug}/loginSign in with email + password. Includes "Forgot password?" link.
Register/store/{slug}/registerNew account: name, email, password, country, address.
My Account/store/{slug}/accountOrder history, license key reveal, profile, password change.

Email verification

After registering, customers receive a verification link valid for 48 hours. Until verified, a yellow banner is shown in My Account with a Resend link. Verification is not required to browse or purchase — it's a soft reminder.

Verification URL format
/store/yourSlug/verify-email?token=token

Forgot / Reset password

The login page has a Forgot password? link. The customer enters their email and receives a reset link valid for 1 hour. For security, the forgot-password endpoint always returns HTTP 200 regardless of whether the email exists (prevents email enumeration).

Reset URL format
/store/yourSlug/reset-password?token=token

What customers can do in My Account

TabFeatures
OrdersFull order history with product name, date, amount. Click Reveal Key to decrypt and display the license key. Click Invoice to open a printable invoice.
ProfileUpdate name, email, country, and address.
SecurityChange password. Email verification status badge + Resend button if not yet verified.
Anonymous purchases are fully supported. Customers do not need an account to buy. A registration prompt appears on the order success page — optional. If a customer later registers with the same email, their past orders are automatically linked to their account.


Licensing Features

End-Customer Expiry Notifications

PermitCore can send expiry reminder emails directly to your end customer — not just to you as the admin. When a Customer Email is set on a license, that address receives branded reminder emails at 30, 7, and 1 day before the license expires, prompting the customer to renew.

Customer Email field in Edit Metadata modal

The Customer Email field in the Edit Metadata modal — set per license, completely optional.

How to set it up

  1. Go to Licenses → View → Edit Metadata
  2. Enter the customer's email in the Customer Email field
  3. Save — the email will be used for all future expiry notifications for this license

Setting a Customer Email does not replace admin notifications — admins still receive their daily digest. This is an additional, per-license notification that goes directly to the end user.

The customer email

The email sent to the customer:

  • Is delivered using the instance's configured mail provider
  • Shows your company name as the sender — PermitCore is not mentioned
  • Includes the product name, expiry date, and days remaining
  • Asks the customer to contact you to renew
Use case: You sell annual desktop app licenses. Instead of customers manually tracking expiry dates, PermitCore sends them a reminder 30 days before expiry — giving them time to renew before their software stops working.


Licensing Features

Reseller Portal

The Reseller Portal lets you invite partner companies or distributors to issue licenses on your behalf. Each reseller gets their own login and can create licenses only for the products you authorize — with optional caps on how many they can issue.

Available on the Enterprise plan.
Resellers admin page

The reseller invitation form before submission. Choose product access and configure the partner before sending the invitation.

How it works

  1. Go to Resellers in the sidebar and click Invite Reseller
  2. Enter the reseller's name, email, and a temporary password
  3. Select which products they can sell and optionally set a max license count per product
  4. The reseller logs in with their credentials and creates licenses from their own dashboard
  5. New live activations of reseller-issued keys count against your monthly activation allowance; creating the key itself does not consume an activation

Reseller permissions

Can doCannot do
Create licenses for assigned productsAccess products not assigned to them
View their own created licensesSee other users or company settings
View order/activation counts for their licensesAccess billing or payment settings
Generate up to their per-product capExceed the license cap set by you

Managing resellers

From the Resellers page you can:

  • Deactivate a reseller — immediately blocks their login without deleting their account or the licenses they've created
  • Adjust product access — add or remove products, change the license cap
  • Monitor issuance — see how many licenses each reseller has created per product
Use case: You have a desktop app sold through 3 regional distributors. Each distributor gets a Reseller account with access to the relevant product. You cap each at 100 licenses. They log in, generate license keys for their customers, and you see all activations in your analytics dashboard.

Commission tracking

When you invite a reseller, you can set a commission percentage per product (0–100%). Every order placed through a reseller link automatically records the commission amount at the time of sale — so changing the rate later does not retroactively affect existing orders.

  1. Go to Resellers → Invite Reseller and enter a commission % for each product.
  2. When a customer purchases through a reseller link, the order records ResellerId, CommissionPercent, and the computed CommissionAmount.
  3. Open the Commissions tab on the Resellers page to see all pending and paid commissions grouped by reseller.
  4. Select one or more orders and click Mark as Paid to record payment. The system logs CommissionPaidAt and updates the reseller's running total.
FieldDescription
CommissionPercentRate set per reseller × product pair (snapshot taken at sale time)
CommissionAmountPre-computed: OrderTotal × CommissionPercent / 100
TotalEarnedRunning total of all commission amounts ever assigned
TotalPaidRunning total of commissions marked as paid
Unpaid balanceTotalEarned − TotalPaid — shown in the Commissions tab
Commission percentages are snapshots — captured at the moment of purchase. You can update a reseller's rate at any time without affecting historical orders. Resellers can view their own earned and unpaid totals via the self-service summary endpoint.