FTDNA_Matches2 Table
The FTDNA_Matches2 table is the primary table for FTDNA Family Finder match data. Each row represents one match for one test kit — the pairing of your kit and one matched kit. It is populated when you gather your Family Finder match list, with a few columns filled in later by per-match passes (chromosome, ICW, and tree gathering).
Kit identifiers: Every row is keyed by two kit numbers. eKit1 is your kit (the kit being gathered), and eKit2 is the matched person’s kit. The pair (eKit1, eKit2) uniquely identifies a match row and is used everywhere the client joins match data to chromosome, ICW, and tree tables.
Column Reference
Identifiers & Names
| Column | Type | Description |
| Id | int (PK) | Auto-incrementing primary key |
| eKit1 | string | Your kit number (the kit being gathered). Indexed. |
| eKit2 | string | The matched person’s kit number. Indexed. |
| contactId | string | FTDNA contact identifier for the match. Stored empty during match gathering; populated later by tree gathering where available. |
| Name | string | Match’s full display name |
| MatchPersonName | string | Match person name as reported by FTDNA (alternate name field) |
| Prefix | string | Name prefix (e.g., “Mr”, “Dr”) |
| FirstName | string | Match’s first name |
| MiddleName | string | Match’s middle name |
| LastName | string | Match’s last name |
| Suffix | string | Name suffix (e.g., “Jr”) |
DNA Data
| Column | Type | Description |
| totalCM | string | Total shared centimorgans, the raw string exactly as FTDNA reports it (sharedDna). Kept as text to preserve FTDNA’s original formatting. |
| totalCMf | decimal | The parsed numeric version of totalCM. Produced with a numeric parse of the raw string so the value can be sorted and filtered (e.g., min/max cM thresholds). Stored alongside the string for this reason. |
| longestCentimorgans | string | Longest shared block in centimorgans, the raw string from FTDNA (longestBlock). |
| longestCentimorgansf | decimal | The parsed numeric version of longestCentimorgans, stored for numeric sorting and filtering. |
| isxMatch | string | “true”/“false” — whether this is an X-chromosome match |
| bucketType | string | FTDNA match bucket classification for the match |
Why two columns for one value? FTDNA returns cM figures as strings. The client preserves that raw text in totalCM / longestCentimorgans, and also runs a numeric parse into the totalCMf / longestCentimorgansf decimal columns so matches can be sorted and filtered by shared cM without re-parsing strings on every query.
Y-DNA & mtDNA
| Column | Type | Description |
| ydnaMarkers | string | Y-DNA marker count / test info for the match |
| mtDNAMarkers | string | mtDNA marker / test info for the match |
| yHaplo | string | Match’s Y-DNA haplogroup |
| mtHaplo | string | Match’s mtDNA haplogroup |
Relationship
| Column | Type | Description |
| Relationship | string | Known/assigned relationship. Empty by default at gather time. |
| strRelationshipRange | string | FTDNA’s predicted relationship range for the match (relationshipRange) |
| strSuggestedRelationship | string | Suggested relationship. Empty by default at gather time. |
| strRelationshipName | string | Relationship name. Empty by default at gather time. |
Trees & Links
| Column | Type | Description |
| HasFamilyTree | string | “true”/“false” — whether the match has a family tree |
| familyTreeUrl | string | URL to the match’s FTDNA shared family tree (falls back to the MyHeritage tree URL when no FTDNA shared tree is present) |
| wikiTreeUrl | string | URL to the match’s linked WikiTree profile, when present |
| mhTreeUrl | string | URL to the match’s MyHeritage tree, when present |
| familySearchUrl | string | FamilySearch tree URL. Placeholder for future use; not currently provided by FTDNA, stored empty. |
Metadata & Other
| Column | Type | Description |
| Note | string | Note on the match |
| AboutMe | string | Match’s “About Me” text from their FTDNA profile |
| userSurnames | string | Match’s ancestral surnames, joined into a single “ / ”-separated string |
| PaternalAncestorName | string | Match’s most-distant paternal ancestor name |
| MaternalAncestorName | string | Match’s most-distant maternal ancestor name |
| Female | string | “true”/“false” — whether the match is female |
| ThirdParty | string | “true”/“false” — third-party flag |
| ffBack | string | “true”/“false” — Family Finder “back” flag. Defaults to “false”. |
| nRownum | string | Row number / ordinal of the match within FTDNA’s result list |
| strRbdate | string | Match date as reported by FTDNA (matchDate) |
| Email | string | Match’s email address, when available |
Gather Tracking
| Column | Type | Description |
| created_date | string | Date the match row was created (set to the gather date, yyyy-MM-dd). Preserved from the existing row when a match is re-gathered. |
| icw_date | DateTime | Timestamp set when shared-match (ICW) gathering completes for this match. Used to decide which matches still need ICW gathering. Preserved across re-gathers. |
| icw_tree | DateTime | Tree-gather tracking timestamp. Reserved; not currently written by the gather code. |
| GF_Sync | string | Sync tracking flag, set to a date when the row is synced. |
How It’s Populated
When you run an FTDNA Family Finder gather, the client requests your match list page by page. For each match returned, it builds an FTDNA_Matches2 row:
- Identifiers —
eKit1 is set to your kit (the kit being gathered) and eKit2 to the match’s kit.
- cM parsing — the raw
totalCM and longestCentimorgans strings from FTDNA are kept as-is, and a numeric parse fills totalCMf and longestCentimorgansf. Matches above the configured maximum cM are skipped, and once the list drops below the configured minimum cM the gather stops (the list is returned largest-first).
- Boolean fields — flags such as
HasFamilyTree, ThirdParty, Female, isxMatch, and ffBack are stored as the strings “true” or “false”.
- created_date — set to the current date (
yyyy-MM-dd).
Per-match data added by later passes — chromosome segments (FTDNA_Chromo2), shared matches (FTDNA_ICW2), and tree data (FTDNA_Tree) — is stored in separate tables, joined back to this table on (eKit1, eKit2). The ICW pass also stamps icw_date on the match row.
Data Preservation Rules
Matches are written through an upsert keyed on (eKit1, eKit2). If a row for that kit pair already exists, the client deletes it and re-inserts the fresh row — but first copies forward selected fields from the old row so prior progress is not lost:
- created_date — carried over from the existing row, so the original creation date is retained on re-gather.
- icw_date — carried over from the existing row, so a match already processed for shared matches is not re-queued unnecessarily.
Related Tables
- FTDNA_ICW2 — In Common With (shared matches) between two of your matches.
- FTDNA_Chromo2 — per-match shared chromosome segments, joined on
(eKit1, eKit2).
- FTDNA_Tree — family tree individuals linked to matches.
- FTDNA_Kit — the test kits you have added and gather for.