Skip to main content
Back to Blog
Bulk Letter Mailing via CSV Upload: The Complete Walkthrough
Direct Mail MarketingApril 22, 2026

Bulk Letter Mailing via CSV Upload: The Complete Walkthrough

W

WriteToMail Team

Sending 500 personalized letters by hand would take days. With bulk letter mailing via CSV upload, it takes about 20 minutes — and every letter arrives with the recipient's name, address, account balance, and custom text already filled in.

This guide walks you through the entire process: preparing your spreadsheet, mapping variable fields, previewing personalized letters, and launching a USPS First-Class Mail campaign through WriteToMail. Whether you're sending collections notices, tenant communications, or marketing outreach, the workflow is the same.

By the end, you'll have a ready-to-send bulk mail campaign with zero trips to the post office.


What You'll Need Before Starting

Before touching any spreadsheet, confirm you have these in place:

  • A WriteToMail account with a plan that supports bulk mailing
  • Your recipient list in spreadsheet form (Excel or Google Sheets works fine — you'll export to CSV)
  • Your letter content drafted and ready, with placeholders identified (e.g., {{FirstName}}, {{AmountDue}})
  • Clean address data — USPS requires specific formatting that we'll cover below

One thing worth understanding upfront: the quality of your CSV determines the quality of your campaign. A sloppy spreadsheet leads to undeliverable mail, wrong names on letters, and wasted spend. Spending 30 extra minutes cleaning your data saves significant headaches downstream.


Step 1: Build Your CSV Spreadsheet Correctly

Your CSV is the engine of the whole campaign. Every column becomes a variable field. Every row becomes one letter.

Required columns

At minimum, your CSV needs these columns for USPS delivery:

Column Name Example Value
FirstName Sarah
LastName Okonkwo
Address1 412 Maple Street
Address2 Apt 3B
City Columbus
State OH
ZipCode 43215

Optional variable columns (common use cases)

These aren't required for delivery, but they're what make your letters personalized:

Column Name Example Value
AmountDue $1,247.50
AccountNumber ACC-00849
DueDate May 1, 2026
CustomMessage Your account has been escalated.
PropertyAddress 88 Birchwood Ln, Unit 4

Formatting rules that actually matter

State abbreviations only. Write "OH," not "Ohio." USPS systems use two-letter state codes, and free-text state names cause address validation failures.

ZIP codes must be text, not numbers. Spreadsheet software strips leading zeros from ZIP codes like "07030" (Hoboken, NJ), turning them into "7030" — which is an invalid ZIP. Format the ZipCode column as text in Excel or Google Sheets before entering any data.

No merged cells. Merged cells break CSV exports. Every piece of data should live in a single, discrete cell.

One row = one letter. No blank rows between recipients. No header rows at the bottom. The first row should be column headers, and every subsequent row should be a recipient.

Currency formatting. If you're including an AmountDue field, format it consistently. "$1,247.50" reads better in a letter than "1247.5" — but pick one format and apply it to the entire column.

Once your spreadsheet looks right, export it: File → Download → CSV (.csv) in Google Sheets, or Save As → CSV in Excel.


Step 2: Draft Your Letter with Variable Placeholders

Your letter template is where the personalization happens. Instead of writing "Dear John," you write "Dear {{FirstName}}" — and the platform replaces that placeholder with the actual name from each CSV row.

How placeholders work

Placeholders follow double-curly-bracket syntax: {{ColumnName}}. The column name inside the brackets must exactly match the column header in your CSV — capitalization included.

If your CSV column is "AmountDue" and your letter says {{amountdue}}, the merge will fail. Match the case precisely.

Example: Collections notice

Here's a real example of a past-due collections letter with variable fields populated:


April 17, 2026

Sarah Okonkwo 412 Maple Street, Apt 3B Columbus, OH 43215

Dear Sarah,

Our records show that your account (ACC-00849) carries an outstanding balance of $1,247.50, which was due on March 15, 2026.

Please remit payment by May 1, 2026 to avoid further escalation. If you believe this notice was sent in error, contact our billing department immediately.


In the template, that letter looks like this:

Dear {{FirstName}},

Our records show that your account ({{AccountNumber}}) carries an outstanding balance of {{AmountDue}}, which was due on {{OriginalDueDate}}.

Please remit payment by {{DueDate}} to avoid further escalation.

Every {{placeholder}} pulls from a matching CSV column. One template. Thousands of personalized letters.

Example: Tenant communication

For property managers sending lease violation notices or past-due rent notices across multiple units, the same logic applies. A single template might reference {{TenantName}}, {{PropertyAddress}}, {{MonthlyRent}}, and {{ViolationDescription}} — pulling unique values for each tenant row in the CSV. The bulk rent demand notice workflow for property managers covers this specific use case in more detail.

Example: Marketing campaign

A promotional letter for a regional insurance agency might use {{FirstName}}, {{LocalAgentName}}, and {{OfferExpiry}} — making each letter feel hand-tailored even when 2,000 are sending at once.


Step 3: Upload Your CSV to WriteToMail

Log into your WriteToMail account and navigate to the bulk mailing section.

  1. Select New Bulk Mailing Campaign
  2. Choose your mail type — letter, postcard, or document
  3. Click Upload CSV and select your file
  4. The platform parses your CSV and displays the detected column headers

At this point, you'll see your columns listed: FirstName, LastName, Address1, and so on. If the platform flags any columns as unrecognized, it's usually a formatting issue in the CSV — extra spaces in a column header, or special characters that don't render cleanly.

Expected outcome: Your CSV uploads without errors, and all columns are visible in the column mapping interface.


Step 4: Map CSV Columns to Letter Fields

Column mapping is where you connect your data to the template. The platform displays two panels: your CSV columns on one side, and the letter's required fields on the other.

For address fields, the mapping is explicit:

  • Address1 → Street Address (Line 1)
  • Address2 → Street Address (Line 2)
  • City → City
  • State → State
  • ZipCode → ZIP Code

For custom variable fields like {{AmountDue}} or {{AccountNumber}}, the platform recognizes them automatically from your template placeholders — as long as your CSV column names match exactly.

If you're sending to a mix of residential and business addresses, you may have some rows where Address2 is blank. That's fine. The platform skips blank fields cleanly rather than printing an empty line on the envelope.

Expected outcome: Every letter field is mapped to a CSV column, and the mapping summary shows no unresolved placeholders.


Step 5: Preview Personalized Letters Before Sending

Never skip the preview step. This is your last line of defense before thousands of letters go out with an error.

WriteToMail generates a live preview using actual data from your CSV rows. Click through at least 10–15 individual previews, choosing rows from different parts of the spreadsheet — not just the first three.

What to check in each preview:

  • Name renders correctly — no "Dear ," or "Dear {{FirstName}}" appearing literally
  • Address is complete — all five address fields populated, no missing city or ZIP
  • Currency and numbers look right — "$1,247.50" not "1247.5" or "$0.00"
  • Custom text makes sense — the {{CustomMessage}} field doesn't create a grammatically broken sentence
  • No placeholder text showing — if you see double-curly brackets in the preview, a column name is mismatched

Catching one error at preview costs nothing. Catching it after sending costs you the full print-and-postage run.

Expected outcome: Sample letters across multiple rows all display correctly personalized content with no raw placeholder text visible.


Step 6: Set Mailing Options and Launch

With the template confirmed and preview cleared, configure the final mailing settings:

  • Paper and envelope type — standard letter or other available formats
  • Return address — your business address printed on the envelope
  • Send date — schedule immediately or set a future date
  • Mail class — WriteToMail sends via USPS First-Class Mail

Review the total piece count and confirm it matches your CSV row count (minus the header row). A CSV with 501 rows — one header plus 500 recipients — should show 500 pieces.

Approve the order. WriteToMail handles printing, folding, enveloping, stamping, and handoff to USPS. Your letters are in the mail stream, typically within 1 business day.

Expected outcome: Order confirmation with piece count, estimated delivery window, and campaign summary.


Common Mistakes to Avoid

Mismatched placeholder names. The single most common error. Your CSV says "Firstname" (lowercase n) and your template says {{FirstName}} (capital N). The merge breaks silently, and the placeholder prints literally in every letter.

ZIP codes formatted as numbers. Excel autocorrects "07030" to "7030" unless the column is pre-formatted as text. Fix this before entering any data, not after.

Inconsistent address data. Mixing "Street," "St.," and "St" in the same column causes USPS validation issues. Standardize abbreviations across all rows.

Blank rows in the middle of the CSV. A blank row tells the platform the data ended. Everything after that blank row may be skipped entirely.

Testing with only the first 3 rows. Edge cases hide further down the spreadsheet. A tenant in row 347 might have an unusually long property address that breaks the layout. Preview broadly.

Forgetting to include a return address. Without a return address, undeliverable pieces disappear. You never learn which addresses failed. Always include a return address so USPS can return failed pieces.


Troubleshooting: When Things Go Wrong

"CSV upload failed" — Usually a file encoding issue. Re-save your CSV with UTF-8 encoding. In Google Sheets, this is automatic. In Excel, choose "CSV UTF-8" from the Save As format list.

"Unresolved placeholder detected" — Open your CSV and confirm the column header matches the placeholder in your template exactly, character for character.

"Invalid address detected on row 47" — Pull up row 47 in your spreadsheet. Usually it's a missing ZIP, an invalid state abbreviation, or an address that runs over the character limit for Address1.

Piece count doesn't match — If your CSV shows 500 rows and the platform counts 493 pieces, you likely have blank rows embedded in your data. Scroll through the spreadsheet and delete any empty rows.

Letters rendering with wrong currency format — The platform displays what's in your CSV. If your AmountDue column shows "1247.5," that's what prints. Format the column as currency in your spreadsheet before exporting.

For a deeper look at how variable data merge works technically — including how column mapping handles edge cases — the variable data mail merge guide covers the mechanics in full.


Real-World Use Cases

Collections notices. Accounts receivable teams send 30-day, 60-day, and 90-day past-due notices with escalating urgency. Each letter references the specific invoice number, balance, and deadline for that debtor. Physical mail outperforms email for collections because it creates a documented paper trail and has significantly higher open rates — the Data & Marketing Association reports direct mail response rates averaging 4.4%, versus 0.12% for email.

Tenant communications. A property management company with 800 units can send rent increase notices, lease renewal reminders, or lease violation warnings to every tenant in one campaign. Each letter references that tenant's unit, current rent, and new rate. See how landlord-tenant notice mailing works legally and practically for state-specific considerations.

Law firm client notifications. Law firms managing large caseloads use bulk CSV mailing to send status updates, hearing date notices, or settlement communications to hundreds of clients simultaneously. The direct mail workflow for law firms explains how firms maintain compliance and documentation using physical mail at scale.

Marketing campaigns. A regional business running a new customer acquisition campaign can upload a prospect list of 2,000 names and send personalized offer letters — with each recipient's name, local agent, and expiration date filled in — for a fraction of the cost of a direct mail house.


Next Steps

You now have the full workflow: clean CSV, mapped variables, previewed letters, launched campaign.

If you're sending for the first time, start with a test batch of 10–20 rows before scaling to hundreds. Confirm the physical letters look exactly as expected. Then scale confidently.

For teams managing recurring campaigns — monthly past-due notices, quarterly tenant letters, seasonal marketing sends — the complete guide to sending bulk mail online covers how to build repeatable workflows that reduce campaign setup time to under 10 minutes.

Ready to send your first bulk campaign? Start at WriteToMail — no printer, no stamps, no post office required.


Sources

  1. Data & Marketing Association (DMA) — Direct Mail Response Rate Report — cited for direct mail response rate (4.4%) versus email (0.12%) in collections and marketing contexts
  2. USPS Addressing Standards Publication 28 — reference for USPS address formatting requirements, state abbreviation standards, and ZIP code formatting rules
  3. WriteToMail — Bulk Mailing via CSV — platform described throughout as the tool used to execute bulk letter mailing CSV upload campaigns
  4. WriteToMail — Variable Data Mail Merge Guide — technical reference for column mapping, placeholder syntax, and CSV formatting requirements
  5. WriteToMail — How to Send Bulk Mail Online — additional reference for bulk mailing workflow, USPS First-Class Mail delivery, and repeatable campaign setup
how-to

Ready to Try Direct Mail?

Create professional letters and we'll print and mail them for you. No stamps, no trips to the post office.