On this page
A useful summer camp registration form collects one guardian contact, the selected session, and only the camper details staff need to plan attendance. Keep one guardian record separate from one registration per child and session; this makes siblings easy to register without copying family contact details or collecting a broad medical history.
Download the sample CSV · Download the form field specification
Summer camp registration form template

AI-generated editorial concept; not a screenshot of a deployed app.
| Section | Fields | Why it belongs |
|---|---|---|
| Guardian | Name; email; preferred contact method | Send confirmation and schedule changes to the responsible adult. |
| Session | Session name or ID; start and end dates; location | Tie every registration to one published camp session. |
| Camper | First name or roster label; age band; optional accessibility or participation note | Give staff enough information for the roster. Do not request full date of birth unless the program has a documented need. |
| Consent | Guardian acknowledgment of participation terms; optional photo permission as a separate yes/no choice | Keep permissions clear and let families answer optional requests independently. |
| Fee | Fee shown for the selected session; payment status returned by the payment flow | Make the charge and registration status visible without storing card details in the form. |
Ask the guardian to select a session before showing its dates, location, capacity status, and fee. Require one camper entry for each child. If a family registers siblings, create separate registrations linked to the same guardian. Show a review screen with the selected session and total before submission.
A minimal sample CSV might look like this. The rows are synthetic and use roster labels rather than children’s names.
The guardian key links sibling registrations. In the actual app, show the family’s email only to the guardian and authorized staff; do not put it in a public roster. Ask about allergies or medical needs only in a separate, access-restricted process designed for that purpose. A general registration template should not collect diagnoses, medications, insurance details, or emergency medical records.
Model sessions and registrations separately
The following is a proposed data model for an app, not a built-in Atoms camp template:
| Table | Suggested fields | Ownership |
|---|---|---|
camp_sessions |
id, name, starts_at, ends_at, location, capacity, fee, status |
Staff manage; public page shows only active session details. |
guardians |
id, auth_user_id, name, email, contact_preference |
Guardian can read and edit their own contact record; staff can manage it. |
registrations |
id, guardian_id, session_id, camper_label, age_band, terms_version, photo_permission, status, created_at |
Guardian sees registrations linked to their account; staff see assigned sessions. |
payments |
id, registration_id, amount, currency, provider_reference, status |
Store a provider reference and status, never card number or security code. |
Keep capacity changes and payment status explicit. A submitted registration can be pending_payment, confirmed, waitlisted, cancelled, or refunded; define which transition reserves a seat and how a failed payment releases it. For siblings, each registration has its own session and status even when the guardian is shared. In Supabase, enable row-level security on every exposed table and set grants as well as row policies; the database checks both before a request can access a row. Supabase Row Level Security guide
If you build the app with Atoms, choose Atoms Cloud or connect one Supabase project. Atoms’ setup guide says an Atoms project can connect to one Supabase project at a time and cannot use Supabase and Atoms Cloud together; connecting a database alone does not add the form or persistence behavior. Build the feature, enter harmless test data, refresh the app, and confirm the same record appears in the intended table. Atoms’ Supabase guide
Keep payment optional and scoped
A camp can publish the form without online payment. Add a deposit or full-fee checkout only after the operator sets refund, cancellation, waitlist, and seat-reservation rules. For Stripe Checkout, confirm payment and fulfil the registration from verified webhook events; Stripe warns that a customer may pay without reaching the success page and says fulfilment must be safe to run more than once for the same Checkout Session. Stripe fulfilment guide
Keep payment secrets server-side and save only the registration ID, amount, currency, provider reference, and verified status. A redirect can show the family a receipt page, but the server-side event controls the payment transition.
Build and check the registration flow
Start with one session, two synthetic guardian accounts, and two registrations for the first guardian. Test this sequence: open the session page, submit one child, submit a sibling, refresh, edit a permitted field, and read both rows again. Sign in as the second guardian and verify that the first family’s registrations cannot be opened or edited. Then sign in as staff and confirm access is limited to the assigned session.
Also test a full session, a closed session, a duplicate submission, and a declined payment if payment is enabled. Confirm that the capacity count follows the chosen reservation rule and that the family sees a clear next step. A sibling checkout may cover several registrations. Link each paid line to its registration and confirm the reserved seats together; if one seat hold has expired, send that line to review or refund rather than silently overbooking.
You can also start from Atoms’ spreadsheet-to-web-app guide if session information already lives in a sheet.
Atoms build prompt
Copy the build brief and use it to create your version in Atoms.