This skill is about the business's own account with Appmint. It is not about plans the business sells to its customers; for that, see Subscription plans.
The business pays Appmint in two ways:
- a plan, paid by card and renewed by Appmint;
- a credit balance, which metered services draw from (AI, SMS, calls, email, labels, lookups).
The rules are in How charging works, Plans and pricing, Service agreements and Account. This page is the order to read them in for one business, and where to stop.
Read prices from the API, never from memory or these docs. Plans come from GET /org-management/subscription/plans and service rates from GET /service-pricing/catalog. Both are what checkout really charges. The tables in the reference pages can lag behind.
Ask first
- What do they want to know or do? Read and explain (steps 1–5), set a spend limit (step 6), or something that costs money (step 7).
- Which period? For charges: this month, last 30 days, or dates. Default: this calendar month.
- For a plan change: which plan, monthly or annual? Give the plan key from step 1, not a guess from its name.
- For a spend notification: the amount, and who is emailed. Only addresses the person gives. With none, the org's owner and admin emails are used.
Steps
1. Plans & Pricing: the plan, its renewal and what a change costs
call_appengine GET /org-management/subscription/current.
| Field | What it is |
|---|---|
currentPlan, currentPlanName | the plan key (sm-pro-month) and its name |
status | the plan subscription's state: active, past_due, cancelled |
renewalDate, amount, autoRenew | when the next charge is due, how much, and whether it renews at all |
scheduledChange | a downgrade or cancel waiting for effectiveDate, with planName |
It answers empty (no body) when the org has never had a plan subscription, which is normal for an org on a free plan. Then read the plan from GET /usage/balance (plan).
All plans: GET /org-management/subscription/plans. tiers is one card per tier: tier, monthly and annual (each with id, the plan key, price, perMonth), annualSaving, features (the allowances as lines a person reads), contact (Enterprise: talk to sales). plans holds every plan key with its limits.
| Family | Plan keys |
|---|---|
| Studio | free, sm-starter-month, sm-starter-annual, sm-pro-month, sm-pro-annual, sm-business-month, sm-business-annual, enterprise-month, enterprise-annual |
| BusinessMade | bm-free, bm-paid-month, bm-paid-annual, bm-enterprise |
Monthly and annual of the same tier rank the same, so switching cycle is not a downgrade (appengine usage/pricing-plan.ts 339–343).
What a change costs today: GET /org-management/subscription/quote?plan=<plan key>.
| Field | Means |
|---|---|
change | upgrade, downgrade or same |
price, interval | the new plan's price per month or year |
credit, daysLeft | an upgrade from a paid plan that is still running: the unused days of the old plan, taken off |
dueToday | what the card is charged now. The new period starts today. |
effectiveDate | a downgrade: the end of the period already paid for (nothing is due, nothing refunded); now for an upgrade |
Read on the local engine: an org on bm-free quoted sm-pro-month gets change: "upgrade", dueToday: 199.
Hands on: the plan key, the renewal date and amount, any scheduledChange, and the quote if a change was asked about.
Check: Account › Plans & Pricing (/plans, also /upgrade) marks the Current plan card, and shows the waiting change with Keep
2. Plan limits: what the plan allows and what is used
GET /site/limits (add ?app=bm for BusinessMade). items[], one per limit: label, usedText, limitText, percent, state (ok, warning, full), note, detail.
| Limit | What happens when it is full |
|---|---|
| Sites, Dev environments | a new one is refused, "… plan allows maximum …" (appengine site/plan-validation.service.ts 63, 80) |
| Hosted mail domains | a new mail domain is refused |
| Storage (records + files, measured once a day) | new records and uploads are refused until there is room (appengine repositories/repository.controller.ts 1212–1214) |
| Custom domains | included on every plan |
Hands on: which limit is full, and the tier that lifts it (from step 1).
Check: Account › Plan limits (/limits) shows the same bars, with Upgrade plan and Contact sales.
3. Billing: the credit balance and transactions
GET /org-management/billing/balance:balance(USD),spendLimit(0 means no limit),spendRate.GET /org-management/billing/transactions?page=&pageSize=&startDate=&endDate=: payments to Appmint: credit bought, plan charges, services bought. Each has aninvoiceNumber(CREDIT-…,SRV-…),amount,statusandremarks.GET /org-management/billing/auto-reload:enabled,threshold,amount,cardSaved,card,lastReloadAt,lastError.
Hands on: the balance and the last payments.
Check: Account › Billing (/billing): Overview (Credit balance, Buy credits, Auto reload, Recent Transactions), Transaction History (date range, Export as CSV), Billing Settings.
4. Usage & Spending: what the credit was spent on
GET /usage/statement?from=<ISO>&to=<ISO>(default: the last 30 days). It reads like a bank statement.totalshasspent,creditedandcharges.breakdownis spend by service.rowsis every change to the balance, with what it was for. Charges for the same service less than 2 minutes apart are one row (appengineusage/usage-statement.ts9–31).GET /usage/shared?from=&to=(default: this month): every shared platform service. For each:account(shared= Appmint's account, billed to the balance;own= the business's own credentials, billed by the provider),agreementAccepted,count,charged,lastUsedAt. It doesn't show Appmint's own cost.GET /usage/spend-controls:spentThisMonth,spendLimit,remaining,percent,limitReached,notifications. The month is the calendar month in UTC.
Answer "why was I charged" from the statement row: the service, when, and the amount. Never work a charge out yourself from a rate.
Hands on: spend this period by service, and the biggest items.
Check: Account › Usage & Spending (/usage): Spending by service and Statement.
5. Services: what each service costs and whether it is on
GET /service-pricing/catalog. It returns balance and providers[]. Each provider has services[], and each service has:
| Field | What it is |
|---|---|
name, title, provider | e.g. twilio-sms, "SMS", twilio |
billingModel | per_use, per_unit, recurring, one_time, tiered |
pricingDisplay, unitName | the price as the owner sees it ("$2.30 per number / month") |
requiresAgreement, agreementStatus, agreementAccepted | whether it needs an agreement, and where the org stands |
agreementText, documentation | the terms to show before anyone accepts |
What the org has accepted: GET /org-management/services/agreements (each: service, status active/revoked/pending, acceptedAt, acceptedBy, and for pending, dueBy).
When a service is refused, the error's code says why. All three answer 402 and nothing runs or is charged:
code | Why | What the owner does |
|---|---|---|
AGREEMENT_REQUIRED | the service runs on Appmint's account and its agreement isn't accepted | accept it (step 7) or connect their own provider |
INSUFFICIENT_BALANCE | the balance doesn't cover it (required, currentBalance) | buy credit (step 7) |
SPEND_LIMIT_REACHED | this month's spend would pass their own limit | raise the limit (step 6) or wait for next month |
The owner is also sent a notice. When an agreement becomes required for a service the business already uses, it gets a pending agreement with 30 days to accept, and the service keeps working until dueBy (appengine usage/service-pricing.service.ts 134, 1030–1063).
To tell whether the balance covers something, compare the balance (step 3) with its price. GET /service-pricing/check-balance/<service>?amount=<dollars> answers too, but when the balance is short it also sends the owner a low-balance notice (usage/service-pricing.service.ts 689–703). Use it only when that notice is wanted.
Hands on: the service's price, its agreement state, and the refusal code if there was one.
Check: Services (/services). The Services tab lists each one with its agreement label. ?openId=<service name> opens its side panel (Pricing, Agreement Status). Service Pricing (/service-pricing) is the price list.
6. Plan limits: monthly spend limit and spend notifications (on a yes)
This doesn't spend money: it stops new paid services once the month's spend would pass the limit. Usage that has already happened is still billed, like a call that has ended or a renewal (appengine usage/spend-controls.ts 3–16).
Only an Owner or ConfigAdmin can do this. call_appengine POST /usage/spend-controls:
{ "spendLimit": 200, "notifications": [ { "amount": 50, "emails": ["[email protected]"] }, { "amount": 150 } ] }spendLimitis in dollars;0means no limit (at most $1,000,000).notificationsis the whole list: it replaces the old one. Send the existing ones back with theiridfrom step 4, or they are dropped. At most 10, with different amounts, and up to 5 emails each. Each one emails once a month when spend crosses its amount.
Stop. A limit can stop phones, texts and the AI mid-month. A notification emails the addresses given. Show the limit, each amount and each address, and wait for yes.
Check: GET /usage/spend-controls shows them; Account › Plan limits (/limits) › Monthly spend.
7. What costs money: the owner does it (Stop)
The AI doesn't buy credit, change the plan, accept agreements or buy services. Each of these charges a card or signs the business up to terms and charges. Give the person the figures from steps 1–5 and send them to the screen.
| They want | Where | What happens |
|---|---|---|
| more credit | Billing › Buy credits (/billing?buyCredit=true) | $1 to $10,000, by card through Stripe; added to the balance once the payment succeeds |
| automatic top-ups | Billing › Overview › Auto reload (Owner or ConfigAdmin) | below the threshold, $10 to $1,000 is charged to the card saved with the plan. It can't be turned on without a saved card (409 NO_SAVED_CARD). A refused card turns it off. |
| a higher plan | Plans & Pricing › Upgrade | pays dueToday from the quote by card (Stripe only), then the plan is active. When the unused days cover it, it switches without a payment. |
| a lower plan | Plans & Pricing › Downgrade | with paid time left, it waits for the period end (scheduledChange). Keep |
| to stop paying | Downgrade to the Free card | as a downgrade. There is no Cancel button. POST /org-management/subscription/cancel exists, but only for the owner to call. |
| a service on | Services › the service › tick the terms › Enable Service, or Accept and enable on an "agreement required" notice (Owner or ConfigAdmin) | the agreement is recorded with who and when. The phone service gets its own Twilio sub-account; bulk email gets its own sending reputation. Charges then come from the balance. |
| a service off | Services › the service › Disable Service | the agreement is revoked; the service is refused again (phone: its sub-account is suspended) |
| higher limits or a custom plan | Plan limits › Contact sales | saved as a lead for Appmint's sales team; the sender gets a confirmation email |
| credit moved to another org they run | POST /usage/gift (Owner or ConfigAdmin) | the amount leaves this org's balance |
Stop. Before sending them there, say the amount, what it buys, when it renews, and what it changes (limits gained or lost, a period not refunded, a service that stops). Then let them do it on the screen.
Platform staff handle gifted credit, manual plan changes and usage across all orgs from System Operations. A business can't do these itself.
Check: after they act, read steps 1, 3 or 5 again. The new plan, balance or agreementAccepted should show.
When it's done
Tell the person:
- their plan, its renewal date and amount, and any change waiting;
- which limits are full or close, and the plan that lifts them;
- the balance, this month's spend and its biggest services;
- for a refused service, the code and the one thing that clears it;
- anything you set (spend limit, notifications), and anything left for them to do on which screen.
Open the screen that answers their question: /plans, /limits, /billing, /usage or /services?openId=<service>.
What it can't do yet
- The plan's monthly AI credit isn't added to the balance. Plans list it ("$10 AI credit a month"), but nothing in the engine grants it (
aiCreditis read only by the plan cards, appengineusage/pricing-plan.ts293). Don't promise it. - The AI-employee allowance isn't enforced. It is shown on the plan cards only.
- A BusinessMade plan's dev environments show as 1, not 0.
getPlanLimitsturns 0 into 1 (usage/pricing-plan.ts187). On the local engine,bm-freeshows "Dev environments 0 of 1". - "Additional services" (export time, priority support, extra storage, API call bundles, domains) have no screen.
GET /org-management/services/availablelists them.POST /org-management/services/purchasecharges the card and records anSRV-transaction with a receipt email, but nothing is provisioned or switched on. Its documentedcreditspayment is refused. Don't send anyone there. - Plans are paid by card through Stripe only. PayPal is refused for plans.
- No Cancel plan button; downgrade to Free instead.
Don'ts
- Don't call
billing/buy-credits,subscription/create,subscription/upgrade,subscription/downgrade,subscription/cancel,services/purchase,services/agreement/acceptorusage/giftfor the person. Send them to the screen. - Don't quote a price from memory or from a docs table; read the plans and the catalog.
- Don't work out what a charge "should" have been; read the statement row.
- Don't set a spend limit or add a notification address without a yes.
- Don't confuse this with the business's own customer plans (Subscription plans).