Skip to content
Writing

Built a Figma plugin with Claude to streamline dummy data entry when designing a multi-market product

· 3 min readAI workflowDesign tools

Over two years of working on a global clienteling mobile app, one of the biggest issues I kept running into was the dummy data in mockups. Clienteling involves a lot of client data, and all of it has to be reflected in the app. At the same time, the app was used in 13 markets across Europe and APAC, and each market has its own conventions for legal names, phone number formats, currency and so on.

I believe mockups and prototypes only feel real when the data is contextual and realistic to end users and business stakeholders. Feeling real brings whoever is giving feedback back to reality, and prompts them to give useful feedback.

Key problem: filling mockups with dummy data by hand took too long on a multi-market product

Why it took so long

Every value was curated in Figma by hand. Figma's Payload feature could cover part of this today, but it hadn't been released when I tried to solve this issue.

Alternatives I tried

Sheets 2 Figma's cover: the plugin name in large type next to a green spreadsheet cubeSheets 2 Figma fills Figma layers from a Google Sheet.

I tried the Sheets 2 Figma plugin. It worked, but it still required me to curate a dataset in Google Sheets in advance. Using Claude Code or Codex to edit the Figma mockups through the Figma MCP server also worked, but the cost just didn't justify the approach.

So I decided to build a Figma plugin customised to my project context to solve this problem: localised, shareable with the team and easy to maintain.

Breaking the key problem into two smaller problems

The ideal flow I imagined: once the plugin reads the layer structure, it fills in coherent data automatically. Before developing a solution, I broke the key problem down into smaller ones.

1. How to create coherent values for a screen

For example, a client with an active status whose last purchase date a designer forgot to update to within the last 6 months. Or an order whose total is much smaller than the sum of all the SKUs listed in it.

Left: an active client whose last purchase was more than 7 months ago. Right: a grand total of SGD 228 for items worth over SGD 130,000

2. How to keep data formats consistent for each market

With manual entry, mockups sometimes show JPY in the France market view, or +852 in the Singapore market view. The market context must be correct for everyone.

A Hong Kong client (+852) whose lifetime spend is in SGD. The name Guy Hawkins doesn't match the email [email protected] either: the coherence problem from point 1

Solution: the Contextual Dummy Data private plugin

With help from Claude Code, I created a Figma plugin that reads the selected frames, identifies the right text layers and fills them with coherent, localised dummy data.

The Contextual Dummy Data plugin panel open in Figma for a client profile: Hong Kong (HKD) region, client tenure, name style, and the client fields it found with their proposed values, such as Felix Lo and +852 9939 1530The plugin panel: pick the market, review each field it found, then apply.

An optional rename banner lets you review confusing layer names

The plugin relies on precise layer naming, so this step is the preparation for high-quality dummy data.

The plugin's rename banner: 15 layers could use clearer names, with two ticked suggestions (Floyd Miles ×8 and Jane Cooper ×7 → full name) and a Rename ticked buttonThe rename banner suggests clearer layer names and renames the ticked ones on the canvas.

It detects the page type and fills data to match (solves problem 1)

For order data, the plugin makes sure the calculation is correct (grand total = all items − discount + shipping + tax), with the market's tax rate taken into account.

Filling an order detail for Singapore: the items, 9% tax, shipping and grand total add up, and the status tag switches to Completed

After applying, the result page lists every change, from the old value to the new one. If you want to inspect a change, Select picks that updated layer on the canvas.

The plugin's result page after filling an order detail: Updated 22 layers in 1 frame, each field listed from old to new value with a Select link, next to the order with the selected status tag highlighted on the canvasThe result page: Select picks the updated layer on the canvas, here the order status tag.

For client data, the plugin keeps the whole page coherent (for example, a client from Hong Kong shows the +852 prefix with an 8-digit phone number). The data also follows business logic, such as the last purchase date being within the past 6 months for an active client.

Filling a client list for France, sorted by total sales: French names, EUR amounts, and statuses that match the last purchase dates

A currency and region switch keeps content localised (solves problem 2)

The switch sets the phone number format, phone prefix, currency and tax rate. The name style adds another setting to decide whether client names should be in the local language, especially for Taiwan and Japan.

One profile, three runs: Japan in Latin letters, Japan in native script, then Australia, with the phone prefix, currency and website region following along

Bonus: every change is design system compliant

The plugin is component-aware. When an order status changes, the tag component switches to the matching instance too, so no instance gets detached. Colour and text tokens are all preserved.

Impact

Time per screen is my own estimate, not a formal measurement.

  • Time per screen: about 2 minutes (120 s) by hand, about 10 s with the plugin.
  • 15 screens: about 30 minutes by hand, about 2.5 minutes with the plugin.

Time saved per screen: (120 s − 10 s) / 120 s ≈ 92%. Over 15 screens, that's about 27.5 minutes every time the mockups are refreshed or switched to another market.

There were other gains that are harder to measure:

  • Consistency: order totals add up, statuses match dates, and lists are sorted every time.
  • Market switching: a whole flow can be re-run for another market in seconds, instead of re-curating every screen.
  • Better reviews: stakeholders react to the design, not to data that doesn't make sense.
  • Detail screens are covered too: profile screens no longer need a manual pass to make the header and the details table agree.