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.
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.
A branded public store at /store/{yourSlug} — your logo, your colors, your products.
How it works
https://permitcore.dev/store/yourSlug. Add it to your website, email footer, or documentation.
The Create Store Product form before entry, with display fields and a live preview. Pricing and generated-license settings continue below.
A new Store before setup: Products, Orders, Settings, and Shop Designer. Add a product and configure Stripe before accepting purchases.
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
| Setting | Description |
|---|---|
| Name & Slug | Display name and URL identifier (e.g. /store/yourco/pro-edition) |
| Tagline & Description | Short marketing text shown on the product card |
| Long Description | Full marketing copy shown on the product detail page |
| Feature Bullets | Up to 6 bullet points shown on the card and detail page (e.g. "Unlimited exports") |
| Pricing | One-time, monthly, and/or annual prices. Set at least one. Currency selectable. |
| Stripe Price IDs | Auto-filled by "Auto-Setup Stripe Products" button, or enter manually for recurring subscriptions managed directly in Stripe. |
| Badge | Optional label on the card (e.g. "Most Popular") with custom color |
| Generated license | Max activations, node-locked, trial days, expiry days, feature flags — applied to every license created on purchase |
| Featured | Featured products are shown larger at the top of the store grid |
Stripe webhook setup
In your Stripe Dashboard, create a webhook endpoint pointing to:
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.
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.
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.
| Setting | Where | Description |
|---|---|---|
| Default tax rate (%) | Store → Settings → Tax | Applied when no country-specific rate matches. Set to 0 for untaxed by default. |
| Per-country rates | Store → Settings → Tax → Country overrides | Enter 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 PDP | Product detail page | When 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).
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:
- Buyer enters their country (EU member state) in the cart.
- A VAT number field appears for EU countries.
- Buyer enters their VAT number (e.g.
DE123456789). - PermitCore calls VIES in real time — validation result shown instantly.
- If valid: tax drops to 0%. The order is flagged
VatExempt = true. - The generated invoice includes a reverse-charge notice as required by EU law.
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:
| Field | Description |
|---|---|
| Legal Company Name | Your registered company name — printed as "Sold by" on every invoice. |
| Your VAT Number | Your own VAT registration number — printed on invoices for B2B compliance. |
Cart fields collected from buyer
| Field | Required | Description |
|---|---|---|
| Company Name | Optional | Printed on the invoice as "Buyer company". Leave blank for personal purchases. |
| Country | Optional | Determines the applicable tax rate. Also printed on invoice. |
| VAT Number | Optional (EU only) | VIES-validated. When valid, triggers reverse-charge (0% tax). |
Accessing invoices
| Who | How |
|---|---|
| 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. |
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.
| Page | URL | Description |
|---|---|---|
| Login | /store/{slug}/login | Sign in with email + password. Includes "Forgot password?" link. |
| Register | /store/{slug}/register | New account: name, email, password, country, address. |
| My Account | /store/{slug}/account | Order 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.
/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).
/store/yourSlug/reset-password?token=token
What customers can do in My Account
| Tab | Features |
|---|---|
| Orders | Full order history with product name, date, amount. Click Reveal Key to decrypt and display the license key. Click Invoice to open a printable invoice. |
| Profile | Update name, email, country, and address. |
| Security | Change password. Email verification status badge + Resend button if not yet verified. |
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.
The Customer Email field in the Edit Metadata modal — set per license, completely optional.
How to set it up
- Go to Licenses → View → Edit Metadata
- Enter the customer's email in the Customer Email field
- 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
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.
The reseller invitation form before submission. Choose product access and configure the partner before sending the invitation.
How it works
- Go to Resellers in the sidebar and click Invite Reseller
- Enter the reseller's name, email, and a temporary password
- Select which products they can sell and optionally set a max license count per product
- The reseller logs in with their credentials and creates licenses from their own dashboard
- 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 do | Cannot do |
|---|---|
| Create licenses for assigned products | Access products not assigned to them |
| View their own created licenses | See other users or company settings |
| View order/activation counts for their licenses | Access billing or payment settings |
| Generate up to their per-product cap | Exceed 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
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.
- Go to Resellers → Invite Reseller and enter a commission % for each product.
- When a customer purchases through a reseller link, the order records
ResellerId,CommissionPercent, and the computedCommissionAmount. - Open the Commissions tab on the Resellers page to see all pending and paid commissions grouped by reseller.
- Select one or more orders and click Mark as Paid to record payment. The system logs
CommissionPaidAtand updates the reseller's running total.
| Field | Description |
|---|---|
CommissionPercent | Rate set per reseller × product pair (snapshot taken at sale time) |
CommissionAmount | Pre-computed: OrderTotal × CommissionPercent / 100 |
TotalEarned | Running total of all commission amounts ever assigned |
TotalPaid | Running total of commissions marked as paid |
| Unpaid balance | TotalEarned − TotalPaid — shown in the Commissions tab |