SuiteTerms - Product Release Notes

Functional and technical documentation of what shipped, module by module. Screenshots use demo data (Nordic Growth Studio); emails and names in the admin images are masked. Generated October 8, 2026.

What's new in this release

Licensing and seats, a platform admin area for the product owner, and a cleaner look across the app.

  • Licenses and seats. Each company has a license (type, seats, expiry). Companies see it but cannot change it. Seat management
  • Early warnings. A banner and a bell item count down the days, and the owner is emailed. After the end date the workspace is read-only. License banner
  • Platform admin area. IPA Nordic staff create companies, set seats and expiry, and see every company's accounts, business details, integrations and email templates. Platform admin
  • Automatic trial. A company that registers itself gets 14 days and 5 seats. How a company gets a license
  • Invitations. A redesigned invitation email, a clearer signature step, a notice for the owner when someone joins, and a safe prompt when the link is opened while signed in as someone else. Invitations
  • One notification bell for license countdown, new members and join requests; dropdowns close each other. In-app notifications
  • Everything translatable. 97 new text keys are on the Translations screen, ready to translate. Translations
  • Layout fixes. The wave footer now sits at the bottom of every page, and the license banner keeps its size on short pages.
  • Template library. Two broken sample templates were removed (5 samples remain). Templates
  • Product documentation link. A new item in the avatar menu, a Documentation link in the home and pricing top menus, and a link in their footers all open this page. Left menu
  • Fixes. Marking a bell notification as read now works; checkboxes no longer show a tall green outline.

Homepage & pricing

The public entry point: company branding, the main call to action, pricing and the legal pages.

1

Homepage

Branded landing page with sign-in and create-account entry points. Content follows the selected language.

Homepage
Tech: HomeController, route GET /{locale} (home), view welcome.blade.php
2

Pricing

Plan overview shown before sign-up.

Pricing
Tech: route GET /{locale}/pricing, view pricing.blade.php
3

Privacy policy

Privacy policy, Terms of Service and GDPR policy share one legal-page layout.

Privacy policy
Tech: routes /privacy-policy, /terms-of-service, /gdpr-policy, view auth/legal-page.blade.php

Create account

Self-service sign-up with legal consent and email verification.

1

Register screen

Full name, email, optional account type, password, and acceptance of Terms of Service and GDPR consent. A verification email is sent after sign-up.

Register screen
Tech: RegisterController@create, route GET /register; mail via VerifyEmailNotification

Login Reviewed section

Full sign-in flow: password step, one-time email code, a wrong password, and recovering a forgotten one.

1

Sign In screen

Entry point to the app. Email and password, a "Remember me" checkbox and a show/hide password toggle. A note explains that a one-time code is emailed after the password step.

Sign In screen
Tech: LoginController@create, route GET /login
2

Credentials entered

Email and password filled in, ready to submit with "Continue securely".

Credentials entered
Tech: LoginController@store; password verified against the user record
3

Wrong password

A single generic message appears ("These credentials do not match our records."). It does not reveal whether the email or the password was wrong. Repeated failures are throttled.

Wrong password
Tech: translation key auth.login.failed, throttle key auth.login.throttled
4

Forgot password

Enter the account email to receive a password-reset link.

Forgot password
Tech: ForgotPasswordController, route GET /forgot-password; mail via ResetPasswordNotification
5

One-time code (OTP)

After a correct password a six-digit code is emailed. It is valid for 10 minutes and the number of attempts is limited.

One-time code (OTP)
Tech: LoginOtpNotification, route GET /two-factor-challenge; code stored hashed in login_otp_code, expiry login_otp_expires_at

Onboarding

Two steps every new user completes before reaching the Sales Room.

1

Step 1 - Account information

Profile photo, name, email and position, plus the signature style (typed or drawn). A live preview shows how the signature will appear on offers.

Step 1 - Account information
Tech: AccountOnboardingController@editAccount, route GET /onboarding/account-information
2

Step 2 - Company information

Company logo, name, CVR / registration number, address, town, postal code and phone. If the company already exists, the user can request to join it and the owner is emailed to approve.

Step 2 - Company information
Tech: AccountOnboardingController@editCompany, route GET /onboarding/company-information; owner mail CompanyJoinRequestMail

Sales Room dashboard

The operational centre. Everything the sales team needs after sign-in is on one page, and the left menu leads to each area.

1

Dashboard overview

Four areas: Offers overview chart (Created vs Accepted per month, this year), Recent activity (customer events such as viewed, accepted, declined, showed interest, signed the terms, offer sent), Account activity (actions by team members) and Active offers (recent offers with status, date, price and how many times each was sent). Below are three library cards: Customer, Product and Template.

Dashboard overview
Tech: SalesRoomController@index, route GET /sales-room, view sales-room/index.blade.php
2

Customer library

Opens from "View customers". Searchable list of every business and contact person, tagged Business or Contact, with email and phone.

Customer library
Tech: data-customers-modal-open dialog in index.blade.php
3

Product library

Opens from "View products". Shows each product with SKU, unit and price, and a button to create a new product.

Product library
Tech: data-products-modal-open dialog in index.blade.php
4

Left menu

Sales room (dashboard), Templates (All templates, Template library), Sales materials (placeholder, no page yet), Offers, Customers, Products, Settings (Custom PDF, Translations). The top bar has search, language switcher, two notification bells and the avatar menu: Account settings, Business settings, Integrations, Email templates, Seat management and Product documentation (this page, opened in a new tab), plus Sign out. The public home and pricing pages have a Documentation link in the top menu (shown on wide screens and in the mobile menu) and a Product documentation link in the footer next to Privacy Policy.

Left menu
Tech: components/app-layout.blade.php

In-app notifications

Two bell menus in the top bar keep the team informed without leaving the app.

1

Notifications bell

One bell for the whole company. At the top, the license countdown ("Your free license ends in 4 days") shows to every user in the company, tinted green, amber or red by urgency. Below it, "Lilly joined your company" notices appear for the owner and Customer Admins after an invitation is accepted, then pending join requests for admins. The badge counts them, and clicking an item opens it and clears it.

Notifications bell
Tech: app-layout.blade.php; LicenseService::describe(); CompanyUserJoinedNotification; mark read via POST /{locale}/notifications/{id}/read
2

Offer expiry

Clock icon lists unread offer-expiry notices (warning, due today, lapsed). Clicking one marks it read and opens the offer.

Offer expiry
Tech: database notification SalesOfferExpiringNotification
3

One dropdown at a time

Opening the language menu, a bell or the user menu closes the others. A click outside or Escape closes the open one.

Tech: script in app-layout.blade.php (details.nav-dropdown)

Templates

All saved templates and a library of ready-made samples to start from. Four template types exist: Offer / Proposal, Invitation / Sales Email, Sales Material and Business Terms.

1

All templates

Your created templates with preview, edit and delete actions, plus ready-made samples (offers, emails). Pick a sample to start from, or create a blank template.

All templates
Tech: SalesTemplateController@gallery, route GET /sales-room/templates/gallery
2

Template list

Filterable list of templates by type.

Template list
Tech: SalesTemplateController@index, route GET /sales-room/templates

How to create a template

Step by step, from a blank template to a saved, sendable offer. Nothing is saved until you click Create template.

1

Step 1 - Start a new template

Go to Templates and choose a type to create. Give the template a name and choose its type: Offer / Proposal, Invitation / Sales Email, Sales Material or Business Terms. The page title and available sections follow the type.

Step 1 - Start a new template
Tech: SalesTemplateController@create, route GET /sales-room/templates/create, field category
2

Step 2 - Select the contact (offers)

For an offer, choose the recipient: a business, a contact person of a business or a private person. You can save without a recipient, but you need correct company or contact details before sending.

Step 2 - Select the contact (offers)
Tech: data-offer-contact-step in templates/form.blade.php; customers searched via sales-customers.search
3

Step 3 - Template details

Set Status (Draft or Active), the Primary action label shown on the customer button (default "Review proposal"), Headline and Subheadline, a Footer text for all pages and its alignment (Left, Center, Right). Use Attachments to add files customers can open.

Step 3 - Template details
Tech: fields status, headline, subheadline, common_footer_text, common_footer_alignment
4

Step 4 - Build pages in the builder

Set the cover page (name and a 1050 x 700 px cover image). Then, on Columns, choose a 1 to 4 column layout to add a row to the selected page. On Contents, click a block to add it to the selected column (or drag it). Use Create new page for more pages, and the arrows and cross on each page, row and block to reorder or remove them.

Step 4 - Build pages in the builder
Tech: builder in resources/js/app.js (builderLayouts, builderCatalog)
5

Step 5 - Edit a block in the design panel

Click a block to open the Design panel. Fill in its fields (heading, text, link, image and so on). Price blocks are edited directly on the page instead.

Step 5 - Edit a block in the design panel
Tech: data-builder-inspector-panel
6

Step 6 - Check the live preview

Turn on the Preview switch (top right) to see the cover and pages as the customer will see them. Close it to keep editing.

Step 6 - Check the live preview
Tech: data-builder-preview-toggle, data-builder-live-preview
7

Step 7 - Save and send

Click Create template (top right; it reads Save changes when editing). Open the template from the list to preview it, export a PDF or use Send to customer (see Offers & delivery).

Step 7 - Save and send
Tech: SalesTemplateController@store, then sales-templates.show

Template builder: columns

Each page is made of rows, and each row has 1 to 4 columns. Pick a layout on the Columns tab and it is added to the selected page. A page can mix rows with different column counts.

1

1 column

Full-width row. Best for headings, long text, price tables and signatures.

1 column
Tech: builderLayouts layout 1
2

2 columns

Two equal columns, for example text next to a picture or video.

2 columns
Tech: layout 2
3

3 columns

Three equal columns, for example three benefits or reviews side by side.

3 columns
Tech: layout 3
4

4 columns

Four equal columns, for compact facts or icons.

4 columns
Tech: layout 4

Content blocks & icons

The Contents tab offers 22 blocks. Each has an icon, shown below exactly as in the builder. Select a column first, then click a block or drag it in.

Reviews
Picture
Canva
Figma
Legal field
Button with link
Price table
SaaS price
Services
Seller signature
Separator
Separator with icon
Text block
Tile grid
Four text columns
Two text columns
Trustpilot reviews
Signatures
Video recorder
Vimeo video
Show interest
Youtube video

Reviews

Quote card with a star rating.

Reviews block on the page Reviews design panel
Fields: Review heading, Quote (rich text), Author, Rating (default 5), Source

Picture

An image from an upload or a link.

Picture block on the page Picture design panel
Fields: Upload image, Picture label, Image URL, Alt text, Caption

Canva

Embeds a Canva design by link.

Canva block on the page Canva design panel
Fields: Canva block title, Canva link, Supporting text

Figma

Embeds a Figma file by link.

Figma block on the page Figma design panel
Fields: Figma block title, Figma link, Supporting text

Legal field

Legal wording such as disclaimers.

Legal field block on the page Legal field design panel
Fields: Legal heading, Legal text (rich text)

Button with link

Call-to-action button that opens a link or file.

Button with link block on the page Button with link design panel
Fields: Button label, Destination URL, Supporting text, Upload file

Price table

Line-item pricing. Edited directly on the page.

Price table block on the page
Fields: Title (search your Products or type), Number, Price, Discount (amount or %), line type (Line item / Discount), currency (auto, USD, EUR, DKK, GBP, NOK, SEK), Subtotal, Total amount (ex VAT), Additional information for the order

SaaS price

Same price editor as Price table, titled "SaaS price", for subscription pricing.

SaaS price block on the page
Fields: Same fields as Price table

Services

Same price editor as Price table, titled "Services", for service lines.

Services block on the page
Fields: Same fields as Price table

Seller signature

Shows the seller signature from the user profile.

Seller signature block on the page Seller signature design panel
Fields: Signature heading, Signer name, Signer role, Supporting text

Separator

A divider line between sections.

Separator block on the page Separator design panel
Fields: Separator label, Separator style (solid, double, dashed, dotted)

Separator with icon

A divider line with an icon in the middle.

Separator with icon block on the page Separator with icon design panel
Fields: Separator label, Separator style, Icon (star, spark, diamond, check and more)

Text block

Free formatted text.

Text block block on the page Text block design panel
Fields: Block label, Text (rich text editor)

Tile grid

A grid of tiles with text and images.

Tile grid block on the page Tile grid design panel
Fields: Section heading, Tiles per row (1-4), per tile: Title, Layout (text left / image right, image left / text right, text only, image only), Image URL, Image alt text, Name, Role or company, Body

Four text columns

Four columns of text in one block.

Four text columns block on the page Four text columns design panel
Fields: Section heading, heading and text for Columns 1 to 4

Two text columns

Two columns of text in one block.

Two text columns block on the page Two text columns design panel
Fields: Section heading, Left and Right column heading and text

Trustpilot reviews

Review card for Trustpilot-style quotes.

Trustpilot reviews block on the page Trustpilot reviews design panel
Fields: Review heading, Quote, Author, Rating, Source

Signatures

A signature area with signer details.

Signatures block on the page Signatures design panel
Fields: Signature heading, Signer name, Signer role, Supporting text

Video recorder

Record a clip with your camera or upload a video.

Video recorder block on the page Video recorder design panel
Fields: Record or upload video, Video heading, Video link, Supporting text

Vimeo video

Embeds a Vimeo video.

Vimeo video block on the page Vimeo video design panel
Fields: Video heading, Vimeo link, Supporting text

Show interest

Lets the customer show interest and contact you.

Show interest block on the page Show interest design panel
Fields: Section heading, Supporting text, Button label, Contact email

Youtube video

Embeds a YouTube video.

Youtube video block on the page Youtube video design panel
Fields: Video heading, YouTube link, Supporting text

Offers & delivery

Review an offer, send it to the customer and track the response.

1

Offers list

Templates of type Offer / Proposal.

Offers list
Tech: route GET /sales-room/templates?category=offer-proposal
2

Offer preview

Final review page. Export as PDF, edit, or send to the customer.

Offer preview
Tech: SalesTemplateController@show, route sales-templates.show
3

Send to customer

Recipient, subject, rich-text body, optional valid-until date, an automatic reminder after 3 days and a toggle to require acceptance of terms and conditions.

Send to customer
Tech: route sales-templates.deliver; mail SalesTemplateDeliveryMail; reminders by sales-room:send-reminders every 15 min
4

Shared offer (customer view)

Branded page the customer opens from the email. They can accept, show interest or reject with a reason. Views are tracked and shown to the seller as activity.

Shared offer (customer view)
Tech: SalesTemplateDeliveryController@show, route GET /sales-room/offers/{delivery}; actions accept, interested, reject

Customers

Business customers and private contacts, with one or more contacts per business.

1

Create business

General details (name, CVR, EAN, currency, language, website) plus billing and delivery address tabs.

Create business
Tech: SalesCustomerController@createBusiness, route GET /sales-room/customers/business/create
2

Create contact

Private person or contact person linked to a business.

Create contact
Tech: SalesCustomerController@createContact

Products

Reusable products for price tables in offers.

1

Product list & form

Each product has an auto-generated SKU, description, unit, currency, price and status. Click one to edit.

Product list & form
Tech: SalesProductController, route GET /sales-room/products/create; SKU from SalesProduct::nextSkuFor

Account settings

Personal profile, position and signature.

1

Account

Edit name, email, photo, position and signature.

Account
Tech: SettingsController@editAccount, route GET /settings/account

Business settings

Company profile, default terms and team management.

1

Company details & conditions

Logo, name, CVR, address, default currency, and the default terms and conditions with an option to require acceptance.

Company details & conditions
Tech: SettingsController@editBusiness, route GET /settings/business
2

Users, invitations & join requests

Invite members, set roles, and approve or reject join requests. Each action sends an email to the person affected.

Users, invitations & join requests
Tech: mails CompanyUserInvitationMail, CompanyUserUpdatedMail, CompanyJoinRequestStatusMail

Integrations

CRM connections that react when an offer is sent, accepted, shown interest in, or rejected.

1

HubSpot, ChannelCRM, Pipedrive

Per-company connections with sync toggles and pipeline stage mapping.

HubSpot, ChannelCRM, Pipedrive
Tech: SettingsController@integrations, route GET /settings/integrations

Email templates

Customise the subject and body of every automated email.

1

Email templates

Tabs for company invitation, offer delivery, seller notifications, offer confirmation, two-factor auth, password reset and create account. Placeholders such as {{company_name}} are replaced when sent. Blank fields fall back to the system default.

Email templates
Tech: SettingsController@editEmailTemplates, route GET /settings/email-templates

Custom PDF

Branding for signed-offer PDFs.

1

Custom PDF

Report logo, header background colour and status-bar colour with a live preview of the signed-offer header.

Custom PDF
Tech: SettingsController@customPdf, route GET /settings/custom-pdf; PDFs by DOMPDF

Translations

Manage UI text per language.

1

Translations

Pick a language and section, edit each key, or auto-translate missing strings with DeepL (API key stored per company). Languages: Danish, Dutch, Norwegian, Spanish, Swedish.

Translations
Tech: SettingsController@translations, route GET /settings/translations
2

New text to translate

All text added for licensing, seat management, the notification bell and invitations is listed under the License, Notifications and Company Users sections (97 new keys). The English source text is saved; every other language shows the keys as missing until translated, by hand or with Translate missing with DeepL. Until then the English text is shown. Placeholders such as :days and :name must be kept.

New text to translate
Tech: migration 2026_10_08_000003_add_licensing_translation_keys; guard test TranslationKeysTest

Seat management

Every company has a license that decides how many people can use it and until when. The company can see it but never change it: only the platform owner does that.

1

Seat management page

Opens from the avatar menu. Three chips under the title show the license type and state, the seats used (with a progress bar and how many are available) and the expiry date with days left. The table lists the owner, every member, and invited people, whose seat is reserved until they accept. Company admins also get Invite a user (only while seats are free and the license is active) and Request more seats.

Seat management page
Tech: SettingsController@seats, route GET /settings/seats; request POST /settings/seats/request
2

Seat rules

The limit is enforced on the server when inviting a user, approving a join request and accepting an invitation. Seats are counted per company: owner + members + pending invitations. A company with no license record is treated as "legacy": active, unlimited, no expiry.

Tech: LicenseService (canAddSeat, assertCanAddSeat); fields on the owner row: license_type, license_status, license_seats, license_expires_at

License banner, read-only mode and suspension

Everyone in the company is told early when the license is about to end, and what happens after.

1

More than 7 days left (green)

A card at the top of the page: icon, title, short explanation, a "days left" badge and a Seat management button. It can be dismissed for the session. It appears when 14 days or fewer are left (7 or fewer for a trial).

More than 7 days left (green)
Tech: components/license-banner.blade.php, LicenseService::banner()
2

7 days or fewer (amber)

Same card in amber as the end gets close. A trial gets a single warning, at 3 days.

7 days or fewer (amber)
Tech: config/licensing.php warn_days
3

Expired (red) - read-only

After the end date the workspace is read-only: users can sign in and view everything, but changes, new offers and invitations are refused until the license is renewed. Signing out, account settings and requesting seats still work. This banner cannot be dismissed.

Expired (red) - read-only
Tech: EnforceCompanyLicense middleware (license.enforce); allowed routes in config/licensing.php
4

Suspended

If the platform owner suspends a company, every page redirects to a notice with a Sign out button until it is reinstated.

Suspended
Tech: route GET /license/suspended, view license/suspended.blade.php
5

License ending email

The owner is emailed before the license ends: 14 and 3 days before (trial: 3 days), once each. The email is sent in the owner's saved language.

License ending email
Tech: license:send-expiry-warnings (daily), LicenseExpiringMail

Inviting people to the company

Owners and admins invite colleagues from Business settings. Each invitation holds one seat until it is accepted or expires.

1

Invitation email

The invitation now uses the SuiteTerms email design: logo header, title with the green bar, the company's own message, an Accept invitation button, the expiry date and a fallback link.

Invitation email
Tech: CompanyUserInvitationMail, view mail/company-user-invitation.blade.php, layout components/mail-layout.blade.php
2

Accept invitation

The invited person registers with the invited email. The Your signature card (type or draw) is on the right on wide screens and below the checkboxes on narrow ones. The written signature is pre-filled with their name, and a failed submit scrolls to it.

Accept invitation
Tech: RegisterController flow accept-invitation; seat re-checked on acceptance
3

Opened while signed in as someone else

If the link is opened in a browser already signed in as a different user, the app explains it instead of showing that user's pages: who you are signed in as, who the invitation is for, and a button to sign out and continue.

Opened while signed in as someone else
Tech: InvitationController, routes invitation.signed-in and invitation.switch; redirect built only from the stored invitation
4

Owner is notified

When the person completes sign-up, the company owner and the other Customer Admins get "X joined your company" in the notification bell (see In-app notifications).

Tech: CompanyUserJoinedNotification (database channel)

Platform admin access

A separate area for the product owner's staff (IPA Nordic) to give companies access and manage their licenses. Customers never see it.

1

Sign in

Staff sign in at /admin/login with email and password. Only accounts marked as platform admin can open the admin; everyone else gets "forbidden". Signing in lands on Companies & licenses.

Sign in
Tech: User::canAccessPanel(), column is_platform_admin (not mass-assignable); grant with php artisan platform:admin email (--revoke to remove)

How a company gets a license

The process, from the first contact to renewal. Payment is handled outside the app for now; the license fields are the same ones a payment system would set later.

1

1. A company starts

Either the company registers itself and automatically gets a 14-day trial with 5 seats, or staff create it with Create company (free, paid, or a trial with the seats and expiry you choose).

2

2. The owner is invited

For a company created by staff, the owner receives a "set your password" email. They sign in and complete account and company information. The company workspace is private to them.

3

3. The owner invites the team

From Business settings, up to the number of seats. The limit is enforced and the owner cannot change it.

4

4. Staff watch the list

Companies & licenses shows seats used, expiry and upgrade requests. Filters find trials ending within 7 days, upgrade requests and suspended companies.

5

5. Extend, upgrade or suspend

Staff edit the license, extend it by 30 days, or suspend and reinstate a company. Changes apply immediately. After the end date a company is read-only; it is switched back on by extending it.

6

6. Requests and warnings

The owner can send Request more seats; staff get one email and see it in the list. The owner and staff are emailed before a license ends.

Companies & licenses

One row per customer company. This is where staff create companies and manage seats and expiry.

1

The grid

Company, owner, license type (Free, Paid, Trial, Internal or Legacy), state (Active, Expired, Suspended), seats used out of the limit, and expiry. Every column sorts. The toolbar has search on the left and Create company on the right; the filter and column buttons sit next to it.

The grid
Tech: CompanyResource, route GET /admin/companies
2

Filters

License type, Ending within 7 days, Upgrade requested and Suspended.

Filters
Tech: table filters in CompanyResource
3

Row actions

Edit opens the license form. The More menu has Extend 30 days, Suspend / Reinstate and Clear upgrade request.

Row actions
Tech: row actions in CompanyResource::table()
4

Edit license

License type, status (Active or Suspended), seats (including the owner; empty means no limit), expiry date, and private notes for staff, for example an invoice number. Customers never see the notes.

Edit license
Tech: LicenseService::typeOptions()
5

Create company

Company name, owner name and email, license type, seats, expiry and notes. The owner gets a password email and then completes onboarding.

Create company
Tech: CompanyProvisioner::create(), reset email via Password::sendResetLink

Platform-wide grids

Read the data of every company in one place. All grids share the same layout: toolbar inside the card, compact 44 px rows, every column sortable and a one-piece pagination control.

1

Account settings

Every account: name, email, company, role (Owner, Customer Admin, Customer Sales, Customer Product or No company), position, verified and onboarded. More columns are in the column toggle. Create, edit and delete are available.

Account settings
Tech: UserResource (emails and names are masked in this image)
2

Business settings

One row per company: CVR, address, postal code, town, phone, currency, number of users and whether terms must be accepted. Read-only.

Business settings
Tech: BusinessResource
3

Integrations

Every company's HubSpot, ChannelCRM or Pipedrive connection with name, status and dates. Saved API tokens are never shown.

Integrations
Tech: IntegrationResource
4

Email templates

For each company, how many of its 10 email templates are customised, with Custom / Default badges (Offer delivery, Offer confirmation and Company invitation by default; the rest in the column toggle).

Email templates
Tech: EmailTemplateResource
5

View a company's templates

The View button shows each customised template's subject and a plain-text excerpt, or says the company uses the defaults.

View a company's templates
Tech: filament/email-templates-modal.blade.php
6

Translations

All translation keys across languages, sortable by language, group, key and value.

Translations
Tech: TranslationResource
7

Languages

The available languages, which is the default, active state and number of translations.

Languages
Tech: LanguageResource

Emails to platform admins

Staff are emailed once per event, as one message addressed to every platform admin.

1

Seat request

Sent when a company owner clicks Send request: company, who asked, the current license and the number of seats requested.

Seat request
Tech: LicenseUpgradeRequestMail
2

License ending soon

Sent by the daily job together with the owner's email, so staff can follow up before the license ends.

License ending soon
Tech: SendLicenseExpiryWarnings

Notifications & emails

Every email the system sends, who receives it and what triggers it. In-app notifications are the two bell menus described under Sales Room.

NotificationTypeRecipientTrigger
Login one-time codeNotification (mail)UserAfter correct password at login
Email verificationNotification (mail)UserAfter registration
Password resetNotification (mail)UserForgot-password request, or when staff create a company (owner sets a password)
Offer expiring / expiredNotification (mail + database)Sales repDaily job, when an offer reaches warning, due or lapsed stage
Offer expiry noticeMailableCustomerSame daily job
Offer deliveryMailableCustomerSeller clicks Send to customer
Offer reminderMailableCustomerEvery 15 min job, when reminder is due
Offer confirmationMailableCustomerCustomer responds to an offer
Seller notificationMailableSellerCustomer activity on a delivery
Company join requestMailableCompany ownerUser asks to join an existing company
Join request approved / rejectedMailableRequesting userOwner reviews the request
Company invitationMailable (SuiteTerms layout)InviteeAdmin invites a member
Invitation acceptedIn-app (bell)Company owner and Customer AdminsThe invited person completes sign-up
License endingIn-app (bell and banner)Every company user14 days or fewer left (trial: 7 or fewer)
License endingMailable (company language)Company ownerDaily job: 14 and 3 days before (trial: 3 days), once each
License ending (copy)MailablePlatform adminsSame daily job, one message to all admins
Seat requestMailablePlatform adminsOwner clicks Send request, one message to all admins
Account updatedMailableTeam memberAdmin changes role or access

Scheduled jobs: sales-room:send-reminders (every 15 minutes) and sales-room:send-expiry-notices (daily), and license:send-expiry-warnings (daily), defined in routes/console.php.