Antwerp | Brussels | Berlin
Made to fit IKEA systems and unique spaces
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.