What an import writes
The wizard offers 64 fields across six record types. The saves behind it write 41 of them. This page is the difference, field by field, plus what gets invented when your file leaves a field blank, and what a revert can put back afterward.
How to read the tables
| Column | Meaning |
|---|---|
| Offered | The field appears on the matching screen, in the downloadable template, and in the preview |
| Written | The save reads the matched value and puts it on the new record |
| Discarded | The field is offered, matched and previewed, and the save never reads it |
A discarded field is not treated as an error and produces no warning. It still appears in the preview with your own data in it.
Members: 18 offered, 12 written, 6 discarded
| Field | Required | Written? | Note |
|---|---|---|---|
| First Name | Yes | Yes | Missing or blank fails the row |
| Last Name | Yes | Yes | |
| Date Of Birth | Yes | Yes | Read as month, day, year, in that order, the way the template shows it |
| Gender | No | Yes | A value PTRS does not recognise falls back to "prefer not to say," without a warning |
| Grade | No | Yes | |
| School | No | Yes | |
| Address | No | Yes | |
| City | No | Yes | |
| State | No | Yes | |
| Zip Code | No | Yes | |
| Allergies | No | Yes | Kept as a single entry rather than split apart, so the whole cell, commas included, becomes one allergy |
| Medical Notes | No | Yes | Kept the same way |
| Guardian First Name | No | No | |
| Guardian Last Name | No | No | |
| Guardian Phone | No | No | |
| Guardian Email | No | No | |
| Emergency Contact Name | No | No | |
| Emergency Contact Phone | No | No |
The six discarded fields are the whole guardian and emergency-contact block. No guardian record is ever created by an import, and an imported child has no emergency contact at all. The record-type picker describes this import as bringing in child profiles, guardian contacts and emergency information.
What gets invented when the file is silent: the enrolment date is set to today. The site is never set at all: the save takes a site as a parameter and does not actually use it.
Staff: 12 offered, 6 written, 6 discarded
| Field | Required | Written? | Note |
|---|---|---|---|
| First Name | Yes | Yes | |
| Last Name | Yes | Yes | |
| Yes | Yes | Also what a duplicate is matched on | |
| Phone | No | Yes | |
| Role | No | Yes | Anything PTRS does not recognise becomes a plain staff role |
| Hire Date | No | Yes | Defaults to today |
| CPR Cert Date | No | No | |
| CPR Exp Date | No | No | |
| First Aid Cert Date | No | No | |
| First Aid Exp Date | No | No | |
| Background Check Date | No | No | |
| Background Check Status | No | No |
The six discarded fields are every certification and the background check. No credential record and no background-check record is ever created by an import. The record-type picker describes this import as bringing in staff members, certifications and background checks.
What gets invented when the file is silent: a placeholder sign-in reference, with a note in the underlying save saying it still needs to be matched up properly. No sign-in account and no PTRS account record is created, so an imported staff member cannot sign in. See How a person becomes a PTRS user.
Programs: 9 offered, 7 written, 2 discarded
| Field | Required | Written? | Note |
|---|---|---|---|
| Name | Yes | Yes | Also part of what a duplicate is matched on |
| Description | No | Yes | |
| Start Date | Yes | Yes | Also part of the duplicate match |
| End Date | Yes | Yes | |
| Capacity | No | Yes | Defaults to 30 |
| Age Min | No | Yes | Defaults to 5 |
| Age Max | No | Yes | Defaults to 18 |
| Schedule | No | No | The template's own example reads "Mon-Fri 3:00-6:00 PM" |
| Location | No | No | The site comes from the import job itself, not from this column |
What gets invented when the file is silent, and there is no column for any of it: every imported program is written as a workshop, running the school year, delivered in person, for a mixed age group, and starting in draft status. A migrated after-school programme arrives labelled a draft workshop regardless of what it actually is.
Attendance: 7 offered, 5 written, 2 discarded
| Field | Required | Written? | Note |
|---|---|---|---|
| Member First Name | Yes | Yes | Used to find the child. Not itself stored |
| Member Last Name | Yes | Yes | Same |
| Date | Yes | Yes | |
| Check In Time | No | Yes | A missing time becomes midnight, in universal time |
| Check Out Time | No | Yes | |
| Program Name | No | No | The record is never linked to a program |
| Status | No | No | The template offers present, absent or excused. Every row becomes a check-in regardless |
The child is matched by first and last name alone, without regard to case, taking whichever match comes first in the organisation. Two children sharing a name receive each other's attendance.
What gets invented when the file is silent: every row becomes a check-in, recorded as entered manually, with the recorder set to the first active staff account found at the site, in no particular order. If the site has no active staff at all, every row fails.
Meal counts: 7 offered, 6 written, 1 discarded
| Field | Required | Written? | Note |
|---|---|---|---|
| Date | Yes | Yes | |
| Meal Type | Yes | Yes | Breakfast, morning snack, lunch, afternoon snack, or supper |
| Total Served | Yes | Yes | |
| Free Count | No | Yes | Defaults to zero |
| Reduced Count | No | Yes | Defaults to zero |
| Paid Count | No | Yes | Defaults to total served minus free minus reduced, which can come out negative |
| Location | No | No | The site comes from the import job itself |
What gets invented when the file is silent: no menu items are recorded, and the recorder is set to the first active staff account at the site.
These are federal CACFP records. The import performs no eligibility check and no meal-pattern check of any kind. It writes the counts exactly as given.
Incidents: 11 offered, 5 written, 6 discarded
| Field | Required | Written? | Note |
|---|---|---|---|
| Date | Yes | Yes | |
| Time | No | Yes | An unreadable time silently becomes midnight |
| Category | Yes | Yes | An unrecognised value fails the row |
| Description | Yes | Yes | |
| Action Taken | No | Yes | |
| Member First Name | No | No | The incident is never linked to the child it happened to |
| Member Last Name | No | No | |
| Staff First Name | No | No | |
| Staff Last Name | No | No | |
| Parent Notified | No | No | |
| Follow Up Required | No | No |
What gets invented when the file is silent, and there is no column for it at all: every row is recorded at the lowest severity on the scale. The reporting staff member is set to the first active staff account found at the site, never the person actually named in your own file.
Duplicate detection, by record type
Only three of the six saves check for a duplicate at all.
| Record type | Matched on | Behaviour on a match |
|---|---|---|
| Member | First and last name, and date of birth, within the organisation | Skip, or merge |
| Staff | Email, within the organisation | Skip, or merge |
| Program | Name, start date, organisation and site | Skip, or merge |
| Attendance | Not applicable | None. Every row is created |
| Meal counts | Not applicable | None. Every row is created |
| Incidents | Not applicable | None. Every row is created |
The three that never check for a duplicate ignore the choice on the Duplicates screen entirely. The screen's own merge description says this correctly: attendance, meals and incidents are always created new, because they are treated as unique events. In practice, this means running the same attendance, meal or incident file twice duplicates every row.
For the three that do check, the choice that actually runs is the one fixed at the moment you uploaded the file, not the one chosen later on the Duplicates screen itself. See the module landing page.
What a merge overwrites, and what a revert restores
A revert deletes every record the import created, outright, not hidden, just gone. For merged records, it restores from a copy taken before the merge happened, and that copy covers fewer fields than the merge itself changed.
| Record type | Fields the merge overwrites | Fields the revert restores | Lost on revert |
|---|---|---|---|
| Member | Grade, school, address, city, state, postal code, gender, 7 fields | Grade, school, gender, 3 fields | Address, city, state, zip code |
| Staff | First name, last name, phone, role, 4 fields | The same 4 fields | None |
| Program | Description, capacity, minimum age, maximum age, end date, 5 fields | Capacity, 1 field | Description, minimum age, maximum age, end date |
The revert confirmation describes deleting every newly created record and restoring every merged one to its original state. For staff, that is accurate. For members and programs, it is not.
Limits and formats
| Limit | Value |
|---|---|
| Maximum file size | 50 megabytes |
| Maximum rows | 50,000 |
| Accepted formats | Two common spreadsheet formats |
| Offered by the file picker | Those same two, plus an older format PTRS does not actually accept |
| Preview rows | 20 |
The older format is offered by the picker and refused by the save behind it, with a message naming the two formats that do work.
Dates and times are read in a fixed, US-style order throughout, so a file using the day-first order common outside the US will silently produce wrong dates wherever the day is 12 or lower, and fail the row outright otherwise.
The job's own status values
An import job moves through nine distinct states as it runs. The screen's own copy of that list is missing two of the nine, and nothing ever actually checks for those two, so the gap has no visible effect.
A count of updated records is shown on both the summary screen and the revert confirmation, and nothing anywhere in PTRS ever assigns a value to it, so that particular figure always reads zero.
Checked against PTRS on 7 September 2026.