Importing your association roster from CSV
The **Import Roster** flow is how your association's authoritative membership list gets into Verinode HQ. You upload a CSV of your members, and HQ uses it to power the **Member Directory**: members…
On this page
What this is
The Import Roster flow is how your association's authoritative membership list gets into Verinode HQ. You upload a CSV of your members, and HQ uses it to power the Member Directory: membership counts, dues status, which members are verified on the Verinode platform, and the queue of operators asking to be matched to your roster.
This is not a job-management, LMS, or accounting import. It only carries the fields needed to identify a membership and its dues standing. Nothing about a member's day-to-day business (their jobs, clients, materials, margin) ever comes through this flow or appears anywhere in HQ. Each franchisee owns and sees their own operating data; HQ only ever sees the aggregate and compliance layer.
Roster import is admin only. If you're signed in as an association user without the admin role, the import and reconcile actions return "Only association admins can manage the roster." and won't run.
Where to find it
Open Members in the HQ sidebar (hq.verinode.ai/members). The page is titled Member Directory, with the subtitle "Your association roster, dues status, and the queue of operators asking to be verified as members."
At the top of the page is a row of four stat tiles:
| Tile | Shows | Empty state | |---|---|---| | Members | Total roster count | "Import your roster to begin" | | Dues Current | Percentage of members with current dues, with "X of Y current" underneath | Shows ", " until there's a roster | | On Platform | Percentage of roster rows matched to a verified Verinode operator, with "X verified on Verinode" underneath | Shows ", " until there's a roster | | Pending Review | Count of self-declared membership claims waiting on you | "Queue is clear" when empty, "Awaiting your verification" when not |
Below the stats are three flat sections in order: Import Roster, Verification Queue, and Roster.
The CSV columns
Your file needs a header row using these exact column names, in any order:
| Column | Required | What it does | |---|---|---| | member_number | Recommended | The unique ID your association assigns each member. This is the key re-imports use to update the right row instead of creating a duplicate. | | company_name | Required | The member's business name. Any row missing this is skipped entirely and never reaches the roster. | | contact_email | Optional | Used to help match a member to a self-declared operator claim in the verification queue. | | city | Optional | Shown under the company name on the roster list. | | state | Optional | Shown alongside city on the roster list. | | dues_status | Optional | One of current, lapsed, or grace. Anything else (blank, a typo, a different word) is stored as unknown. | | renewal_date | Optional | An ISO date (YYYY-MM-DD). Shown on the roster as "Renews {date}." |
Note
The upload description on the page reads exactly: "Upload a CSV with columns: member_number, company_name, contact_email, city, state, dues_status, renewal_date. Re-importing updates existing members by member number."
How to import
- 1Prepare your CSV with a header row using the exact column names above. Export it from your association's own membership system (spreadsheet, database, or member-management tool) as plain CSV.
- 2On the Member Directory page, under Import Roster, select Choose CSV and pick the file. The button reads "Importing…" while the upload runs.
- 3Wait for the result message above the stat tiles. On success it reads "Imported N member(s).", and if the import changed anyone's standing, it adds "Dues sync: X activated, Y revoked."
- 4Review the Roster section below to confirm the rows landed the way you expect.
If your file has no data rows, or every row is missing company_name, you'll see: "No rows found. Expected a header row with company_name." and nothing is imported.
Re-imports: upsert by member number, not a full replace
Re-importing is designed for you to run your association's export on a recurring basis (weekly, monthly, at renewal time, whatever matches your own membership cycle) without wiping and rebuilding the roster each time.
- Rows with a
member_numberare matched against your existing roster by that number. If a row with that member number already exists, every field on it is overwritten with what's in the new CSV (company name, contact email, city, state, dues status, renewal date all update). If no row with that number exists yet, it's added as a new member. - Rows without a
member_numbercannot be matched to anything already on file, so they are always inserted as new rows. Re-importing the same no-member-number row twice creates two separate roster entries, not one updated one.
Heads up
If your export doesn't reliably include a member number for every row, re-imports will accumulate duplicates for those unmatched rows over time. Whenever your source system can supply one, include member_number on every row so re-imports update in place instead of piling up.
What happens right after import
The moment an import finishes, three things happen automatically, before you do anything else:
- The roster list updates immediately. New rows appear, and any existing member whose CSV data changed reflects the new values. No page reload is needed.
- Dues reconciliation runs automatically for members already matched to a Verinode operator. If a member's
dues_statusin the new CSV differs from what's on file, and that member is already verified on the platform, their membership standing is reconciled right away: a member who moved tocurrentgets activated, and a member who moved tolapsedgets revoked. This is the same reconciliation the Reconcile dues button runs on demand, import just triggers it for you so status changes take effect without a separate step. - The stat tiles recompute, Members, Dues Current, On Platform, and Pending Review all reflect the new roster counts right away.
What does not happen automatically: a fresh roster row is not automatically linked to an operator account, even if the row includes a contact_email that matches someone signed up on Verinode. That linking only happens when the operator self-declares membership and you approve the match in the Verification Queue (see below), approving activates their membership badge and network benchmarks, gated on their dues being current.
Note
The success message tells you exactly what the automatic reconciliation did: "Imported N member(s). Dues sync: X activated, Y revoked." If the import didn't change any already-matched member's dues standing, you'll just see "Imported N member(s)." with no dues-sync line.
Reconcile dues on demand
Outside of an import, use the Reconcile dues button next to Choose CSV any time you want to re-check standing without uploading a new file (for example, after you manually corrected a member's dues status). It shows "Reconciling…" while it runs, and reports "Dues reconciled: X activated, Y revoked." when done.
Common questions
A member I imported doesn't show as "On Platform." Why not? Importing only updates the roster record. A row shows as on platform once it's linked to a verified operator account, which happens through the Verification Queue, not the import itself.
I re-ran the same file and now some members are duplicated. Check whether those rows had a member_number. Rows without one always insert as new, so a repeated file without member numbers will duplicate those members on every re-import.
A member's dues status in the CSV says active instead of current and it's not sticking. Only current, lapsed, and grace are recognized values. Anything else, including near-matches, is stored as unknown and won't be picked up by dues reconciliation as current or lapsed.
Can members see each other's dues status or business data through this? No. The roster and dues status are visible to your association admins in HQ only. Franchisee/member operating data is never surfaced here, and no member can see another member's roster row.