norra · Sponsored
Start with one seat and add more as your home grows. Free delivery, 100-night trial.
Build your Norra →Norra is a direct-to-consumer modular sofa brand. I built a reference-locked AI workflow that places the real product into fully generated scenes and produces hero, lifestyle, ecommerce and paid-social imagery to one brand standard. Each image is planned around its placement in a layout and the job it has to do.
Making one good image is easy. Making eleven images where the arm radius, backrest count, welt seam and oak legs match the physical product every time takes a process. This page documents that process: the reference library, the prompt architecture, the QA gate and the layouts the images were made for.
Before generating anything, each asset got a channel, a commercial job, a format and a copy-safe zone. An image is approved when it does that job inside its layout. How it looks on its own is only part of the check.
| Asset | Channel | Objective | Format | Copy zone | |
|---|---|---|---|---|---|
![]() | Homepage hero | Web · above the fold | Show the full 3-seat at a glance and set the brand mood. Carry an H1 and CTA. | 16:9 → 4:5 | Left 38% |
![]() | Lifestyle · reading | PDP gallery, email | Show the seat depth and that you can curl up on it. | 4:5 | None |
![]() | Lifestyle · doorway | Editorial, organic social | Make the sofa look like part of a real home. | 4:5 | Door frame |
![]() | Single module | PDP · 1-seat option | Answer "will it fit a small flat?" One module works as a lounge chair. | 4:5 | None |
![]() | Material detail | PDP, retargeting | Show texture and softness, which a photo of the whole sofa can't. | 1:1 | None |
![]() | Configuration · 2-seat | PDP configurator | Show exactly what a 2-module build looks like. | 3:2 | None |
![]() | System drawing | PDP, how-it-works | Explain modularity in one look. | 16:9 | Left 33% |
![]() | Feed ad | Meta / Pinterest | Stop the scroll and stay recognisable as a thumbnail. | 4:5 | Top 35% |
![]() | Story ad | IG / TikTok story | A warm, relatable moment. Durability, pet-friendly. | 9:16 | Top 14% / bottom 20% |
Four clean renders form the source of truth. Each generation gets only the views that match its camera angle. A module shot gets the module view, and a 3/4 hero gets the 3-seat view plus both arm modules so the model can see each end. Seven fidelity attributes are written down once and checked on every output.




F1 · ArmThick, rounded arm with soft radius corners. Top sits just below the backrest.
F2 · BackrestOne pillowy backrest cushion per module. Never one continuous bench back.
F3 · SeatDeep loose seat cushion with a soft welt seam along the base.
F4 · LegsTapered round legs in light oak. No metal, no plinth.
F5 · FabricCream-white bouclé with a fine, dense, curly loop. Not teddy fleece, not linen.
F6 · ConfigurationModule count and arm placement match the brief. Arms only on the outer ends.
F7 · ProportionLow profile, deep seat, generous arm-to-seat ratio. Not stretched to fill the frame.
Placement, lens, angle and where the product sits in frame, written in percentages so copy zones are reserved in the composition from the start.
The seven fidelity attributes, word for word, in every prompt. Ends with explicit negatives: no piping, no buttons, no pillows covering the backrest.
Drawn from a fixed set of materials: limewashed plaster, wide-plank oak, stoneware, linen, dried branches. Scenes change but stay in the same world.
Low-angle warm window light from frame-left. One light direction across the whole set, so images sit together in a grid.
Photographic register, true colour, light grain, and no generated text or logos. Type is always set live in the layout.
Every frame uses the same product lock and the same light direction. The scenes, people and formats change. Viewed as a set, they read as one shoot.



Reading. A person adds scale and shows the seat depth. Her face is turned to the book, so the product stays the subject.
Doorway. Framing borrowed from interiors editorial. The dark foreground makes the room feel lived in and gives the sofa depth.
One module. Only the armless reference was passed, so the model had no arm geometry to add by mistake.



System drawing. Same references, different medium. Line art explains the joins better than a photo, and the empty third holds a "How it works" headline.
Material. Raking light at 100mm. The hand compressing the bouclé shows softness without a word of copy.
Configuration. A layout that doesn't exist in the reference set. Two arm modules with no centre module, built from REF-C and REF-D only.
Ad frames were generated with their copy zones built into the prompt, then type was set live on top. The red dashed lines mark platform UI that covers the image. The product never sits under them.
Feed 4:5 · 1080×1350 · headline in top 35%
norra · SponsoredStory 9:16 · 1080×1920 · dashed = UI overlay
A feed ad is often seen at thumbnail size. Each frame is checked at 160, 96 and 64px. If the silhouette still reads as a Norra sofa at 64px, the frame passes.





The hero was composed for both crops. On desktop the headline sits over the empty wall. On mobile the image crops to 4:5 around a set focal point and the copy moves below, so type never sits on top of the product.
SofasModulesFabricsStores
Start with one seat and grow from there.
Build your NorraDesktop ≥1024px · 16:9 · object-position 60% 55%
☰
Start with one seat and grow from there.
Build your NorraMobile 390px · 4:5 · object-position 68% 50%
Set on the centre module's seat. Every crop keeps it in the middle third.
Ink #1C1B19 on the plaster wall measures above 10:1, so no scrim is needed and the image stays clean.
2752px master, then 2400w / 1600w / 1080w AVIF and JPG with art-directed srcset for each crop.

Each output was scored against the seven fidelity attributes before it went into a layout. Two of eleven generations failed on composition and format. The product itself rendered correctly in both. The fix in each case was a more specific [SHOT] block. Regenerating with the same prompt and hoping wasn't the plan.
| Asset | F1 Arm | F2 Back | F3 Seat | F4 Legs | F5 Fabric | F6 Config | F7 Prop. | Layout fit |
|---|---|---|---|---|---|---|---|---|
| Homepage hero v2 | ||||||||
| Lifestyle · reading | ||||||||
| Lifestyle · doorway | ||||||||
| Single module | ||||||||
| Material detail | ||||||||
| Configuration · 2-seat | ||||||||
| System drawing | ||||||||
| Feed ad · terracotta | ||||||||
| Story ad v2 |
v1 · Reject
v2 · ApprovedThe product was accurate, but the right arm fell off the frame. A homepage hero has to show the whole sofa, and the mobile crop had nothing left to recover it from.
v1 · Reject
v2 · Approved"Keep the top and bottom 22% calm" came back as flat colour bands around a small photo. The product was right, but the frame was unusable as a story.
The aim is for the whole design team to get the same result, not only me. These rules turned this project into a repeatable workflow.
The product block is copied unchanged from the library. Editing it per shot is how drift starts.
Pass only the views the shot needs. Extra angles give the model more geometry to blend, which leads to errors.
Give product position and copy zones as percentages of the frame. Reserve space at generation time instead of fixing it in a crop.
"Empty" and "safe zone" get read as borders. Name the wall, floor or sky that should be there.
Find which block caused the reject, change only that block, and log the change. Two rejects led to two rule updates.
An image is approved only after it's placed in its real template at every breakpoint and at thumbnail size.