AEKIS Birthday Scenario — Developer Specification
21 Oct 2026 · @Joost
Purpose and scope
The Birthday Scenario turns the AEKIS wardrobe system into a guided online journey: the customer starts from a finished look, picks a colour, enters the room, and the system returns AEKIS walls that are guaranteed to be installable. The rule that makes AEKIS different, and that the developer must implement exactly, is the tilt-up height rule in the height engine below.
Part
Owner
Delivers
Website (pages, collection grid, room step, quote form)
Firmax web developer
Responsive site in NL and FR, configurator embedded
3D viewer, materials, price per configuration
Aino (aino.ar)
Viewer integration as in the Aino SaaS addendum, unbranded, iframe or JS embed
Height and width engine
Firmax web developer (or Aino, to decide)
The calculations in this spec, as one shared module
Orders, payments and sample orders
Odoo 19 Enterprise
Confirmed sales order + payment, sample orders, abandoned-configuration leads
Odoo integration details
Terje (Aino)
API fields and the JSON export format for Odoo
In scope: online checkout with payment and online sample orders. Out of scope for this phase: the KOMPLEMENT interior (added later, as the addendum states) and IKEA PAX/METOD configurators.
Customer journey
The journey runs from inspiration to a paid online order in six steps, with no showroom visit needed. The target is a customer who designs and buys on a Sunday afternoon on the sofa. The price is visible from step 2 onwards.
1. Collection grid (like Tylko). Cards for the AEKIS looks: Doorlopende kastwand, Open legplankelement, Geïntegreerde tv-nis. Each card shows a photo, a “from” price, and colour thumbnails that switch the photo.
2. Quick colour pick in the Aino viewer. The customer sees the chosen look in 3D at a default size (e.g. 2250 × 2396 mm). The colour families are Softtones and Fenix, and the indicative price updates live.
3. “Maak op maat” — room step. The customer enters:
◦ wall width (mm)
◦ ceiling height (mm), marked as the key value, with a help text on measuring at the lowest point
◦ side condition: wall-to-wall, wall on left, wall on right, or freestanding
◦ nothing else on height up to a 2784 mm ceiling (doors run to 22 mm from floor and ceiling); above that, a choice between top cabinet and open to ceiling
4. Engine result. The system immediately shows the cabinet height, the gap and the reason (“your ceiling is 2500 mm, so the wardrobe is 2396 mm, because it has to tilt up during installation”).
5. Proposals (like VEKE). Two to four ready layouts that fit the wall, each with a module split, fillers, a 3D preview and a price. The customer picks one and can still change the colour or swap a module for an open shelf or TV niche.
6. Buy online. This is the main call to action, and checkout happens in the same session:
◦ choose delivery only, or delivery plus installation
◦ confirm the measurements with a checkbox (“I measured the ceiling at its lowest point”)
◦ pay online (Bancontact, card, iDEAL/Payconiq via the Odoo payment provider)
◦ receive an order confirmation with the PDF drawing and parts list
Customers who still hesitate get two low-threshold exits:
◦ Order samples online: a sample pack of the chosen colour(s), shipped by post, with the price credited on the wardrobe order
◦ Save / share: a PDF, email or link to come back later; this also captures the email for follow-up
Showroom visits are not part of the online flow. Showrooms are mentioned only in the footer.
On every step the configuration lives in the URL (a share link) so the customer can go back without losing input.
Height engine: the tilt-up rule
The cabinet height is the tallest value on the 32 mm grid whose diagonal still clears the ceiling when the cabinet is tilted up. AEKIS carcasses are assembled lying on the floor, already on their 65 mm adjustable feet, then tilted upright. The doors go on afterwards. The ceiling must therefore clear the carcass's diagonal, not its height.
Inputs
• Ceiling height C (mm), measured at the lowest point of the wall
• Carcass depth D = 594 mm (without fronts)
• Feet height F = 65 mm, mounted before tilting and included in the grid heights
• Safety margin M = 10 mm, for uneven floors and ceilings
• Height grid G, total height including feet, in 32 mm steps: 2748, 2716, 2684, 2652, 2620, 2588, 2556, 2524, 2492, 2460, 2428, 2396, 2364, 2332, 2300, 2268, 2236, 2204, 2172, 2140, 2108, 2076, 2044, 2012
Rule. Choose the largest H in G that satisfies:
\sqrt{H^2 + D^2} \le C - M
The wardrobe's total height is H itself (carcass = H − 65 mm), and the top gap is C − H. If no H fits (ceiling below 2108 mm), the engine shows “ceiling too low for AEKIS, contact us”. If C is above 2821 mm, it caps at 2748 and the gap grows.
Test cases. The developer's unit tests must reproduce these values exactly.
Ceiling C (mm)
Height H incl. feet (mm)
Carcass H − 65 (mm)
Tilt diagonal (mm)
Top gap (mm)
2300
2204
2139
2283
96
2350
2236
2171
2314
114
2400
2300
2235
2375
100
2450
2364
2299
2437
86
2500
2396
2331
2469
104
2550
2460
2395
2531
90
2600
2492
2427
2562
108
2650
2556
2491
2624
94
2700
2620
2555
2686
80
2750
2652
2587
2718
98
2800
2716
2651
2780
84
The gap after tilting is always 75–126 mm on the grid, so the earlier rule of thumb (“250 cm ceiling = 245 cm cabinet”) does not hold for the carcass. A 250 cm ceiling gives a 2396 mm carcass on feet. The doors close that gap, so no top strip is needed.
Door height is made to measure: the doors finish 22 mm from the floor and 22 mm from the ceiling (confirmed by Firmax), so door height = C − 44 mm. Doors are hung after tilting, so the tilt rule does not limit them. They extend above the carcass by C − 22 − H (53–104 mm on the grid) and cover the feet zone down to 22 mm above the floor. Example: C = 2500 gives H = 2396 and doors of 2456 mm. The result is a closed wall from floor to ceiling with an even 22 mm reveal, which is the AEKIS look. The door construction detail (how the door is fixed above the carcass) follows the AEKIS door design drawings.
Maximum door height is 2740 mm for one full door (confirmed by Firmax). A single door from 22 mm to 22 mm therefore works up to a ceiling of 2784 mm. Above that, the room step asks the customer to choose:
Ceiling C
Front build-up
What the customer sees
up to 2784 mm
one door per opening, height C − 44
Closed wall, 22 mm reveal at floor and ceiling
above 2784 mm, option top cabinet (default)
tall door + top-cabinet door, split at the carcass top; the top cabinet fills to 22 mm under the ceiling
Closed wall, one horizontal split line
above 2784 mm, option open to ceiling
one door of 2740 mm from 22 mm above the floor
Visible distance of C − 2762 mm to the ceiling
The top cabinet build-up (its own carcass height and the door split) follows the AEKIS drawings; the engine only needs the split height and the two door heights.
The carcass is sized by the tilt rule. The doors are sized by the ceiling (C − 44 mm) and hide the gap above the carcass and the feet zone.
Width engine: modules, fillers and side panels
The wall width is filled with standard carcass modules, and the remainder goes into filler strips on the wall sides. The customer sets the side condition in the room step, and the engine adds the right end pieces automatically.
End pieces per side condition
Side condition
Left end
Right end
How the width is used
Wall to wall
filler 30–150 mm
filler 30–150 mm
Filled exactly: modules + two equal fillers = wall width
Wall on left
filler 50 mm (30–100)
visible side panel P
Width is a maximum; the rest stays open floor
Wall on right
visible side panel P
filler 50 mm (30–100)
Width is a maximum; the rest stays open floor
Freestanding
visible side panel P
visible side panel P
Width is a maximum
Testing showed why the rule differs per side condition. With 500/750/1000 modules and fillers capped at 100 mm, only 59% of wall-to-wall widths and 28% of one-wall widths (1200–6000 mm, in 10 mm steps) got a valid layout. With the rules above, coverage is 100% for every side condition.
A filler of at least 30 mm against a wall lets the doors open past the wall and absorbs walls that are not square.
Algorithm
1. Available width: A = wall width − (number of visible side panels × P).
2. Enumerate every combination of module widths (default 500, 750 and 1000 mm, PAX-compatible so KOMPLEMENT fits later), up to 12 modules.
3. Keep the combinations that fit:
◦ wall to wall: the remainder A − sum falls between 60 and 300 mm, split equally over two fillers
◦ one wall: the sum leaves at least 30 mm for the wall filler
◦ freestanding: the sum is at most A
4. Score each one, lower is better:
◦ number of different module widths × 100 (calm, equal doors are the AEKIS look)
◦ number of modules × 10
◦ filler width (wall to wall) or open floor left (other cases) × 0.1
5. Arrange the modules symmetrically (equal widths in pairs outside, any odd one in the centre).
6. Return the best four distinct layouts as proposals. The chosen look adapts them:
◦ Open legplankelement: the 500 module nearest the centre (or the centre module) becomes an open shelf element
◦ Geïntegreerde tv-nis: needs at least 4 modules and a niche of at least 1500 mm; the central 2 or 3 modules become the TV niche with drawers below
7. If nothing fits (e.g. TV niche on a narrow wall), show the nearest wall width that works and offer the plain wardrobe instead.
Module widths, filler limits and P (side panel thickness) are parameters (see the last section), so Firmax can change them without code changes.
Proposals, price, outputs and Odoo
Every proposal is one configuration object, and the viewer, the price, the PDF and Odoo all read that same object, so they can never disagree.
Configuration object (JSON, also in the share URL)
{
"look": "kastwand | legplank | tvnis",
"room": { "wallWidth": 3200, "ceiling": 2500, "side": "wall-to-wall", "doorHeight": 2456 },
"height": { "grid": 2396, "feet": 65, "carcass": 2331, "gap": 104 },
"modules": [750, 750, 750, 750],
"ends": { "left": { "type": "filler", "mm": 100 }, "right": { "type": "filler", "mm": 100 } },
"colour": { "family": "Fenix", "name": "Oro Cortez" },
"handle": null,
"priceIndicative": 0
}
Price. The price is calculated from the product database (Google Sheet, per the Aino addendum) as modules + doors per door height + fillers + side panels + colour family surcharge. It is shown incl. 21% VAT and labelled “indicatief”. Placement and transport are a separate line from Odoo. Prices are public, with no login needed (confirmed by Firmax).
Outputs per configuration
• 3D view in the Aino viewer (unbranded)
• PDF: front elevation with all dimensions, the tilt-rule note, a parts list with product IDs, and the price
• Share link and QR code
• Production JSON (Aino → converter → XML for the producer, per the addendum)
Odoo 19 integration (field mapping to be supplied by Terje)
• Buy online (main flow): create a confirmed sales order with product IDs from the configuration and the JSON and PDF attached. Payment runs through an Odoo payment provider (e.g. Mollie or Stripe, with Bancontact, card and Payconiq). Delivery or delivery plus installation is a separate order line. The customer gets the confirmation email in their language.
• Order samples: a separate small eCommerce order for the sample pack. It is tagged so the sample price can be credited on a later wardrobe order with the same email.
• Save / share: no order. If the customer leaves an email address, a CRM lead is created with source “configurator saved” and the share link, for a follow-up email.
• Every order and lead carries the UTM source, the language and the share link, so sales and production open exactly what the customer saw.
Parameters and open items
All numbers below live in one config file (or one tab of the product Google Sheet), never hard-coded.
Parameter
Value
Status
Height grid H
2012–2748 mm, 32 mm steps (24 values), including feet
Confirmed
Carcass depth D
594 mm without fronts
Confirmed
Feet F
65 mm, adjustable, mounted before tilting
Confirmed
Door reveal
22 mm at floor and ceiling, door height = C − 44, max 2740 per door
Confirmed
Prices
Public, no login
Confirmed
Safety margin M
10 mm
Proposed
Module widths
500 / 750 / 1000 mm (placeholder)
From AEKIS drawings
Filler, wall to wall
30–150 mm per side
Proposed
Filler, one wall
50 mm (30–100)
Proposed
Side panel thickness P
19 mm
Proposed
Languages
NL and FR at launch, DE and EN later
Proposed
VAT shown
incl. 21%
Proposed
Open items
[x] Firmax: grid heights include the 65 mm feet (confirmed 21 Oct).
[x] Firmax: doors finish 22 mm from floor and ceiling (confirmed 21 Oct).
[x] Firmax: prices are public (confirmed 21 Oct).
[ ] Firmax: take module widths, the open-shelf element and the TV-niche build-up from the AEKIS drawings into the parameter file.
[ ] Firmax: the price table per element, door height and colour family, plus the sample pack price.
[ ] Firmax: delivery and installation prices per region, payment terms (full or deposit) and withdrawal terms for made-to-measure goods (have this checked legally).
[ ] Terje / Aino: Odoo field mapping, the production JSON format, and how the viewer receives the engine's configuration (URL parameters or JS API).
[ ] Aino: can the viewer render the variable height (24 steps), the door height (C − 44) and the fillers from parameters, or does each height need its own model?
[ ] Developer: build the height and width engine as one tested module (the test cases above), shared by the website, the PDF and the order export.