When you send a board out for assembly, the fab needs to know where every part goes. That is what the pick-and-place file is for.
Short answer: the pick-and-place file — also called the CPL, centroid, or POS file — tells the assembly machine where each component sits on the board. For every part it lists the reference designator, the X and Y position, the rotation angle, and which side of the board it is on. Without it, a fab has your copper but no idea how to populate it.
What a pick-and-place file contains
Whatever a tool calls it, the file is a simple table with one row per placed component. These are the columns that matter:
| Column | Meaning |
|---|---|
| Designator (Ref) | The component reference, e.g. R1, U3, C12. Matches your schematic and BOM. |
| X (PosX) | Horizontal position of the component centroid, relative to the board origin. |
| Y (PosY) | Vertical position of the component centroid, relative to the board origin. |
| Rotation | Angle in degrees the part is rotated from its default orientation. |
| Side (Layer) | Which side the part is on — top or bottom. |
The X/Y coordinate is the part's centroid — the geometric centre of the footprint — not a corner or pin 1. Assembly machines position parts by their centre, so this is what they expect.
The designator column is the link between three files: your placement file, your BOM, and the board itself. If C12 appears in the placement file, it must also appear in the BOM so the machine knows what to place, not just where. Getting your BOM right is a related job — see how to add LCSC part numbers to a KiCad BOM.
The GUI method: Footprint Position File
In KiCad, generate the file from the PCB editor:
- Open your board in the PCB editor (Pcbnew).
- Go to File → Fabrication Outputs → Component Placement (.pos, .gbr). This opens the Generate Placement File dialog.
- Choose your Format — CSV is the most portable and is what most assembly houses want. ASCII and Gerber X2 are also available.
- Set Units to millimetres.
- Decide whether you want a single file for both sides or separate files per side (see below).
- Click Generate Position File.
KiCad writes a .pos or .csv file with the columns described above. This is the same file that older KiCad versions and some fabs still call the "footprint position file" — the name changed over versions, but the contents are the same.
The kicad-cli method
If you prefer the command line — or you want the file generated automatically as part of a pipeline — KiCad ships kicad-cli, which produces the placement file without opening the GUI:
kicad-cli pcb export pos --output pos.csv --format csv --units mm --side both board.kicad_pcb
Breaking that down:
pcb export pos— the placement (position) export subcommand.--output pos.csv— the file to write.--format csv— CSV output; you can also useasciiorgerber.--units mm— millimetres, which is what most assembly houses expect.--side both— include both top and bottom parts; also acceptstoporbottom.board.kicad_pcb— your PCB file.
Because it is a single command against your .kicad_pcb, it is reproducible: the same board always yields the same placement file, with no clicking through dialogs and no chance of exporting the wrong revision by hand.
Top vs bottom side
Boards with components on both sides need placement data for each side. You have two choices:
- One combined file with a side column marking each part
toporbottom(--side both). This is what JLCPCB and most modern assembly houses prefer. - Two separate files, one per side (
--side topand--side bottom), which some older fab workflows expect.
Check what your assembler asks for. When in doubt, a single combined CSV with a clear side column is the safest bet.
Units and origin
Two settings quietly cause most placement headaches:
- Units. Export in millimetres unless your fab explicitly asks for inches. Mixing units between your Gerbers and your placement file is a classic way to get parts placed in the wrong spot.
- Origin. The X/Y coordinates are measured from the board origin. Use the drill/place origin you set for your Gerber and drill exports, and keep it consistent across all your fabrication outputs. If your placement file uses a different origin than your copper, the two data sets will not line up and the assembler will have to correct it — or reject the job.
Set the drill/place origin once, use it for Gerbers, drill files, and placement, and everything stays aligned.
Rotations and why they sometimes need adjusting
Rotation is the field most likely to trip you up. KiCad records each part's rotation relative to its own footprint origin and the orientation the footprint was drawn in. That is internally consistent, but it does not always match the convention an assembly house uses for a given part — especially where pin 1 or a polarity marker should point.
The result: a part can be correct in KiCad and still come out rotated 90° or 180° on the assembled board, because the fab's library expects a different zero-degree reference. Polarized parts — diodes, electrolytic caps, ICs, connectors, LEDs — are the usual suspects.
Fabs publish rotation-correction guidance for exactly this reason. The practical fixes are to apply per-part rotation offsets before or after export, keep a correction table for parts you reuse, and always sanity-check polarized components against the fab's expected orientation before you commit to a run.
What JLCPCB expects
JLCPCB's assembly service takes a CPL file that is, at its core, the same placement data: designator, mid-point X, mid-point Y, rotation, and layer. The specifics — exact column headers, the combined-file layout, and the rotation conventions per component type — have their own requirements that are worth getting right the first time. We cover them in detail in the JLCPCB BOM and CPL format guide.
The short version: export in millimetres, keep the origin consistent with your Gerbers, provide both sides in one file with a side column, and verify rotations on polarized parts.
Let GoForFab handle it
Generating the placement file by hand every revision — and remembering to keep its origin, units, and rotations in sync with your Gerbers and BOM — is exactly the kind of repetitive step that goes wrong under deadline pressure.
GoForFab generates the CPL automatically alongside your Gerbers and BOM every time you push, using kicad-cli under the hood, so your manufacturing package is always current and always reproducible. It is free forever on the starter tier. If you would rather not think about position files again, connect a KiCad project and let the pipeline produce them for you.
If you also want to double-check your fabrication outputs, our guide on exporting Gerbers from KiCad walks through the matching origin and layer settings.