Admin GuidesBilling Portal

Billing

Who this guide is for: The organization Owner (or members holding a custom role that grants Billing), who manages the subscription, payment methods, and invoices for your EmbayLMS portal.


Overview

The billing page lets you see your current plan and usage, change plans, manage the cards on file, review live invoices, set your billing contact, and cancel.

Payment processing and the subscription itself are handled by Stripe. EmbayLMS never sees or stores your full card number — card fields are rendered inside Stripe-hosted iframes, and only the brand, last four digits, and expiry are retained for display. This keeps the platform within PCI DSS SAQ A scope.

How billing works (ADR-016): Stripe Billing is the system of record for your subscription, plan, renewal date, and invoices. The billing page reads this data live from Stripe, so changes appear immediately. HubSpot is used only as a one-way CRM mirror for our sales/success teams — it is not part of your billing.


Prerequisites

  • The Owner role, or a custom role that grants Billing
  • A valid credit or debit card to put on file for paid plans
  • Your finance team’s billing email and PO number, if your organization requires them

1 — Who can access billing

Billing is visible only to the Owner, and to members holding a custom role that grants Billing. Every other role, Admins included, is redirected away from the page.

Billing is Owner-level. To give someone billing access without making them an Owner, the Owner creates a custom role that grants Billing under Settings → User Management → Roles and Permissions and assigns it under Users → [user] → Roles. See the User Management guide. Custom roles are a Growth feature (see §2b).

Viewing the page and changing anything on it are two separate grants: a custom role can allow viewing billing without allowing changes. Plan changes, cards, the billing contact, purchase-order requests, licence reductions and cancellation all need the change grant, which the Owner always has.


2 — Viewing your plan and usage

Navigate to Billing. The top card shows:

  • Current Plan — the plan name, with a status pill: Active, Trial, Payment Due or Cancelled
  • Price — charged per active user per month, in CAD, at the rate of the billing cycle you are on (the Free plan shows Free; Enterprise shows Custom pricing)
  • Active users this month — anyone who signed in at least once during the current billing period. On the standard per-active-user plans, this is the same count EmbayLMS sends to Stripe for your invoice. A negotiated licensed-seat or flat-fee agreement bills differently (see §7b). When your plan has a user cap (Free) or your subscription carries a committed quantity, a usage bar shows the count against that number.
  • Licensed users — the total number of active accounts provisioned in your organization
  • Active courses — published courses, shown against your plan’s course limit (the Free plan includes 3 active courses; paid plans are unlimited)
  • Storage — content storage used by your course files (SCORM packages, videos, documents), shown against your plan’s storage limit (Free 1 GB, Starter 50 GB; Growth and Enterprise unlimited under fair use)
  • What’s included — the capabilities advertised for your current plan

Below that, two cards show your Billing cycle (monthly or annual) and Next renewal date. If Stripe has not yet reported a value, the field reads Not available rather than showing a placeholder.

If your plan includes selling courses, a Platform fee on course sales card sits below those two. It shows the rate Embay keeps on each sale, after discounts and before tax. The rate is read-only: everyone who can open Billing sees it, and only Embay can change it. For how the fee is set and charged, see Stripe Connect payments.

Active users vs. licensed users: You are billed on active users this month, not on the total number of accounts. Provisioning extra accounts that never sign in does not increase your bill.

Free plan limits ARE enforced (PRD §7.6, 2026-07-04): on the Free plan, adding a 6th active user — by create/invite, CSV import, self-registration, or reactivating a deactivated account — is blocked with an upgrade prompt. Deactivating a user frees a seat immediately. Paid plans stay uncapped: they price on a smooth per-active-user curve (§7.6), so creating users, sending invites, and enrolling learners are never blocked. A committed quantity, if your subscription has one, is never a cap: going over it is shown (usage bar and a banner), not enforced.

The storage limit IS enforced: uploading a file that would push you past your plan’s storage cap is blocked with an upgrade prompt — on every plan with a cap, not just Free. Existing content is never deleted; deleting or replacing large course files frees space.

The course limit IS enforced: on the Free plan, publishing a 4th active course is blocked with an upgrade prompt. Courses that are already published are never taken down by the limit — it applies only when you activate another course (including scheduled publishes, which wait until a slot frees up or you upgrade). Archiving or deleting a published course frees a slot immediately.


2b — Plan-locked features (lock icons in the menu)

Some features are included only from a specific plan:

FeatureIncluded fromNotes
Custom branding (theme, fonts, custom domain, pages, footer)StarterLogo & favicon upload are free on every plan — only the deeper branding options are plan-gated
Custom CSS (raw stylesheet with stable hooks, preview, history)GrowthMoved out of Custom branding in v1.62 (LMS-1009). A sheet saved on a higher plan keeps rendering after a downgrade; only new edits are locked
White-label (remove the Powered by badge, use your platform name)GrowthBelow Growth the badge always shows and a saved platform name is kept but not applied
CertificatesStarter
SSO / SAMLStarter
E-commerce (selling courses)StarterLocks new selling only: checkout, the Payments (Stripe) setup, and Coupons. Your Orders and Revenue history stay visible on every plan
Custom user fieldsStarterManaging field definitions locks; values already saved on user profiles stay visible in profiles and exports
API access & webhooksGrowthOne developer surface: API keys and webhook endpoints share the gate
Advanced automations (recurring assignments)Growth
Custom rolesGrowthCreating/editing custom roles locks; the built-in roles and any custom roles already assigned keep working — a downgrade never breaks anyone’s access. Deleting a custom role is always possible
Report builder & scheduled reportsGrowthStandard dashboards and one-off exports stay on every plan; scheduled deliveries pause (never deleted) while below Growth
Skills management (Skills Library, course and quiz skill mapping, self-assessment and validation, each person’s skill sheet)StarterSkill levels people earn by completing courses and passing quizzes keep being recorded on every plan, and learners still see the levels they hold under Achievements. An upgrade shows the full history
Skills planning (team skills matrix, coverage targets, gap list, training plans)GrowthThe team skills matrix, group coverage targets and the gap list are available (guide); training plans arrive in a later release
SCIM provisioningEnterprise

When your plan does not include a feature, the admin panel shows it as locked:

  1. Lock icon in the left menu and on tabs — menu entries and on-page tabs for locked features (for example the SSO tab on a Free plan, or Payments on a plan without e-commerce) show a small padlock. Hovering shows which plan unlocks it.
  2. Upgrade screen instead of the page — opening a locked feature shows a “not included in your plan” screen naming the plan that includes the feature, with a View plans & upgrade button that takes the Owner (or anyone whose custom role grants Billing) to this billing page. Everyone else, Admins included, is asked to contact their administrator instead, since only the Owner can change the plan.
  3. Inline lock on shared pages — when a locked feature lives on a page that also hosts included features (the custom-roles section of Roles and Permissions, or the Colors/Domain/CSS sections of Branding), only that section shows an inline upgrade banner; the rest of the page keeps working.
  4. Upgrade prompts on blocked actions — actions blocked by a usage limit (adding a user past the Free cap, publishing a course past the course limit, uploading past the storage limit) show the same upgrade prompt inline.

Locked features never lose data: anything you configured while on a higher plan (for example an IdP connection set up during a trial) is kept and works again as soon as the plan includes the feature.

Not seeing locks you expect? Feature locks apply once your organization has a subscription record. If your portal predates plan enforcement, features remain available until a plan is assigned — your account manager can confirm your status.


3 — Changing your plan

The plan cards under Choose your plan mirror the public pricing page: each plan lists its price and included features, and your current plan carries a Current plan label.

  1. Navigate to Billing.
  2. Choose Monthly or Annual above the plan cards. The prices on every card update to the cycle you picked.
  3. Find the plan you want in the plan cards.
  4. Click the plan’s button, which names the plan: for example Upgrade to Growth or Downgrade to Starter. The change is made as soon as you click; there is no separate confirmation step, except on your first paid plan, where the card form below opens first.

What happens depends on the direction of the change:

ChangeWhen it takes effectBilling
Upgrade (e.g. Starter → Growth)ImmediatelyStripe charges a prorated amount for the rest of the current period; the new features are available at once
Upgrading from Free to a paid planImmediately, once a card and billing address are on fileAn Add a payment method form opens in-page to collect your card and your billing address. Both are required. When you confirm, your existing subscription moves up to the paid plan and Stripe charges the prorated amount right away.
Downgrade (e.g. Growth → Starter)At the end of the current periodYou keep your current features until then; the lower price applies on renewal. A notice under the plan cards shows the effective date.
Downgrade to FreeAt the end of the current periodYour subscription stays in place but moves to the $0 Free plan on renewal — it is not cancelled.
Enterprise—The Contact sales button opens an email to our sales team rather than a self-serve checkout

A scheduled downgrade can be undone before it takes effect: click Keep my current plan in the notice under the plan cards.

If you have no live subscription (a paid trial that never added a card, or a cancelled subscription), choosing a paid plan opens a Stripe checkout in an Upgrade your plan window instead. In that state the button on the plan you are on reads, for example, Resubscribe to Starter.

Billing address (required on your first paid plan)

The upgrade form asks for a Billing address next to the card. It is required, and the upgrade button stays disabled until the address is complete.

We ask for it here and nowhere earlier because this is the first point at which it matters. A Free plan costs $0, so there is no sales tax to work out and no reason to collect an address. The moment you move onto a paid plan, Canadian sales tax applies, and Stripe needs to know which province and country you are in to calculate it.

FieldRequiredNotes
CountryYesDetermines which taxes apply
Address line 1Yes
Address line 2No
CityYes
Province / StateYes in Canada and the USSelected from a list
Postal codeYesWith the country, this is the minimum needed to determine the tax rate

The address is stored on your Stripe customer record and used for two things: calculating tax and printing on your invoices. Only the upgrade form asks for it; the Add card form under Payment method does not.

Prices exclude tax. The price shown on a plan card is the amount before sales tax. Your invoice adds GST/QST or the applicable provincial tax on top.

Billing contact email (required on your first paid plan)

The same form asks for the Billing contact email. This is the address Stripe sends your invoices and receipts to, and it is required.

It is prefilled for you: whatever is already on file, otherwise the earliest active Owner or Admin on the account. In most cases you confirm it and move on. Change it here if invoices should go to someone else, such as an accounts-payable mailbox that is not an EmbayLMS user.

It does not have to be an EmbayLMS account. A shared finance mailbox is a normal choice.

You can change it later at any time under Billing contact further down the billing page. Changing it there updates the same address Stripe uses, so the two never disagree.

Switching between monthly and annual billing

The Monthly / Annual selector sits above the plan cards. Annual billing is 20% below the monthly rate for the same plan (the selector shows Save 20%).

Picking a cycle you are not already on turns your current plan’s card into a Switch to yearly billing (or Switch to monthly billing) button. Clicking it changes the cycle immediately and Stripe prorates the difference on your next invoice: moving to annual charges the balance of the year, and moving back to monthly issues a credit for the unused portion. Your plan, features and data are untouched either way.

You can move in both directions at any time. The Free plan is billed monthly only, so it does not offer a cycle choice.

How the Free plan is billed: Every workspace — including Free — has exactly one Stripe subscription for its whole life; the Free plan simply sits on a $0 price. Upgrading changes that subscription’s price rather than starting a new one, so your billing history stays continuous. (Tenants that signed up directly on a paid plan during their free trial start their subscription when they first add a card.)

Free trial length: Paid plans start with a 30-day free trial — no credit card required. If the trial ends before a card is on file, paid-plan features are locked until you add one; add a card at any time during the trial to continue without interruption.


4 — Managing payment methods

The Payment method section is an in-app manager backed by Stripe. Card fields are Stripe-hosted — your card number never touches EmbayLMS.

See the cards on file. Each saved card shows its brand, last four digits, and expiry. The card used for renewals is marked Default.

Add a card.

  1. Click Add card.
  2. Enter the card details in the Stripe-hosted form.
  3. Click Save card. The card is verified with Stripe (a SetupIntent) and added to your saved cards.

Set the default. Click Make default on any saved card. Future renewals charge that card.

Remove a card. Click Remove on a card you no longer need. The page does not stop you removing the last card on file, so on a paid plan add the replacement first; without a card, the next renewal charge fails.

If a renewal payment fails, the status pill turns to Payment Due. Add or set a working default card; Stripe automatically retries the charge.


5 — API usage

If your plan includes an API quota, the API usage section shows your current month’s call count against the included monthly quota (or the count alone when your plan is unlimited). A usage bar turns red if you exceed the limit. To manage or rotate API keys, see the REST API guide.

API usage alerts

You do not have to watch the bar. Every Owner and Admin of your organization receives an email:

WhenSubjectWhat it means
Usage reaches 80 % of the monthly quota… is at 80% of its monthly API limitCalls still work. If your integration will need more, a higher plan raises the limit immediately.
Usage reaches 100 %… has reached its monthly API limitFurther API calls are answered with 429 until the quota resets on the first of next month — or immediately once you move to a plan with a higher limit.

Each alert is sent once per month, in each recipient’s own language, and only for plans with a quota (unlimited plans never receive one). Calls made from the app itself are not counted — only requests authenticated with an API key. The check runs every 15 minutes, so an alert can arrive up to 15 minutes after the threshold is crossed.

Seat alerts

People who can open Billing see a banner at the top of every page when seats need attention. Both banners carry a Manage billing button that opens this page.

BannerPlansWhat to do
Your organization has N active users but your plan allows M (red)Plans with a hard user cap (Free)New accounts are refused. Upgrade, or deactivate users you no longer need.
N active users against M licensed seats (navy, informational)Paid plans whose subscription carries a committed quantityNothing is blocked. The invoice counts your active users, which in this situation is the higher of the two numbers. The banner suggests adding seats, but there is no control for that on this page: raising a committed quantity is arranged with your account contact (see §7b).

The Create User, invite and add-external-users screens also say up front when the next account would exceed the cap — with the upgrade button — and show N seats left when you are within two of it.


6 — Viewing and downloading invoices

The Invoices section lists your invoices live from Stripe — date, number, amount, and status.

  • Click PDF on any invoice to open the Stripe-hosted invoice PDF.
  • Invoices are issued and finalized by Stripe on each renewal and plan change (including prorated charges).

If Stripe is temporarily unavailable, the page falls back to the locally mirrored invoice records so you still see your history.


7 — Billing contact and PO number

The Billing contact section shows the email Stripe uses for billing notices and the PO number printed on your invoices. Both are read-only until you click Edit.

  1. Click Edit.
  2. Update the Billing email and/or PO number.
  3. Click Save. The email is written back to the Stripe customer, so receipts and dunning emails go to the right place. The PO number applies to invoices issued after you save it.

7b — Reducing your committed licence quantity

If your subscription carries a committed quantity (a licence band arranged with sales — shown alongside your active-user count), you can schedule a reduction to take effect at your next renewal.

  1. In the Licence reduction section, click Reduce at next renewal.
  2. Enter the New committed quantity.
  3. Click Schedule reduction. The panel shows the date it takes effect.

Rules to be aware of:

  • Never mid-term. The reduction always takes effect at the next renewal — there is no retroactive credit for the current period.
  • Never below your current usage. A request below your active-user count is refused with the minimum named, not silently adjusted.
  • Reductions only. Raising or creating a committed quantity is arranged with your account contact, not from this page. The section does not appear if your subscription has no committed quantity, or on the Free plan.
  • Changing plans clears it. If you later change your plan tier, a pending reduction is cleared — schedule it again on the new plan if still needed.

While a reduction is pending, the panel shows the new quantity and its effective date with a Cancel the reduction button.

Billing note: on the self-serve per-active-user model, the quantity EmbayLMS reports to Stripe before each invoice is the number of active users in the billing period. The committed quantity is a contractual band, not that number, so reducing it does not by itself change the next invoice amount. A negotiated agreement can bill on a different basis (for example provisioned seats); in that case your agreement governs.


8 — Cancelling your subscription

Cancellation is available on paid plans only (there is nothing to cancel on Free).

  1. In the Cancel subscription section, click Cancel subscription.
  2. Choose a reason (optional detail box) — this helps us improve.
  3. Review What happens when you cancel, including when access ends and the data-retention timeline.
  4. Click Confirm cancellation.

Your subscription is scheduled to cancel at the end of the current billing period — you keep access until then. While a cancellation is pending, the page shows the effective date and a Keep my subscription button to reactivate before it takes effect.

After the cancellation takes effect, the portal stays reachable for 30 days. At least a week before the end of that window, the billing contact receives a notice email with the exact suspension date; on that date the portal is suspended (sign-in is blocked, data is kept). Resubscribing at any point before the suspension keeps access without interruption; after it, contact support to restore access or arrange an export.

For what happens to your data after access ends, see the Data Retention guide.


8b — Payment problems and expired trials

Payment failure (dunning). If a subscription payment fails, the billing contact receives an email right away and people who can open Billing see a banner across the admin area. You have a 14-day grace window with full access while the payment is retried. If the payment still fails after 14 days, paid features are temporarily locked and the Free-plan limits apply to new additions (existing users, courses, and content are untouched). Everything unlocks automatically the moment a payment succeeds — no support ticket needed.

Trial expiry. When a paid-tier trial ends without a subscription, the portal drops to the Free-plan limits (5 active users, 3 active courses, 1 GB storage — again, nothing existing is removed or deactivated) and paid features lock. Choosing a plan from the billing page restores everything immediately.


Configuration Reference

SettingLocationDescriptionDefault
PlanBilling → plan cardsCurrent plan; change via upgrade/downgradePer signup
Billing cycleBilling → Monthly / Annual selectorMonthly or annual billing; annual is 20% below the monthly rate. Free is monthly onlyPer signup
Payment methodBilling → Payment methodCards on file; add / set default / removeNone (required for paid)
Billing emailBilling → Billing contactStripe billing-notice emailThe earliest active Owner or Admin
PO numberBilling → Billing contactPO number printed on invoices (up to 64 characters)None
CancellationBilling → Cancel subscriptionSchedules cancel at period endNot cancelled

Purchase-order (PO) numbers (LMS-783)

Public-sector and larger private buyers often cannot pay by card and need their PO number to appear on the invoice their finance team receives.

Set one

  1. Go to Billing.
  2. In Billing contact, click Edit and enter your PO number (up to 64 characters).
  3. Click Save.

The Owner sets this — it needs the billing permission.

Where it ends up

DestinationWhat it is for
The invoice your finance team receivesPrinted as a PO Number custom field on the hosted invoice and the invoice PDF, applied to every future invoice for the account
The Stripe subscription’s metadataMakes the PO searchable and reportable against the subscription in Stripe
The EmbayLMS billing page and invoice listShown so an admin can confirm at a glance what will print

Clearing the PO removes it from all three, so future invoices stop printing it.

Things worth knowing

  • It applies to future invoices, not past ones. An invoice that has already been issued keeps whatever custom fields it had; setting a PO today does not reprint yesterday’s invoice.
  • This records a PO; it is not by itself a payment method. To be invoiced on net terms instead of charged to a card, use Pay by purchase order below.
  • If Stripe is briefly unreachable when you save, your PO is still saved in EmbayLMS but may not have reached Stripe. Re-saving the field pushes it again. Every save is audit-logged with whether the push succeeded, so support can tell the difference between “never entered” and “entered but did not sync”.

Pay by purchase order — invoice billing (LMS-783)

Organizations that cannot pay by card can ask to be invoiced on net terms. The request is reviewed by Embay; once approved, Stripe emails an invoice to your billing contact each billing period instead of charging the card.

Request it

  1. Go to Billing and find Pay by purchase order.
  2. Click Request invoice billing.
  3. Enter your PO number, the billing contact (Billing contact name and Billing contact email — this is who receives the invoices) and the Net terms requested (net 30, 45 or 60). Add a note in Note for Embay (optional) if your finance team has instructions.
  4. Click Send request. The card shows Pending approval.

Only one request can be open at a time. The PO number you enter here also becomes the PO printed on your invoices (the Billing contact field above stays in step).

What happens next

DecisionWhat you seeWhat changes
ApprovedApproved — net N and the approval date; the invoice list shows Net N termsFrom the next billing period, Stripe emails an invoice due N days after issue, carrying your PO. The card on file is no longer charged.
DeclinedDeclined, the date, and any note from EmbayNothing changes — the card continues to be charged. You can submit a new request (for example with different terms).
Revoked later by EmbayDeclinedCollection returns to the card on file.

Your billing contact is emailed with every decision. Each request and decision is audit-logged.

Paying an invoice on terms

An invoiced subscription is only marked past due once an invoice passes its due date. From that point you keep full access for the length of your terms (net 30 ⇒ 30 more days) before paid features are locked — not the 14-day card-retry window. The reminder email you receive says the invoice is overdue rather than asking for a new card.


Troubleshooting

Request invoice billing is missing

You do not hold the billing change permission, or a request is already pending — ask the Owner, or wait for the pending decision.

Approved, but the next charge still hit the card

The approval landed after Stripe had already finalized that period’s invoice. The following invoice is emailed on terms; contact support if a second card charge occurs.

My PO number is not on the invoice

Purchase orders apply to future invoices — an invoice already issued keeps the fields it had. Re-save the PO in Billing to push it to Stripe again. Every save is audit-logged (billing_contact) with whether the push reached Stripe, so support can tell “never entered” from “entered but did not sync”.

I don’t see the Billing page

Billing is limited to the Owner and to custom roles that grant Billing. Ask your Owner for access.

”Enter the email that should receive the invoices.”

The billing contact is blank. It is normally prefilled with the earliest active Owner or Admin; if you cleared it, enter the address that should receive invoices and receipts.

I upgraded but no invoice arrived by email

Check the billing contact under Billing contact on the billing page. Stripe sends invoices and receipts to that address, so an empty or mistyped one means nothing is delivered even though the payment succeeded. Invoices are always available to download on the billing page regardless.

”Enter the full billing address to continue.”

The address is incomplete. Every required field, including country and postal code, must be filled before the upgrade button becomes active.

”We could not recognize this billing address for tax purposes.”

Stripe could not resolve the address to a tax jurisdiction. Check the country and the postal code first — they are the two fields it relies on most. Correct the address in the same form and submit again; your card does not need to be re-entered.

”Could not update the card” when the card itself looks fine

This is the same problem wearing the wrong label, and it is fixed as of 2026-09-17. If you see it on an older session, reload the billing page and start the upgrade again so the form asks for a billing address.

”Billing isn’t set up for this environment yet” / “Could not start the upgrade”

Billing is not fully configured for this environment. This is a platform-side configuration issue (Stripe keys) — contact EmbayLMS support; there is nothing to fix in your tenant.

The add-card or checkout form is blank

The Stripe form is blocked from loading. Disable any script/content blocker for this site and reload. If it persists, contact support with a screenshot of the browser console.

The Annual / Monthly selector does nothing on my current plan

Selecting a cycle only re-prices the cards until it differs from the one you are billed on. Once it does, your current plan’s card changes from the Current plan label to a Switch to yearly billing button — that button is the action. The Free plan is monthly only and never offers one.

My plan change / new card isn’t reflected yet

The page reads live from Stripe, so changes normally appear immediately. If a value still shows Not available, reload the page; Stripe occasionally takes a few seconds to report the renewal date after a change.

Payment failed / status shows Payment Due

Open Payment method, add a working card and set it as default. Stripe retries the charge automatically once a valid card is on file. You keep full access for 14 days after the first failure; past that, paid features lock until a payment succeeds (they unlock automatically — see §8b).

Either the trial ended or a payment has been failing for more than 14 days. Both are fixed from this page: choose a plan (trial) or update the payment method (payment failure). Nothing was deleted — the lock only blocks new additions and paid features.