Contacts
Overview
Contacts are your hotline's phone book. Each contact holds a person's name, their phone numbers, a Personal ID and PIN they can type to identify themselves on the phone, any extra fields you defined, and the labels that group them.
Contacts matter for three things: the system greets a known caller by name in dynamic text-to-speech, an access check can let in only the people you list, and a broadcast dials the contacts in a label. You can build the list by hand, or import it from Excel in one go.
The Contact Card
Open Contacts in the sidebar and press New contact.
Basic Information
- First Name (required) — up to 255 characters. This is the name spoken by
{first_name}in dynamic text-to-speech. - Last Name — up to 255 characters.
- Email Address — a valid email address, up to 255 characters.
- Personal ID — digits only, up to 10. Leave it blank and the system generates a random 5-digit ID (between
10000and99999) that is unique inside your account. The caller can type this ID at an access check to identify themselves. - Personal PIN — digits only, up to 8. Hidden as you type, with an eye button to reveal it. This is what an access check asks for when it verifies identity by PIN. A contact with no PIN set is turned away by a check that demands one, so fill PINs in before you switch a check to PIN verification.
Phone Numbers
Press Add Phone Number for each number this person calls from. Rows can be dragged into order and collapsed.
- Phone Number (required) — digits only, with the country code, 7 to 20 digits. No
+, spaces, dashes or parentheses. Example:15551234567. If you type anything else you get: "Phone number must be digits only — no +, spaces, dashes, or parentheses."
Store numbers the way caller ID delivers them, country code first. A US or Canadian number is 1 plus the ten digits; a UK number starts 44.
Custom fields
This section only appears once you have defined at least one contact field in Settings (see Contact Fields below). Each field you defined shows here as its own input, typed the way you set it up: a text box, a searchable dropdown, a number box or a date picker.
Additional Information
Collapsed by default.
- Notes — free text, for your own reference. Nothing is spoken to callers.
- Address — free text.
Organization
Collapsed by default.
- Labels — pick any number of labels for this contact. Searchable. This is the same list you manage under Labels.
The Contacts Table
The list page shows one row per contact. Use the column toggle in the toolbar to show or hide columns.
| Column | Notes |
|---|---|
| First Name | Searchable and sortable. Shows the email underneath. |
| Last Name | Searchable and sortable. |
| One column per custom field | Off by default. Searchable. |
| Copy to the clipboard with one click. | |
| Personal ID | Copy to the clipboard with one click. |
| Phone Numbers | Badges. Shows 2, then expands. |
| # of Numbers | How many numbers this contact has. Sortable. |
| Labels | Badges. Shows 2, then expands. |
| Active | Off by default. |
| UUID, Created, Last Updated, Deleted | All off by default. |
Filters: Labels (pick several), Active Status (Active / Inactive) and Trashed.
Row actions: Edit, Delete, Restore, Force delete. Deleting moves the contact and all its phone numbers to the trash: "This contact and all its phone numbers will be moved to trash. You can restore it later from the Trashed filter." Bring it back with the Trashed filter and Restore. Force delete is permanent.
Drag to reorder. The table is sorted by your own order, and you can drag rows up and down to change it.
Global search. Press Ctrl+K (Cmd+K on a Mac) anywhere in the app and type a name, email, Personal ID or phone number to jump straight to a contact.
Labeling Several Contacts at Once
Tick the checkboxes next to the contacts you want, then open the bulk-actions menu.
- Add a label — pick a label and press Add label. Don't have the label yet? Use the + in the dropdown, type a New label name, and it is created on your account there and then. Adding a label a contact already has changes nothing, so you can run this as often as you like. You get a confirmation such as
Label "Shiur A" added to 34 contacts. - Remove a label — pick a label and press Remove label. Only that label is taken off; the contact's other labels are untouched.
The same menu also holds Delete, Force delete and Restore.
Import from Excel / CSV
Press Import from Excel / CSV on the Contacts page. This is the fastest way to load a membership list, a shul directory or a class roster.
What you can upload: an Excel .xlsx file or a CSV. The helper on the upload box says it plainly: "Excel (.xlsx) or CSV. The first row must be the column headings."
A few things worth knowing before you upload:
- Only the first sheet of a workbook is imported. Extra tabs are ignored, so put your list on the first tab.
- Completely blank rows are skipped, and short or long rows are padded or trimmed to match the heading row.
- Date cells come across as
YYYY-MM-DD(with the time appended if the cell has one). - Long phone numbers survive Excel. A number Excel stored as
1.8455551234E+10is written out in full, not in scientific notation.
Matching your columns
After the upload you get one dropdown per field, and the system guesses which of your columns belongs where from the heading text:
| Field | Headings it recognizes | Rules |
|---|---|---|
| First name | name, first, full name, contact | Must be mapped. Up to 255 characters. |
| Last name | last, surname, family name | Up to 255 characters. |
| Phone numbers | phone, phone number, phones, mobile, cell, number, tel, telephone | Several numbers in one cell are fine, separated by a comma, semicolon, slash, pipe or line break. |
| e-mail, email address, mail | Must be a valid email. | |
| Personal ID | personal id, id, code, personal code, id number | Non-digits are stripped. 1 to 10 digits. |
| Personal PIN | pin, pin number, password | Non-digits are stripped. 1 to 8 digits. |
| Labels | label, group, groups, tags, tag | A list in one cell, for example Students, Shiur A. |
| One per custom field | the field's key, with or without underscores | See the casting rules below. |
| Notes | — | |
| Address | — | |
| Active | enabled, status | Yes/no, true/false, 1/0. |
If a guess is wrong, just change the dropdown. Anything you leave unmapped is ignored.
How phone numbers are cleaned up
Every phone cell is reduced to digits, so (917) 555-0000, 917-555-0000 and +1 917 555 0000 all become the same number. A bare 10-digit number that doesn't start with 0 gets a leading 1, because your numbers are stored with the country code. Anything shorter than 7 digits or longer than 15 is thrown away, which is what keeps an ID or amount column from being read as a phone number. Duplicates inside the same row are dropped.
Updating instead of duplicating
For each row the importer looks for an existing contact, in this order:
- A phone number in the row that already belongs to a contact on your account — that contact is updated.
- Otherwise, a matching email address — that contact is updated.
- Otherwise, a new active contact is created.
So re-importing a corrected list updates the people you already have rather than doubling them up. Phone numbers that are already in use anywhere on the account are not created a second time, so numbers never duplicate either.
Blank cells never wipe what you already have. If a row leaves the email or a custom field empty, the value already on the contact stays. To clear a value, edit the contact.
Labels in the sheet
Label names are matched ignoring case, so shiur a finds Shiur A. A label that doesn't exist yet is created automatically. Labels in the sheet are added to the contact; labels the contact already has are never removed by an import.
Custom fields in the sheet
Each field is cast to fit the type you gave it in Settings:
- Date — accepts
2026-09-01,9/1/2026, or a raw Excel day serial such as46266. Whatever you send, it is stored asYYYY-MM-DD. - Number — commas and spaces are stripped, so
1,200is stored as1200. - Choice list — matched against your choices ignoring case, so
miris stored asMir. Text that matches no choice is stored as typed. - Text — stored as typed.
When it finishes
You get a notification: "Your contact import has completed and 412 rows imported." plus, if anything went wrong, "3 rows failed to import." Failed rows are listed with the reason, so you can fix them and re-upload just those.
Download to Excel
Press Download to Excel on the Contacts page and give the file a name (it suggests contacts). The columns come out in this order:
First name, Last name, Phone numbers (comma-separated), Email, Personal ID, Labels (comma-separated), one column per custom field, Notes, Address, Active (Yes / No).
The headings are exactly the ones the importer recognizes, so export, edit and re-import round-trips cleanly. That is the easiest way to do bulk work:
- Download to Excel.
- Fix names, add phone numbers, fill in a custom field, add labels in the Labels column.
- Save and import the file back.
Every row is matched on its phone number (or email), so your edits land on the existing contacts.
How a Caller Is Matched to a Contact
When a call comes in, the system works out who is calling in this order:
- Someone who identified themselves at an access check. If the caller entered their phone number or Personal ID at an access check and passed verification, they are that contact for the rest of the call, no matter which phone they dialed from. Exams, list joins and later checks all count for that person.
- Caller ID. Otherwise, the caller's number is matched against the phone numbers on your contacts. The match tolerates a leading
+and a leading1, so a number stored as18455551234is still found when the carrier delivers+18455551234. - Nobody. If neither matches, the call runs anonymously. Name placeholders fall back to "there", and a label-based access check finds no labels.
This is why it pays to store numbers with the country code and to turn on Let unrecognized callers identify themselves on an access check when your callers ring from numbers you don't have on file.
Contact Fields
Extra fields are defined once, on the Settings page, under Contact fields. Think of them as columns you add to every contact: which yeshiva someone learns in, a membership number, a seat number, a renewal date.
Press Add a field and fill in:
- Field name (required) — up to 60 characters, for example
Yeshiva. This is the label shown on the contact card, in the table and in the export. - Type — one of:
- Text — a plain text box (the default).
- Choice list — a dropdown.
- Number — a numeric box.
- Date — a date picker.
- Choices — one per line (required, and only shown for a Choice list) — type each option on its own line, for example
Mir,Brisk,Ponevezh. Blank lines and duplicates are dropped when you save.
Drag the rows to reorder them, collapse the ones you are not working on, and press save. You get "Contact fields saved — Your contacts now have these extra fields."
Renaming is safe. Each field quietly keeps a stable internal key from the first time you saved it, so changing the Field name later never orphans the values already stored on your contacts. It does mean the placeholder keeps its original spelling; check the Contacts table heading against your text-to-speech script after a rename.
Where your fields show up
Once defined, a contact field appears everywhere a contact does:
- On the contact card, in its own Custom fields section.
- As a column in the Contacts table (off by default; turn it on from the column toggle) and it is searchable.
- As a column in the import and in the Download to Excel export.
- As a column in exam results, so you can break scores down by yeshiva, shiur or class. See Exam.
Fields in dynamic text-to-speech
Every contact field is also a {placeholder} you can drop into any dynamic text-to-speech script. A field named Yeshiva becomes {yeshiva}; a field named Seat Number becomes {seat_number}. An empty field simply reads as nothing.
These built-in placeholders are always available too:
| Placeholder | What it says |
|---|---|
{first_name} |
The caller's first name, or "there" if unknown |
{last_name} |
The caller's last name |
{full_name} |
First and last name, or "there" if unknown |
{phone_number} |
The number the caller is calling from |
{called_number} |
The number they dialed |
{account_name} |
Your account name |
{date} |
Today's date, for example September 23, 2026 |
{day} |
The day of the week, for example Wednesday |
{time} |
The current time, for example 9:41 AM |
Dates and times use your account timezone. A placeholder the system doesn't recognize is left in the script exactly as typed, so a typo is easy to spot. Full details are in Recordings, uploads & text-to-speech.
Tips
- Import first, label later. Load the sheet, then use the table filters and Add a label in bulk. It is usually faster than putting labels in the spreadsheet.
- Set Personal PINs before you rely on them. A PIN-verified access check turns away any contact with a blank PIN.
- Keep the Personal ID handy. It is a short number a caller can type when their caller ID is blocked or they are ringing from someone else's phone.
- One person, many numbers. Add the home line, the cell and the office to the same contact instead of creating three contacts. Broadcasts dial every number on the contact.
- Use the export as your backup. Download to Excel before any large import, so you can always put the old list back.