All writing
Design

From Figma to production without the handoff pain

The gap between a design file and shipped code is where quality leaks out. Here is how we keep design and engineering in step so the built product matches the intent.

Sara Khan · Design Lead29 July 20256 min read

There is a moment in many projects where a beautiful design file is thrown over a wall to engineering, and what comes back is recognisable but not quite right. Spacing is off. States are missing. The interaction feels heavier than intended. Everyone is frustrated, and nobody is exactly wrong. This is handoff pain, and it is one of the most common ways quality leaks out of a product between design and launch.

The cause is treating handoff as a moment instead of a relationship. A design file is not a specification that contains everything an engineer needs. It is a snapshot of intent, and intent needs conversation to survive the trip into code.

Why handoff goes wrong

The classic failure is the design file that shows the perfect case and nothing else. One filled in form, one populated list, one happy user. Then the engineer hits reality: what does this look like with no data, with too much data, with a name that is forty characters long, with a slow network, with an error from the server?

If those states are not designed, the engineer invents them under time pressure, and the result drifts from the intent. The fix is not better tools. It is designing the unglamorous states up front.

  • Empty states, before any data exists.
  • Loading states, while data is on its way.
  • Error states, when something goes wrong.
  • Overflow, when content is longer than expected.
  • The smallest and largest screens the product must support.

A design that covers these gives engineering far less to guess at, and guessing is where quality erodes.

Design with the same building blocks as the code

The smoothest projects we run share one habit: design and code are built from the same set of components, named the same way. When a designer uses a primary button and the codebase has a primary button that matches, the translation is almost automatic. When the design invents a one off button that exists nowhere in code, every instance is a small negotiation.

This is where a shared component library earns its keep. It is not about restricting designers. It is about making the common path consistent so that creative energy goes into the genuinely new parts, and the familiar parts simply line up between the file and the build.

The closer your design components map to your code components, the less there is to lose in translation.

We also agree on the foundations early: the spacing scale, the type sizes, the colour values, named identically in both worlds. When an engineer reads a spacing value from the design and finds the exact same named value in the code, there is nothing to interpret.

Talk before, during and after, not only at the end

Handoff should not be a single event. The best results come from engineers seeing the design while it is still forming, not after it is finished.

When an engineer reviews a design in progress, they catch the things that are expensive or awkward to build before those choices are locked in. A slightly different layout might be far cheaper to build and just as good, but only if the conversation happens before the design is signed off. We bring engineering into design reviews precisely for this reason.

During the build, we keep the loop tight. The designer reviews the work in progress on a real device, not just in the file, and flags the small differences while they are still cheap to fix. A five minute look at a half built screen prevents a long list of corrections at the end.

Review the built thing against the intent

Before a feature ships, we do a design review of the actual built product, side by side with the design. Not the file in isolation, and not the build in isolation, but the two together, on the devices real users will hold.

This catches the accumulated small drifts: the spacing that crept, the state that was missed, the animation that ended up heavier than intended. None of these are dramatic on their own. Together they are the difference between a product that feels considered and one that feels almost finished.

A workflow that holds up

Pulled together, the approach is straightforward. Design the awkward states, not just the perfect one. Build design and code from the same named components and foundations. Bring engineering into design early, keep the loop tight during the build, and review the real product against the intent before it ships.

None of this requires exotic tooling. It requires treating design and engineering as one team working toward the same result, rather than two teams exchanging files. When that mindset is in place, the handoff stops being a cliff and becomes a smooth slope, and the thing your customers use actually matches the thing your team imagined.

Let us build the thing
you keep putting off.

Book a free consultation. Tell us what you are building and we will come back with scope, budget and a realistic timeline.