Seating chart maker
Import the guest list you already have, name the pairs who cannot sit together, and get a table plan that holds every one of them. When six people drop out, you reprint six place cards, not two hundred. Free, no account, and your list never leaves your browser.
Your guest list
Drop an .xlsx or .csv here, paste from Google Sheets, or . You can also .
Tables
Rules
Paste or drop your guest list, then choose how many tables the room has. The chart appears here.
Print and export
Three things this does that the others do not
It reads the spreadsheet you already have. Not a template you fill in, not a form you retype names into: the .xlsx, the .csv, or the cells you copied out of Google Sheets, with your column names, your plus-ones, your totals row and your "do not seat with" column. It then shows you exactly which column it read as what, so you can check its reading against your file before anything is solved.
It re-solves after an RSVP change without rebuilding the room. Six people drop out and four more say yes, and the chart you already printed place cards for stays almost exactly as it was. Only the guests who have to move, move, and the result names them.
It handles the whole room. A hundred and fifty guests with households, plus-ones, meal choices, accessibility needs, VIP tables and a list of pairs who must not be seated together is an ordinary input here, not the edge case. It solves in well under a second.
What it does, measured
Every number below was measured on this build rather than estimated. The solver timings are the median of seven runs on an Apple M5 Pro; the guest list is 150 people in households, with four VIPs, two guests needing step-free access, five "cannot sit together" rules and one "must sit together" rule, going into 20 tables of eight.
| 150 guests into 20 tables, with rules | solved in 29 ms |
|---|---|
| 300 guests into 40 tables | solved in 29 ms |
| Spreadsheet columns recognised | 14 kinds, 120 header spellings |
| Seating chart PDF, 150 guests | 39 KB, written in the browser |
| Place cards, 150 guests | 105 KB, 38 cut-and-fold sheets |
| JavaScript downloaded to use the tool | 10 KB compressed |
| Requests to any server but this one | none, including the PDF export |
| Guest limit, export limit, account | none, none, none |
How the seating is worked out
Everyone who has to stay together - couples, households, anyone joined by a "must sit together" rule - is collected into a block, and blocks are what get placed. That is what makes "keep these two together" structurally true rather than a preference the search can trade away later.
Blocks are then placed into tables and improved by a local search that scores each arrangement: a guest with no seat or a table with more people than chairs costs the most, a broken rule you typed costs the next most, accessibility and VIP placement next, and tidiness - even tables, one side of the family per table - least. The search stops when the score reaches zero or the time budget runs out, whichever comes first.
The same list with the same settings always produces the same chart. If you fix one typo and re-solve, you are not handed a completely different room to re-read.
What it tells you when it cannot do what you asked
Some lists have no solution. If two people must sit apart but a chain of "must sit together" rules ties them into the same block, no arrangement satisfies both. If a family of twelve must sit together and the largest table holds ten, they cannot be seated.
In both cases you get a sentence naming the guests and the rule that could not be honoured, instead of a chart that quietly broke it. Anyone who could not be seated is listed with the reason, and both of those lists are printed on the last page of the PDF. A seating chart that silently drops a rule is worse than no chart, because you will not find out until the night.
What comes out
A seating chart PDF, table by table, with meal choices if your list had them. A landscape floor plan of the room. Place cards on cut-and-fold sheets, printed on both halves so a folded tent card reads from both sides. An escort list sorted by surname for the door. Table signs, one page per table. And the whole chart as a CSV if you would rather take it back into a spreadsheet.
No watermark, no export charge, no cap on how many times you export while you are still changing your mind.
Where your guest list goes
Nowhere. The file is read, the chart is solved and the PDF is written inside your browser, on your own machine. There is no upload step, which is why there is no account: there is nothing to have an account for.
The list is kept in this browser between visits so you can close the tab and come back to it. Clearing your browser data clears it, and it is never sent anywhere.
Questions
- Is it really free?
- Yes. No account, no trial, no guest limit and no charge to export. The solving and the PDF writing happen on your computer, so there is no per-chart cost for anyone to pass on to you.
- Can it import my Excel or Google Sheets guest list?
- Yes. Drop an .xlsx or .csv, or paste the cells straight out of Google Sheets. Your column names are matched as they are, and the tool shows you what it read each column as before it seats anyone.
- How do I stop two guests sitting together?
- Add a "cannot sit together" rule, or put the name in a "do not seat with" column in your spreadsheet. It is treated as a hard rule, and if no arrangement can satisfy it you are told which pair failed rather than handed a chart that ignored it.
- What happens when the RSVPs change?
- Re-solve. The existing chart is kept and only the guests who have to move are moved, and the result lists exactly who they were. You reprint a few place cards instead of all of them.
- Is my guest list uploaded?
- No. Nothing about your guests is sent anywhere. The whole tool runs in the browser tab, including reading the spreadsheet and writing the PDF.
- Can I drag people around afterwards?
- Yes. Click a guest and then another guest to swap them, or click a guest and then a table to move them. Anything you place by hand is pinned, and the solver works around it the next time you re-solve.