Import deduplication
What it is
Section titled “What it is”Every imported booking is tagged with a short fingerprint that identifies its source row. When you import again — whether it is the same file, a newer export from the same system, or a mixture of old and new rows — Syndik8 skips any row whose fingerprint already exists on a booking in this syndicate.
This makes re-imports safe. You do not have to manually filter a CSV to “only the new bookings”.
Who can use it
Section titled “Who can use it”Deduplication runs automatically during every import. Admin and owner see the skipped-count on the review step; there is no user toggle.
Where to find it
Section titled “Where to find it”The behaviour is part of the import wizard:
- Route:
/syndicates/:syndicateId/settings/import-bookings. - The review step shows a line like
3 rows will be skippedwhen any are being skipped — expand the warnings list to see why each was skipped.
The fingerprint is also written into the booking’s notes field as a small tag, e.g. [Import: <batch-id> | <fingerprint>], so you can inspect it on an individual booking.
Fields / options
Section titled “Fields / options”What goes into a fingerprint
Section titled “What goes into a fingerprint”The fingerprint is computed from these row values, concatenated in order:
| Input | How it is normalised |
|---|---|
| Start time | ISO 8601 in UTC. |
| End time | ISO 8601 in UTC. |
| Member key | Email if the row has one (lowercased); otherwise display name (lowercased); otherwise empty. |
| Aircraft registration | Lowercased as-is from the CSV — not stripped to alphanumeric. |
The four values are joined with a | separator and hashed with FNV-1a (32-bit). The hash is written as lowercase hex (for example 1a3f7c90).
What the review step shows
Section titled “What the review step shows”| Line on the review step | Meaning |
|---|---|
N rows skipped | Total skipped across all reasons. |
N duplicates skipped | Skipped because the fingerprint already exists in this syndicate. |
N unmatched skipped | Skipped because the member could not be matched and no invite was issued. (Not a dedupe reason, but shown alongside.) |
N warnings | Rows with a problem worth flagging but not fatal. |
Behaviour rules
Section titled “Behaviour rules”- Deduplication is per syndicate. A booking imported into syndicate A does not block the same booking from being imported into syndicate B. Fingerprints are scoped.
- The fingerprint is deterministic across devices. Importing the same CSV on Chrome, iOS, or Android produces the same fingerprints for the same rows. (FNV-1a was chosen precisely because Dart’s built-in
String.hashCodevaries by platform.) - Times are compared in UTC. A Goboko row in
Europe/Londonat 10:00 BST and the same row after a timezone-preserving export fingerprint-match because both convert to 09:00 UTC before hashing. - Name-only matches still dedupe. A row without an email uses its lowercased display name as the member key. Two different people with the same name at the same aircraft at the same time would collide — a rare case that requires the admin to adjust the second import.
- Registration is compared as-written. Unlike asset matching (which strips punctuation), the fingerprint keeps hyphens.
G-BBBNandGBBBNwill not fingerprint-match even though they resolve to the same aircraft. In practice, both forms rarely appear in the same source system — but if your CSV has moved between formats, you may re-import apparent duplicates once. - Deduplication applies before member matching. A duplicate row is skipped regardless of whether its member would match, so re-importing a file after updating membership does not re-create previously imported bookings.
- Manually deleting a booking does not clear its fingerprint. The booking row is soft-deleted but the fingerprint tag remains; to re-import that exact row after a deletion, remove the matching booking from the database or alter the source CSV.
- Fingerprints are additive, not cryptographic. FNV-1a is not a security primitive; it is a short, stable, cross-platform hash. Collisions are rare but possible in very large imports — if two distinct rows ever collide, the second would be skipped silently. The rate of collision is negligible for realistic syndicate sizes.