Zeffy Member Data Migration Guide
How to Migrate Nonprofit Membership Records into Zeffy CRM Using Claude AI & Cowork Mode
1. Project Overview
This guide documents a real-world project to migrate 2,094 membership records from a legacy Excel spreadsheet into Zeffy, a free nonprofit CRM and payment platform. The entire project was completed using Claude AI through Anthropic's Cowork mode, which provides a desktop environment where Claude can read, write, and manipulate files directly on your computer.
The project involved cleaning messy data, resolving quality issues with the organization's input, generating properly formatted CSV import files, and building a comprehensive workbook with documentation tabs for audit trail and future reference.
What Was Accomplished
| Metric | Result |
|---|---|
| Starting Records | 2,094 rows across 3 tabs, 26 columns |
| Final Master List | 2,076 rows (18 minors separated, 4 non-person rows cleared) |
| Payment Import Files | 4 CSVs (1,358 total payments across Classes A, B, CA, CS) |
| Contact Import Files | 4 CSVs (1,358 contacts with Lists and newsletter preferences) |
| Data Issues Resolved | 13 categories of issues identified and fixed |
| Workbook Versions | 9 versions (v1 through v9), all archived |
| Workbook Tabs | 15 tabs including Import Plan, Change Log, Data Quality Audit |
2. What You Need Before Starting
Your Source Data
You need your membership data in an Excel file (.xlsx). Common fields include: member names, email addresses, mailing addresses, join dates, payment status, member class/type, and newsletter preferences. The data does not need to be clean — that's what this process handles.
A Zeffy Account
Create a free account at zeffy.com if you don't already have one. Zeffy is a nonprofit-focused platform that offers free CRM, payment processing, and email tools. You'll need access to the admin dashboard for the import steps.
Claude Desktop App with Cowork Mode
Claude Cowork is a feature of the Claude desktop application that gives Claude the ability to work directly with files on your computer. It runs in a secure sandbox and can read, write, and edit files in a folder you choose.
- Download the Claude desktop app from claude.ai
- Open a Cowork session and select the folder containing your data
- Claude will be able to read your Excel file and create all output files in that folder
Understanding of Your Data
Before starting, know the answers to these questions, as Claude will ask:
- What do your member class codes mean? (e.g., A, B, CA, CS)
- What does the Newsletter field indicate? (Yes/No for opt-in?)
- Are there shared email addresses between spouses or family members?
- What is the standard membership dues amount?
- Are there any minors in the data who need separate handling?
3. Setting Up Claude Cowork & The Prompts That Matter
This is the most important section of the guide. Claude is powerful but it works best when you give it clear, specific instructions upfront. In our project, many of the most useful features — the Data Quality Audit tab, version-controlled workbook tabs, the old folder structure — only happened because we explicitly asked for them. Claude won't assume you want these things.
The Opening Prompt
Your first message to Claude sets the tone for the entire project. Here is a consolidated prompt based on what actually worked in our project. You can copy and adapt this:
Why this matters: Without these explicit instructions, Claude will clean your data and generate CSVs, but it won't create documentation tabs, won't set up version control, and won't mirror CSV data inside the workbook. These are things we had to ask for during our project, and we're giving you the consolidated version here so you get them from the start.
Prompts We Used Throughout the Project
Beyond the opening prompt, here are the specific prompts that drove key outcomes. Each one addresses something Claude would not have done on its own.
Getting the Data Quality Audit
Claude will fix obvious issues like email typos, but it won't create a formal tracking system unless you ask:
This prompt triggered Claude to do a deep investigation of every issue, present findings with record counts, and ask targeted questions so we could make informed decisions together.
Getting Workbook Tabs for CSVs
By default, Claude generates CSV files but doesn't add them as tabs in the workbook. We had to ask:
This gave us tabs like "Zeffy Pay Class A," "Contact A," etc. inside the workbook, which made review much easier than opening individual CSV files.
Getting the Old Folder Structure
Claude will version files if you ask, but won't organize old versions unless told:
After this, Claude automatically moved superseded files to old/ every time it saved a new version.
Getting the Import Plan
Discovering Zeffy Features via Screenshots
Some of the most important changes came from exploring Zeffy's interface and sharing screenshots. Claude immediately understood the screenshots, researched how the features worked, and updated all the import files accordingly. This back-and-forth between you exploring the tool and Claude adapting the data is a natural part of the workflow.
4. What Claude Won't Do Unless You Ask
Claude is highly capable but conservative by default. It focuses on what you explicitly request and avoids making assumptions about project management preferences. Here is a checklist of things you need to explicitly ask for:
| Feature | You Must Ask For It |
|---|---|
| Data Quality Audit tab | Claude finds issues but won't create a formal tracking tab unless asked. Tell it to create a tab with columns for issue, severity, count, status, and resolution. |
| Change Log tab | Claude makes changes but won't document them in a log tab. Ask for a Change Log with version, date, change, and detail columns. |
| Import Plan tab | Claude knows the import steps but won't write them into the workbook. Ask for a step-by-step plan tab. |
| Workbook tabs for CSVs | Claude generates CSVs as files but doesn't automatically mirror them as workbook tabs. Explicitly request matching tabs. |
| Version numbering | Claude will overwrite files unless you tell it to use version numbers (v1, v2, etc.) on every file. |
| Old folder | Claude won't create a folder structure for old versions. Tell it to move old files to an "old" subfolder after each version bump. |
| Never touch the original | Claude may edit the source file unless you explicitly say "never modify the original." State this in your first message. |
| Ask before deciding | Claude may auto-fix ambiguous issues. Tell it to present options and let you decide on anything that requires judgment. |
Key takeaway: The more specific your opening prompt, the less back-and-forth you'll need later. Think of it as front-loading your project requirements.
5. Phase 1: Data Assessment & Cleanup
This is the most time-intensive phase. Claude reads your Excel file, analyzes every column, and identifies issues that would cause problems during Zeffy import.
Initial Analysis
Ask Claude to examine the original file and report what it finds. Claude will read every sheet, count rows, check for blanks, and identify patterns. In our project, Claude found:
- 187 email fields corrupted with "mailto:" prefixes (an Excel artifact)
- Multiple email typos (missing @ signs, .com misspelled as ,com, gamil.com instead of gmail.com)
- Names with extra whitespace, commas in last names (Jr., Sr. suffixes)
- Mixed case in STATE fields (pa, Pa, PA)
- 55 records with empty payment dates
- 18 minors (under 18) who needed separate handling
- Shared email addresses between spouses
- Phone number fields containing dates of birth
Data Quality Audit Tab
Once Claude creates the Data Quality Audit tab (remember, you must ask for this), it tracks every issue found, its severity, how many records are affected, and the resolution. Each item starts as OPEN and gets marked RESOLVED as you work through them together. This is your checklist — you're not done until everything shows RESOLVED.
Working Through Issues Together
For each issue, Claude presents what it found and recommends a fix. You make the call. This collaborative approach is essential — Claude has the technical skills but you have the institutional knowledge. Examples from our project:
Truncated names: Two members had very short first names ("Mi" and "Ro"). Claude asked if these were typos or real names. We decided to leave them as-is since we couldn't confirm.
Wrong class code: One member had CLASS="ACT" instead of a valid class. Claude showed the member's position in the spreadsheet (alphabetically between other CS members) and recommended CS. We agreed.
Duplicate persons: Three sets of apparent duplicates turned out to be father/son pairs with different member numbers and DOBs. We kept all of them.
Spouse deduplication: When two members share an email address (typically married couples), Zeffy would create only one contact. Claude's approach: keep the male spouse's record for the email, since Zeffy needs unique emails per contact. The spouse data is still in the Master List.
Automated Fixes
Some fixes are straightforward and Claude applies them automatically (with documentation in the Change Log):
- Clearing mailto: corruption from all email fields
- Correcting known email typos (pattern-matched)
- Normalizing STATE to uppercase
- Removing commas from last names (CSV safety)
- Trimming whitespace and normalizing double spaces in names
- Filling empty dates with the current date as a fallback
6. Phase 2: Building Import Files
Once the data is clean, Claude generates the CSV files Zeffy needs. There are two types of import: Payment Import (which also creates contacts) and Contact Import (which adds list assignments and newsletter preferences).
Payment Import CSVs
Zeffy's payment import creates both a payment record and a contact profile for each row. We created one CSV per member class to keep imports manageable and to use the class name as the formTitle (which becomes a form label in Zeffy).
| Field | What We Used |
|---|---|
| firstName / lastName | From FIRST and LAST columns, cleaned |
| amount | $40 (standard dues for all classes) |
| Cleaned email, deduplicated for shared addresses | |
| address / city / state / postalCode | From address fields, state normalized to uppercase |
| type / paymentMethod | "manual" for all (not processed through Zeffy) |
| formTitle | Class name (e.g., "Class A") — becomes form label in Zeffy |
| date | From Paid Date, fallback to JoinDate, fallback to today's date |
| note | Member #XXXXX | Joined: YYYY | N yrs continuous |
Contact Import CSVs
After payments are imported (which creates contacts), a second contact import updates those contacts with list assignments, subscription preferences, and additional data. We created one CSV per class. These CSVs cover ALL members in each class, not just the ones who opted out of newsletters.
| Field | What We Used |
|---|---|
| First Name / Last Name / Email | Same cleaned values as payment files |
| Address / City / Region / Postal Code | Full mailing address |
| Subscription Status | "unsubscribed" for No Newsletter members, blank for others |
| Lists | Semicolon-separated: e.g., "Class A;All Members" or "Class A;All Members;No Newsletter" |
| Note | Same member info note as payment files |
Lists Strategy
We designed six lists that get created automatically when the contact CSV is imported:
- Class A, Class B, Class CA, Class CS — one list per membership class
- All Members — every imported contact belongs to this list
- No Newsletter — members who opted out of newsletters (also marked as "unsubscribed")
Tags vs. Lists
During this project, Zeffy was transitioning from Tags to Lists. We initially used Tags for segmentation but discovered they were no longer mapping in the import interface. We removed the Tags column entirely and used Lists for all segmentation. If you're reading this in the future, Tags may be fully deprecated — use Lists.
7. Phase 3: Importing into Zeffy
The import follows a specific order. Payment imports must come first because they create the contact records, then contact imports update those records with list assignments.
Step 1: Payment Import
- In Zeffy, go to Settings → Import Data → Payment Import.
- Upload each payment CSV one at a time (Class A first, then B, CA, CS).
- Map each column to the corresponding Zeffy field using the mapping interface.
- Review the preview and confirm the import.
- After all 4 files are imported, verify: 1,358 total payments and 1,358 contacts in the dashboard.
Step 2: Contact Import
- Go to Settings → Import Data → Contact Import.
- Upload each contact CSV one at a time.
- Map the Lists column and Subscription Status column in the mapping interface.
- Since these emails already exist from payment import, Zeffy will update the existing contacts.
Step 3: Verification
- Check that 6 lists were created: Class A, Class B, Class CA, Class CS, All Members, No Newsletter.
- Verify All Members list has 1,358 contacts.
- Verify No Newsletter list has approximately 232 contacts, all showing "unsubscribed" status.
- Spot-check 5-10 individual contacts to confirm names, emails, and addresses match.
8. Data Quality Issues We Found & Fixed
This section documents every data quality issue discovered during the project. If you're working with similar membership data, expect to encounter many of these same issues.
| Issue | Records | Severity | Resolution |
|---|---|---|---|
| mailto: corruption | 187 | High | Stripped mailto: prefix from all emails |
| Email typos | 5 patterns | High | Pattern-matched corrections |
| Name whitespace | ~50 | Medium | Trimmed and normalized double spaces |
| Last name commas | 64 | Medium | Removed commas (Jr, Sr suffixes kept) |
| Empty payment dates | 55 | Medium | Filled with current date |
| Mixed case STATE | All rows | Low | Normalized to uppercase |
| Minors in data | 18 | High | Separated to dedicated Minors tab |
| Shared spouse emails | ~47 pairs | High | Kept male spouse record for import |
| Non-person rows | 4 | Medium | Cleared (org entries, not individuals) |
| DOBs in phone field | 4 | Medium | Moved values to DOB column |
| Wrong class code | 1 | Medium | Corrected ACT to CS |
| Email domain typo | 1 | Medium | gamil.com corrected to gmail.com |
| Duplicate persons | 3 pairs | Low | Confirmed father/son — kept all |
9. Version Control Strategy
Every change to the workbook or CSV files was versioned. This is essential for accountability and for being able to roll back if something goes wrong. This entire system only exists because we explicitly asked Claude to implement it.
How It Works
- The original file is never modified. It stays in the project folder as the source of truth.
- Each time Claude makes changes, the workbook gets a new version number (v1, v2, ... v9).
- CSV files also get version numbers that increment independently.
- When a new version is created, the old version is moved to an "old" subfolder.
- The Change Log tab inside the workbook documents exactly what changed in each version.
Version History
| Ver | Changes |
|---|---|
| v1 | Initial working copy. Cleared mailto: corruption, applied safe fixes, created base CSVs. |
| v2 | Rebuilt Minors tab with all 26 columns (was missing 18 fields). |
| v3 | Added No Newsletter handling: tags, separate files, and dedicated workbook tabs. |
| v4 | Created Import Plan tab. Removed redundant contact-only CSVs. |
| v5 | Fixed last name commas (64 names) and empty dates (55 records). Regenerated all CSVs. |
| v6 | Resolved all remaining data quality items: email typo, class code, phone DOBs, non-person rows. |
| v7 | Added Subscription Status column for auto-unsubscribe on import. |
| v8 | Created full contact import CSVs with Lists column. Replaced NoNewsletter-only files. |
| v9 | Removed Tags column (OBE — replaced by Lists in Zeffy). Final version. |
10. Final File Inventory
Active Files
| File | Records | Purpose |
|---|---|---|
| 2026 Member Data (Original).xlsx | 2,094 | Original — NEVER MODIFIED |
| 2026 Member Data v9.xlsx | 2,076 | Working workbook (15 tabs) |
| Zeffy_Payment_Import_Class_A_v4.csv | 493 | Payment import — Class A |
| Zeffy_Payment_Import_Class_B_v4.csv | 109 | Payment import — Class B |
| Zeffy_Payment_Import_Class_CA_v4.csv | 283 | Payment import — Class CA |
| Zeffy_Payment_Import_Class_CS_v4.csv | 473 | Payment import — Class CS |
| Zeffy_Contact_Import_Class_A_v2.csv | 493 | Contact import with Lists |
| Zeffy_Contact_Import_Class_B_v2.csv | 109 | Contact import with Lists |
| Zeffy_Contact_Import_Class_CA_v2.csv | 281 | Contact import with Lists |
| Zeffy_Contact_Import_Class_CS_v2.csv | 475 | Contact import with Lists |
Workbook Tabs (v9)
| Tab | Description |
|---|---|
| Import Plan | Step-by-step import workflow with verification checklist |
| Change Log | Every change across all 9 versions with dates and details |
| Data Quality Audit | All 13 issues tracked from discovery to resolution |
| Master List | Full cleaned dataset (2,076 rows, 26 columns) |
| New Members / All Emails | Original supplementary tabs preserved from source |
| Zeffy Pay Class A/B/CA/CS | Mirror of payment CSV data for in-workbook review |
| Minors | 18 minor records with full 26 columns |
| Contact A/B/CA/CS | Mirror of contact CSV data with Lists column |
11. Lessons Learned & Tips
Working with Claude Cowork
- Front-load your requirements. The consolidated prompt in Section 3 represents everything we learned over 9 versions. Give Claude all your project management requirements upfront and you'll save significant back-and-forth.
- Claude is conservative by default. It won't create documentation tabs, set up folder structures, or implement version control unless you ask. See Section 4 for the full list.
- Review Claude's work at each step. Claude shows you what it's doing and asks for decisions on ambiguous items. Take the time to review — this is where your institutional knowledge matters.
- Use screenshots to share what you find in Zeffy. We discovered Subscription Status and Lists features by exploring Zeffy's import interface. Sharing screenshots with Claude let it immediately adapt the files.
- The conversation context has limits. For very long projects, Claude's context window may fill up and the session may need to continue in a new conversation. When this happens, Claude can read a summary of the prior conversation and continue.
- Check the Minors tab (or any separated data). When Claude creates subset tabs, verify they have all the columns from the original. Our Minors tab initially only had 8 columns instead of 26.
Data Cleaning Tips
- mailto: corruption is common. If your Excel has been used to send emails, email cells often get corrupted with mailto: prefixes. Always check for this.
- Commas in names break CSVs. Names like "Smith, Jr." will split incorrectly when imported as CSV. Remove commas but keep the suffix.
- Empty dates need a strategy. Decide upfront what to use as a fallback date. We used the current date, but you might prefer the member's join date or a specific default.
- Shared email addresses are a real problem. CRM systems use email as the unique identifier. If spouses share an email, you need a deduplication strategy before import.
- Don't delete rows — clear them. We learned the hard way that deleting rows in Excel programmatically can corrupt data. Clearing cell values is safer.
Zeffy-Specific Tips
- Payment import creates contacts. You don't need a separate contact import to get people into Zeffy. The payment import does both. Use the contact import only for adding Lists and newsletter preferences.
- Email is the primary key. Everything in Zeffy revolves around the email address. Duplicate emails will be merged. Make sure emails are unique and correct before importing.
- Tags are being replaced by Lists. As of early 2026, Zeffy's Tags feature is transitioning to Lists. Use Lists for segmentation.
- Lists use semicolons in the CSV. When assigning contacts to multiple lists, separate list names with semicolons (e.g., "Class A;All Members").
- Subscription Status controls newsletter opt-out. Setting it to "unsubscribed" opts the contact out of newsletters while still allowing transactional emails.
- Import one file at a time. Even if your files are small, importing one class at a time makes troubleshooting easier.
12. Appendix: Zeffy Import Field Reference
Payment Import Template
| Field | Required | Notes |
|---|---|---|
| firstName | Required | Contact first name |
| lastName | Required | Contact last name |
| amount | Required | Payment amount in dollars |
| address | Optional | Street address |
| city | Optional | City |
| postalCode | Optional | ZIP or postal code |
| country | Required | 2-letter country code (US) |
| type | Required | "manual" for imported data |
| formTitle | Required | Form name — use for class segmentation |
| rateTitle | Optional | Rate/tier name |
| Required | Primary contact identifier | |
| language | Optional | "en" for English |
| date | Required | Payment date (MM/DD/YYYY) |
| state/province | Optional | 2-letter state code |
| paymentMethod | Required | "manual" for imported data |
| receiptUrl | Optional | Leave empty |
| ticketUrl | Optional | Leave empty |
| receiptNumber | Optional | Leave empty |
| companyName | Optional | Organization name if applicable |
| note | Optional | Free text note |
| annotation | Optional | Internal annotation |
Contact Import Template
| Field | Required | Notes |
|---|---|---|
| First Name | Required | Contact first name |
| Last Name | Required | Contact last name |
| Required | Primary identifier — matches existing contacts | |
| Language | Optional | "en" for English |
| Address | Optional | Street address |
| City | Optional | City |
| Region | Optional | State/province |
| Postal Code | Optional | ZIP code |
| Country | Optional | 2-letter country code |
| Phone | Optional | Phone number |
| Note | Optional | Free text note |
| Company name | Optional | Organization name |
| Subscription Status | Optional | "unsubscribed" to opt out of newsletters |
| Lists | Optional | Semicolon-separated list names |
This document was created using Claude AI (Cowork mode) as part of the member data migration project.
Back to All Guides