A services page is the easiest place in the world to describe hand-work in the grammar of a shipped feature. “Roster provisioning is supported” is true about the outcome and false about the mechanism, and the difference matters to anyone planning a term around it. So each card below names the mechanism — who performs it, by what means — alongside the outcome, and cites the constraint in the real database the work rides on.
We write the question set with you
Done by a person, on request
Most of the value in asking a school community anything is in the wording. We sit with the people who will read the results, work out what decision the answers are supposed to inform, and write the set against the three answer shapes the database actually admits: open text, a 1-to-5 scale, and single choice. A question that cannot be stored as one of those three is rewritten before it is published, not after the responses are in.
How it is actually performed: A person on our team drafts it, you edit it, we publish it into your organization. There is no question-writing wizard and no template gallery.
Evidenceck_qt_question_type CHECK (type IN ('text','scale','choice')); ck_qt_question_choice_has_options; SCALE_RANGE = {min:1,max:5} in packages/shared/src/question-technology-bank.ts.
We stand up your organization
Done by a person, on request
Your school or district exists on the engine as one organization row, and every question set and every stored response carries that organization's id. Setting that up is not a signup form you fill in: we create the organization, attach it to the right billing and support arrangement, and tell you the identifiers you will see in an export.
How it is actually performed: A person creates the organization row and tells you its identifier. There is no self-serve organization creation screen.
Evidenceqt_submission.owner_org_id NOT NULL with a foreign key to partner_org(id) ON DELETE RESTRICT -- an organization row cannot be deleted out from under its responses.
We provision the staff accounts
Done by a person, on request
The people who will build and run question sets need accounts with staff capability inside your organization. We create them on request, one at a time, from a list you send us. This is genuinely manual work and we would rather describe it as manual work than call it onboarding automation.
How it is actually performed: A person provisions each staff account by hand. There is no shipped single-sign-on or roster-sync connector, so nothing imports your staff list on its own.
EvidenceThe magic-link exchange path (apps/api/src/routes/auth.ts, POST /auth/magic-link/verify) creates no account at all -- it looks the address up and refuses it 404 no_account when nothing is on file. Of the two magic-link routes, only verify-token provisions, and only when the address is already on file as a student contact in the link's school; it then grants role 'parent' (or 'alumni' for an alumni link) scoped to that one school. Federated sign-in provisions too -- SSO, SAML and an LTI launch each land a least-privileged 'student' account with no school scope at all. What none of those paths grants is staff, admin, billing or roster capability over an organization that already exists. Staff capability is set by us.
We migrate the survey you already run
Done by a person, on request
Most schools that come to us already ask their community something once a year, usually in a spreadsheet or a form built by whoever had time. We take that instrument and rewrite it into published question sets, keeping the questions whose wording still works and flagging the ones that cannot be stored honestly in three answer shapes.
How it is actually performed: A person reads your existing instrument and rewrites it. There is no importer, and no file you upload is parsed by software on our side.
Evidenceqt_question_set.status CHECK (status IN ('draft','published','archived')) -- a migrated set moves through those three states, and nothing else.
We address the set to the audiences you care about
Done by a person, on request
A question set can be pointed at the specific groups you want to hear from. The engine carries a fixed list of twelve declared audiences, and a respondent self-declares which of them apply to them. Choosing which audiences a set is for, and what to do when one of them is a group of six people, is part of the engagement rather than a setting you toggle alone.
How it is actually performed: A person helps you choose the audiences and warns you where a small group would be legible in the results. The declared audience is a claim about a role, never a verified identity.
EvidenceQUESTION_REALMS enumerates twelve: parent, teacher, adviser, administrator, superintendent, studio, rep, department-chair, it-director, booster-pta, board-member, district-admin (packages/shared/src/question-technology-bank.ts).
We run the export and the deletion
Done by a person, on request
When you want everything your organization holds, or want it gone, that is a request to a person, and a person does it. We would rather tell you a human runs it than put a button on a page that does not have one behind it.
How it is actually performed: A person on the team runs the export or the deletion against your organization and confirms it back to you in writing. There is no self-serve export button and no self-serve deletion button.
Evidenceqt_submission and its sibling tables carry ROW LEVEL SECURITY ENABLEd and FORCEd, under the per-owner policy qt_submission_owner_iso (migration 1140_qt_owner_anchor_rls), whose first arm is is_system() -- so an export or deletion run by our own tooling runs under the system scope, and any other caller is confined to the owner it resolves to.
If what you need is not on this list, say so in an email. The honest answer is sometimes that we would have to build it, and that answer is worth more to you than a sixth card invented to look complete.