Running a bulk postcard mailing from CSV data is one of the most efficient things a business can do with direct mail. Instead of sending 500 identical cards that feel like junk, you send 500 cards where each one addresses a specific person by name, references their property, mentions their loyalty tier, or shows them an offer code built just for them.
This guide walks through the entire process — from formatting your CSV file correctly to mapping variable fields, previewing proofs, and avoiding the errors that cause campaigns to fail. Two real-world scenarios run through the whole guide: a real estate agent sending home valuation postcards, and a small retailer sending loyalty discount offers.
By the end, you'll know exactly how to take a raw spreadsheet and turn it into a personalized campaign that lands in real mailboxes.
What You Need Before You Start
Before touching your CSV, get these in order:
- A mailing list — at minimum: recipient full name, mailing address, city, state, ZIP code
- Your variable data — the custom fields you want to swap per recipient (estimated home value, offer code, loyalty discount, etc.)
- A postcard design — or be ready to build one inside WriteToMail's postcard creator
- A WriteToMail account — the platform handles printing, postage, and USPS delivery, so no printer or post office trips required
One important framing: variable data fields are only as powerful as the data behind them. If your "First Name" column has 43 entries that say "Homeowner," your personalization falls apart. Clean data first, campaign second.
Step 1: Structure Your CSV File Correctly
Your CSV is the backbone of the campaign. Every column becomes a potential variable field — but only if it's formatted consistently.
Required columns
At minimum, your CSV needs these columns:
| Column Name | Example Value | Notes |
|---|---|---|
| FirstName | Sarah | No spaces in column headers |
| LastName | Nguyen | Keep separate from FirstName |
| Address1 | 4821 Maple Drive | Street address only |
| Address2 | Apt 3B | Optional — leave blank if N/A |
| City | Austin | |
| State | TX | Two-letter abbreviation |
| ZipCode | 78701 | Five digits; don't let Excel strip leading zeros |
Optional variable fields (the personalization layer)
This is where campaigns get interesting. Add columns for anything you want to appear uniquely on each card:
| Column Name | Real Estate Example | Small Business Example |
|---|---|---|
| CustomMessage | "Your home could be worth more than you think." | "Thanks for being with us for 3 years!" |
| OfferCode | HOMEVALUE2026 | LOYAL20 |
| VariableData1 | Est. Home Value: $487,000 | Loyalty Tier: Gold |
| VariableData2 | Last sold in 2019 | Last purchase: Sept 2026 |
Expected outcome: A clean, consistently formatted spreadsheet where every row represents one recipient and every column is a potential personalization field.
Formatting rules that matter
- No merged cells — your CSV must be flat, row-by-row data
- No special characters in headers — avoid spaces, slashes, parentheses; use CamelCase or underscores
- Consistent data types per column — if OfferCode is a string, don't mix in blank cells or numeric formats
- UTF-8 encoding — especially important if any names include accent characters (José, Nguyễn, etc.)
- Save as .CSV, not .XLSX — even if you built the file in Excel or Google Sheets, export as CSV before uploading
Step 2: Build Your Postcard Template with Variable Placeholders
Once your CSV is clean, open your postcard design and mark where each variable field should appear. On WriteToMail, this uses a placeholder syntax that matches your CSV column headers.
How placeholders work
A placeholder is a tag inserted into the postcard design that gets replaced with the corresponding value for each row. Common format:
{{FirstName}}
{{EstimatedHomeValue}}
{{OfferCode}}
So the front of a real estate postcard might read:
Hi {{FirstName}}, Based on recent sales in your neighborhood, your home at {{Address1}} could be worth {{EstimatedHomeValue}}. Scan the QR code for a free, no-obligation valuation.
And when the cards are generated, Sarah Nguyen sees her name and address. James Okafor sees his. Every card feels personal because it is.
Small business loyalty example
A coffee shop running a loyalty reactivation campaign might design the back of their postcard like this:
{{FirstName}}, we miss you. As one of our {{LoyaltyTier}} members, here's a thank-you just for you: {{DiscountAmount}} off your next visit — use code {{OfferCode}} at checkout. Valid through November 30, 2026.
That one template serves customers who get 10% off and customers who get 20% off, based on their tier — no design work needed for each segment.
Expected outcome: A postcard template with named placeholders that match your CSV column headers exactly, including capitalization and spacing.
Step 3: Upload Your CSV and Map the Fields
Upload your CSV file to WriteToMail's bulk mailing tool. The platform will detect your column headers and present them for mapping.
Field mapping — what you're doing and why
Field mapping connects your CSV columns to the postcard template placeholders. The platform shows you each column name from your file and asks where it should go. Some fields are structural (they tell USPS where to deliver the card), and some are variable (they appear as personalized content inside the design).
Structural fields to map:
- Recipient name → used for the address block on the card
- Address1, Address2 → delivery address line
- City, State, ZipCode → completes the USPS address block
Variable content fields to map:
- CustomMessage → body text placeholder
- OfferCode → call-to-action placeholder
- EstimatedHomeValue → personalized data point
The mapping interface typically shows a preview row — usually the first record in your CSV — so you can confirm that "Sarah" is appearing where "{{FirstName}}" should be, and "$487,000" is landing in the right spot.
Expected outcome: Every CSV column is mapped to either a delivery field or a content placeholder. No required fields are left unmapped.
Step 4: Validate Addresses Before Sending
Address validation is the step most first-timers skip — and it's responsible for a significant share of wasted postcard spend.
According to the USPS, roughly 1 in 5 Americans moves each year. Without address standardization and validation, postcards sent to outdated addresses either return or get discarded. WriteToMail's platform processes addresses through USPS standards before printing, which catches obvious errors — wrong state abbreviations, missing ZIPs, and malformatted street addresses.
Before uploading, run a quick self-check:
- Are all state fields two-letter abbreviations (TX not Texas)?
- Are ZIPs five digits? (Excel sometimes strips leading zeros from ZIPs like 07030 → 7030)
- Are apartment/unit numbers in Address2, not crammed into Address1?
- Does every row have a city, state, and ZIP — or only two of the three?
The platform will flag rows with undeliverable addresses. Download the error report, fix the flagged rows, and re-upload. Don't skip this — flagged rows get pulled from the send automatically if not corrected.
Expected outcome: Your full list is validated, bad addresses are removed or fixed, and every remaining recipient has a USPS-deliverable address.
Step 5: Preview Personalized Proofs Before Sending
Never approve a bulk campaign without previewing multiple individual proofs. One formatting error can cascade across thousands of cards.
WriteToMail's preview workflow lets you cycle through individual card previews — typically by selecting specific rows from your CSV — so you can check:
- Does the name render correctly? (Watch for "Dear ," if FirstName is blank)
- Does the variable data appear in the right location on the design?
- Are offer codes displaying as expected (LOYAL20, not loyal20 or "Loyal20")?
- Is the address block formatted correctly on the back?
- Do any lines overflow their text boxes due to unusually long names or addresses?
Test these specific scenarios:
- The shortest first name in your list (e.g., "Li") — does it still look right?
- The longest address in your list — does it wrap or overflow?
- Any row with a blank optional field — does the card handle it gracefully?
- A row with special characters in the name — does it render or break?
For campaigns over 500 pieces, check at least 10–15 individual proofs across different segments of your list.
Expected outcome: You've confirmed the design renders correctly across diverse recipient data, caught any formatting issues, and approved the final proof.
Step 6: Submit the Campaign and Track Delivery
Once proofs are approved, submit the campaign. WriteToMail handles printing, postage, and USPS First-Class Mail delivery — no trips to the post office, no managing stamp inventory, no printer jams.
For reference, direct mail consistently outperforms digital channels in response rate. According to the Data & Marketing Association, direct mail achieves an average response rate of 9% for house lists — significantly higher than email's typical 1–2% response rate. Personalization pushes those numbers even further.
After sending, track campaign performance using unique offer codes or QR codes that you built into the variable data fields. If you used a unique OfferCode per recipient segment, you can measure redemption rates directly.
If you want a broader look at how to structure campaigns across industries, the direct mail marketing guide for small businesses covers targeting strategy, format decisions, and ROI benchmarks worth reading alongside this workflow.
Expected outcome: Campaign is submitted, printing and postage are handled automatically, and you have a tracking mechanism in place to measure response.
Common Mistakes and How to Fix Them
Mistake 1: Placeholder names don't match CSV headers
What happens: The card prints the literal text {{FirstName}} instead of "Sarah."
Fix: CSV headers are case-sensitive in most systems. If your CSV says firstname and your template uses {{FirstName}}, they won't match. Standardize capitalization across both.
Mistake 2: Blank variable fields break the design
What happens: A card prints "Hi , welcome back!" because the FirstName column was empty for that row.
Fix: Before uploading, run a filter in Excel or Google Sheets to find blank cells in critical columns. Fill them with a fallback value ("Valued Customer" for blank first names, "Friend" for loyalty tier, etc.) — or remove those rows from the send entirely.
Mistake 3: Excel formats ZIP codes as numbers
What happens: ZIP codes starting with 0 (New Jersey, Massachusetts, Connecticut, etc.) get stripped — 07030 becomes 7030, making the address undeliverable.
Fix: Format the ZipCode column as "Text" in Excel before entering or pasting data. Or, in Google Sheets, prefix with an apostrophe to force text format. After export, verify a few rows manually.
Mistake 4: Column headers contain spaces or special characters
What happens: "First Name" (with a space) doesn't map correctly, or the upload throws a parsing error.
Fix: Rename headers to use CamelCase (FirstName) or underscores (first_name). No spaces, no parentheses, no slashes.
Mistake 5: Sending without testing edge cases
What happens: A card for "Dr. María José Rodríguez-Vásquez" overflows the name field, breaking the address block layout.
Fix: Before finalizing the template, find your longest and most complex name/address in the list. Preview that specific row. Adjust text box sizes or font size if needed.
Mistake 6: Inconsistent state abbreviations
What happens: Some rows say "California," others say "CA," others say "Calif." — the address validator rejects the non-standard formats.
Fix: Use a find-and-replace in your spreadsheet to standardize all state fields to two-letter USPS abbreviations before upload.
Real Estate Use Case: Estimated Home Value Cards
A real estate agent farming a 400-home neighborhood builds a CSV with columns: FirstName, LastName, Address1, City, State, ZipCode, EstimatedValue, LastSaleYear, OfferCode.
The postcard front reads:
{{FirstName}}, your home may be worth more than you think. Homes in your area have sold for an average of {{EstimatedValue}} in 2026. Your property last changed hands in {{LastSaleYear}} — and the market has moved significantly since then.
Each card is unique. The homeowner at 402 Oak Lane sees their name and their estimated value. The agent isn't guessing — they pulled the data from county records and plugged it into the CSV.
For a full breakdown of how real estate agents use this workflow to generate listing appointments, the bulk postcard mailing guide for real estate agents covers neighborhood farming strategy, design templates, and cost-per-lead benchmarks specific to real estate.
Small Business Use Case: Loyalty Discount Postcards
A home goods retailer has 850 customers in their POS system. They export a CSV with: FirstName, LoyaltyTier, DiscountAmount, OfferCode, LastPurchaseDate, plus address fields.
Gold-tier customers get a 20% discount code. Silver-tier gets 15%. New customers (one purchase) get 10%. One postcard template handles all three — because the discount amount and offer code are variable fields, not hardcoded text.
The back of the card reads:
{{FirstName}}, here's a thank-you for being a {{LoyaltyTier}} member. Enjoy {{DiscountAmount}} off your next in-store or online purchase. Use code: {{OfferCode}} — valid through December 15, 2026.
The retailer doesn't design three different postcards. They design one, upload the segmented CSV, and the platform generates 850 personalized cards in a single batch. That's what makes bulk postcard mailing from CSV a practical tool — not just for large enterprises, but for any business with a customer list.
Next Steps and Related Resources
The workflow above covers the full arc — from raw spreadsheet to personalized campaign in the mail. Here's where to go from here:
- If you're new to direct mail postcards entirely, start with the online postcard mailing service guide for design fundamentals and format decisions.
- If you're managing a customer list from a CRM, the bulk direct mail from spreadsheet guide shows how to export and format data from any system.
- If you want campaign ideas before you build your list, the postcard marketing campaign service guide covers strategy, copy, and response rate benchmarks by industry.
- Ready to run your first campaign? Create a free account at WriteToMail and upload your CSV — the platform walks you through field mapping, previewing, and launching without any prior direct mail experience.
Personalization at scale used to require a print shop, a mail house, and a production timeline measured in weeks. That's no longer the situation. With a clean CSV and a well-built template, a campaign that feels individually tailored to every recipient goes out the same day you build it.
Sources
- USPS — Address Quality — cited for statistic on American mover rates and address standardization practices
- Data & Marketing Association (DMA) — cited for direct mail response rate benchmarks (9% house list average) compared to email
- USPS Domestic Mail Manual — Address Formatting — referenced for two-letter state abbreviation requirements and USPS address block standards
- WriteToMail — Bulk Postcard Mailing from CSV Guide — internal reference for platform-specific variable data workflow
- WriteToMail — Direct Mail Marketing for Small Businesses Guide — cited for campaign strategy context and ROI benchmarks for small business direct mail