Homepage
Branded landing page with sign-in and create-account entry points. Content follows the selected language.
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.
Licensing and seats, a platform admin area for the product owner, and a cleaner look across the app.
The public entry point: company branding, the main call to action, pricing and the legal pages.
Self-service sign-up with legal consent and email verification.
Full sign-in flow: password step, one-time email code, a wrong password, and recovering a forgotten one.
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.
Email and password filled in, ready to submit with "Continue securely".
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.
Enter the account email to receive a password-reset link.
After a correct password a six-digit code is emailed. It is valid for 10 minutes and the number of attempts is limited.
Two steps every new user completes before reaching the Sales Room.
Profile photo, name, email and position, plus the signature style (typed or drawn). A live preview shows how the signature will appear on offers.
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.
The operational centre. Everything the sales team needs after sign-in is on one page, and the left menu leads to each area.
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.
Opens from "View customers". Searchable list of every business and contact person, tagged Business or Contact, with email and phone.
Opens from "View products". Shows each product with SKU, unit and price, and a button to create a new product.
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.
Two bell menus in the top bar keep the team informed without leaving the app.
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.
Clock icon lists unread offer-expiry notices (warning, due today, lapsed). Clicking one marks it read and opens the offer.
Opening the language menu, a bell or the user menu closes the others. A click outside or Escape closes the open one.
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.
Step by step, from a blank template to a saved, sendable offer. Nothing is saved until you click Create 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.
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.
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.
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.
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.
Turn on the Preview switch (top right) to see the cover and pages as the customer will see them. Close it to keep editing.
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).
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.
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.
Quote card with a star rating.
An image from an upload or a link.
Embeds a Canva design by link.
Embeds a Figma file by link.
Legal wording such as disclaimers.
Call-to-action button that opens a link or file.
Line-item pricing. Edited directly on the page.
Same price editor as Price table, titled "SaaS price", for subscription pricing.
Same price editor as Price table, titled "Services", for service lines.
Shows the seller signature from the user profile.
A divider line between sections.
A divider line with an icon in the middle.
Free formatted text.
A grid of tiles with text and images.
Four columns of text in one block.
Two columns of text in one block.
Review card for Trustpilot-style quotes.
A signature area with signer details.
Record a clip with your camera or upload a video.
Embeds a Vimeo video.
Lets the customer show interest and contact you.
Embeds a YouTube video.
Review an offer, send it to the customer and track the response.
Templates of type Offer / Proposal.
Final review page. Export as PDF, edit, or send to the 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.
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.
Business customers and private contacts, with one or more contacts per business.
Reusable products for price tables in offers.
Personal profile, position and signature.
Company profile, default terms and team management.
CRM connections that react when an offer is sent, accepted, shown interest in, or rejected.
Customise the subject and body of every automated email.
Branding for signed-offer PDFs.
Manage UI text per language.
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.
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.
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.
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.
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.
Everyone in the company is told early when the license is about to end, and what happens after.
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).
Same card in amber as the end gets close. A trial gets a single warning, at 3 days.
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.
If the platform owner suspends a company, every page redirects to a notice with a Sign out button until it is reinstated.
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.
Owners and admins invite colleagues from Business settings. Each invitation holds one seat until it is accepted or expires.
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.
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.
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.
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).
A separate area for the product owner's staff (IPA Nordic) to give companies access and manage their licenses. Customers never see it.
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.
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).
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.
From Business settings, up to the number of seats. The limit is enforced and the owner cannot change it.
Companies & licenses shows seats used, expiry and upgrade requests. Filters find trials ending within 7 days, upgrade requests and suspended companies.
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.
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.
One row per customer company. This is where staff create companies and manage seats and expiry.
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.
License type, Ending within 7 days, Upgrade requested and Suspended.
Edit opens the license form. The More menu has Extend 30 days, Suspend / Reinstate and Clear upgrade request.
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.
Company name, owner name and email, license type, seats, expiry and notes. The owner gets a password email and then completes onboarding.
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.
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.
One row per company: CVR, address, postal code, town, phone, currency, number of users and whether terms must be accepted. Read-only.
Every company's HubSpot, ChannelCRM or Pipedrive connection with name, status and dates. Saved API tokens are never shown.
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).
The View button shows each customised template's subject and a plain-text excerpt, or says the company uses the defaults.
All translation keys across languages, sortable by language, group, key and value.
The available languages, which is the default, active state and number of translations.
Staff are emailed once per event, as one message addressed to every platform admin.
Every email the system sends, who receives it and what triggers it. In-app notifications are the two bell menus described under Sales Room.
| Notification | Type | Recipient | Trigger |
|---|---|---|---|
| Login one-time code | Notification (mail) | User | After correct password at login |
| Email verification | Notification (mail) | User | After registration |
| Password reset | Notification (mail) | User | Forgot-password request, or when staff create a company (owner sets a password) |
| Offer expiring / expired | Notification (mail + database) | Sales rep | Daily job, when an offer reaches warning, due or lapsed stage |
| Offer expiry notice | Mailable | Customer | Same daily job |
| Offer delivery | Mailable | Customer | Seller clicks Send to customer |
| Offer reminder | Mailable | Customer | Every 15 min job, when reminder is due |
| Offer confirmation | Mailable | Customer | Customer responds to an offer |
| Seller notification | Mailable | Seller | Customer activity on a delivery |
| Company join request | Mailable | Company owner | User asks to join an existing company |
| Join request approved / rejected | Mailable | Requesting user | Owner reviews the request |
| Company invitation | Mailable (SuiteTerms layout) | Invitee | Admin invites a member |
| Invitation accepted | In-app (bell) | Company owner and Customer Admins | The invited person completes sign-up |
| License ending | In-app (bell and banner) | Every company user | 14 days or fewer left (trial: 7 or fewer) |
| License ending | Mailable (company language) | Company owner | Daily job: 14 and 3 days before (trial: 3 days), once each |
| License ending (copy) | Mailable | Platform admins | Same daily job, one message to all admins |
| Seat request | Mailable | Platform admins | Owner clicks Send request, one message to all admins |
| Account updated | Mailable | Team member | Admin 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.