From rollie-jobs
Import job seekers into Rollie — a CRM for organizations that walk alongside people in their job search. Rollie users include veteran placement programs, high school counselors helping students find jobs or internships, colleges placing graduates, workforce development agencies, and any organization that acts as a trusted guide helping clients find the right position. Use this skill when the user wants to import, upload, load, bring in, or add a list of people — whether from a spreadsheet, CSV, CRM export (Salesforce, HubSpot, etc.), or any other file — into their Rollie org so they can begin tracking and supporting those individuals in their job search.
How this skill is triggered — by the user, by Claude, or both
Slash command
/rollie-jobs:import-seekersThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Rollie is a CRM for organizations that walk alongside job seekers — veteran placement programs, high school
Rollie is a CRM for organizations that walk alongside job seekers — veteran placement programs, high school counselors, colleges, workforce agencies, and others who act as a trusted guide helping clients navigate their job search and land the right role.
You are importing job seekers from an external data source into a Rollie org. Follow this workflow exactly — do not skip the orient phase and do not write any records until the user approves the mapping.
enum typenumber typeget_seeker_field_definitions(org_id) — see what custom fields already exist for this org.get_org_members(org_id) — get user IDs for all staff members so you can resolve owner names to IDs.get_seeker_statuses(org_id) — get all available statuses so you can pick the right one for imported records. Present the options to the user and ask which status to assign. Do not default to lead or any hardcoded value.get_seeker_groups(org_id) — get all groups. If groups exist, ask the user whether imported records should be assigned to one.get_work_regions(org_id) — get all defined work regions. If the source has a "Region to Work" or similar column, compare the values to the available region names and ask the user whether to map them to workRegionIds.Produce a mapping table for the user to approve before writing anything:
| Source Column | Maps To | Notes |
|---|---|---|
| First Name + Last Name | fullName, firstName, lastName | Always combined |
email | Standard field | |
| Phone | phone | Standard field |
| Address fields | address | Concatenate all available address parts into a single string and pass as address (e.g. "123 Main St, Carmel, IN 46033"). Include whatever you have — full address, city+state, or just a zip code. The server geocodes it and derives city, state, coordinates, and H3 region cells automatically. Do not geocode or compute H3 yourself. Do not pass address1, city, state, zip as separate fields. |
| LinkedIn URL | linkedInUrl | Standard field — never create a custom field for this |
| Education (free text) | education | Standard field — never create a custom field for this |
| Created Date | sourceCreatedAt | Preserves original creation date from source system |
| Region to Work / Preferred Region / Job Search Area | preferredLocationNotes + workRegionIds | Store the free-text value as-is in preferredLocationNotes. If the org has defined Work Regions (call get_work_regions), also resolve matching values to workRegionIds (array of region IDs). If no region column exists, preferredRegions is seeded automatically from the geocoded home address — do nothing. Never pass _region_names. Never pass preferredRegions directly. |
| Contact Owner / Assigned To | ownerIds | Resolve name → userId via get_org_members. Pass as array. If a name does not match any org member, stop and ask the user — do not skip, guess, or store the raw name in a custom field. The user may want to create a placeholder account, map to a different staff member, or leave ownership unassigned. |
| Status | statusId | Use get_seeker_statuses to get valid options — never hardcode. Ask the user which status to assign to imported records. |
| Group | groupId | Use get_seeker_groups to see available groups. Ask the user if records should be assigned to one. |
| Custom fields | sf_{orgId}_{slug} | Only for fields with no standard equivalent |
| New field not in schema | PAUSE — ask user | Do not create without approval |
Flag any column that:
upsert_seeker_field_definition)Present the full mapping table and wait. Do not proceed until the user says yes.
If the user asks to create new custom fields, call upsert_seeker_field_definition for each one now — before importing any records.
For each row:
externalIds: { "<source_name>": "<unique_id_from_source>" } — use email as the external ID if no better key exists. This enables safe re-imports.upsert_seeker(org_id, seeker_data).created or updated → continueprobable_duplicate → show the candidates to the user, ask whether to merge_id or confirmed_newAfter every 50 records, report a running count: created / updated / skipped.
email, phone, linkedInUrl, education, address, notes, careerGoal, preferredRegions, preferredLocationNotesaddress (a single string) to upsert_seeker — the MCP handles geocoding, H3 indexing, and preferredRegions seeding server-side.preferredRegions directly: Use workRegionIds for named region subscriptions; otherwise the MCP seeds it automatically from the geocoded address._region_names: That field no longer exists. Use preferredLocationNotes for free-text region display and workRegionIds for structured region subscriptions.address, not parts: Concatenate all available address components into one address string. Do not split into address1, city, state, zip — pass the full string and let the geocoder resolve it.get_org_members to turn a name string into a userId. If a name doesn't match any member, pause and ask the user — never create a custom field for it, never silently drop it. The user decides: create a placeholder account, remap to a different member, or import without an owner.upsert_seeker call per record. Never batch writes.externalIds matching means running the same file twice updates rather than duplicates.npx claudepluginhub south-bend-code-works/rollie --plugin rollie-jobsProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.