Designing Card Decks and Board Games in Google Sheets and Figma

Ryan Iyengar
6 min readSep 9, 2022

--

A common question I’ve seen in board game design groups is how to generate and manage large decks of cards with lots of unique attributes in an automated way. Here’s a free workflow I’ve found using Google Sheets and Figma to generate fairly large numbers of complex cards quickly and easily for playtesting in Tabletop Simulator or printing.

Key to this workflow is the amazing free Figma plugin Google Sheets Sync by Dave W. You can buy him a coffee here if you like this plugin as much as I do!

First, generate a Google Sheet with card data in it. Here’s an example sheet with a 20-card deck, with 4 suits numbered 1–5. You’ll notice the extra blank rows + columns are deleted, this dictates the limits for our plugin run.

Example Google Sheet with 20 cards

The “number” column is just an identifier for counting purposes, and won’t be used. The card title and title color columns will control the content of text layers and the background color of those layers. The next two columns suit and number aren’t used directly, but are useful spreadsheet tools to generate the final two columns. The number variant and suit variant columns will dictate which component variant will be used on which card.

Create a Figma design file, and generate a frame to hold the card template. This will allow us to modify a single template to place, size, or rotate components once, and have it reflected in our full deck. Here’s an example Figma file that I’ll be using to demonstrate the process.

Example Card Template in Figma

Create a 150x200 (or whichever dimensions you prefer) frame in Figma and name it Card Template. Next, add a rectangle layer called #title_color and a text layer called #card_title. These have a # symbol to start their layer name, as this is how the Google Sheets Sync plugin knows which column in the Google Sheet to look for and update. I don’t believe they’re case sensitive and spaces can work fine too. Then, select the frame, right-click and create a component (the purple diamond icons). This will be the main template.

Next, create a frame called Card Deck, and copy and paste an instance of the Card Template component into it 20 times. Important to note here that the order of the components in the layer navigator to the left matters quite a bit. The Google Sheets Sync plugin will operate on each of these layers from bottom to top. So if you want to make unique backs for cards, you’ll want both your front and back deck frames to share the same layer ordering + layout so that they stay in sync.

Now, run the first Google Sheets Sync, and get the Card Titles and Title Colors updated. From the plugins menu in Figma, select the Google Sheets Sync option:

And from there you’ll get this screen:

Enter the URL for your Google Sheet, and make sure it’s viewable by anyone with the link in the sharing settings. Then click Fetch & Sync.

If you’ve set everything up correctly, this is what should happen to your card templates in the Card Deck frame.

Example of first run of Google Sheets Sync with card titles and colors

Looking good already! The parts of the template called #card_title were updated with each of the 20 unique card titles from the spreadsheet, and each of the four suits has a unique hex color applied based on what was in the #title_color column. Let’s add some components and variants to these card templates, as that’s where the power of this plugin really shines.

Example component variants for Suit and Number

I’ve created a new frame with Suit and Number components on the same page in Figma. They must be on the same page if you want to run the Google Sheets Sync with the option of “only update current page”, which I prefer to do in more complex projects to minimize unintentional overwriting.

The suit icons are used from Amethyst Studio in the Noun Project, with a mask applied over a solid red color for Hearts and Diamonds. The numbers are text layers with the Julius Sans One font. Important to note that each component variant has a property value set, e.g. Suit=Clubs or Number=2. This is visible if you select a variant and look at the Design view on the right of Figma, or if you double-click the name of the variant as I have done for Clubs in the screenshot. This is critical to link up exactly with the values set in our spreadsheet.

The Google Sheets Sync plugin can work to swap in components based on sheet values, but I prefer to have it swap out variants of set components instead. For board game or card game designs, it seems more common to have the same type of thing show up in the same place (component), but want to vary which type (variant) based on the unique card.

In order to see these new variants appear, copy and paste instances of them to the Card Template component. The instance of the Suit component is called #suit_variant, and the instance of the Number component is #number_variant, both matching the Google Sheet column names.

Now for the final run to see it all come together! De-select everything else, then click Re-sync Google Sheets Data in the Plugin section on the right of Figma.

Final output of running Google Sheets Sync with all component instances and variants in place

Looks great! We have 20 unique cards based on our spreadsheet, and if we wanted to make 200 it would be very doable using the same process. We’d just add 180 more rows to our spreadsheet with unique values, and add 180 more instances of our Card Template component to a frame, then run the plugin. You can also use multiple sheets or tabs for multiple decks, defining which sheet to use by placing a // Sheet Name indicator in the name of your frame or template.

Finally, to export to Tabletop Simulator or for printing, select the Card Deck frame, then on the lower right of the Design tab, you can Export. I recommend using the 4x option if you’re designing in small sizes like I am, as the standard poker card size is more like 822x1122 pixels rather than 150x200.

I typically export directly to a Dropbox folder. Then when importing to Tabletop Simulator, I use the Dropbox direct link, so I don’t need to upload multiple times when making changes. Make sure to change the final 0 from a 0 to a 1 so this actually works, e.g.

https://www.dropbox.com/s/adsfadfs/adsfadsf.png?dl=1

Making changes while running TTS will need a server refresh (exit to main menu and relaunch the game), and turn off the mod caching option to make sure you’re getting the latest uploaded Dropbox version.

There are plenty of other workflows and amazing purpose-built design software like InDesign that can do much better professional work for final publishing and print runs. But for a rapid prototyping phase on a budget, this free workflow can be a big help!

If you’re interested in following along with my board game design journey, feel free to join my Discord server where I’ve used this method to design my cooperative puzzle game Gatherer.

--

--