Methodology
How we compare
VoicePicks publishes independent comparisons of AI voice agents. This version starts with AI receptionists and answering services for small businesses: a static reading of one snapshot, 30 services and 82 plans, with date_checked of October 14, 2026 on every record. Loading a page does not call a vendor site, and VoicePicks does not sell these services.
Where the rows come from
The site is generated from src/data/receptionists.json. src/data/receptionists.csv is the same snapshot with one row per plan. The build checks that the two files list the same services, plan names, monthly figures, included amounts, and overage text.
Verification badges
Each service has a verified field. The badge is that field, copied across:
true→ Verified from vendor pagepartial→ Partially verifiedfalse→ Unverified
Last verified is date_checked. The source label is source. When that value is a URL, the label is the hostname and the link is the URL. When it is a sentence, the sentence is the label.
What is printed as stored
- Plan name, included amount, and overage are printed as stored.
- A numeric
monthly_usdis shown in dollars.24.95becomes $24.95.0becomes $0. - A string
monthly_usdis printed unchanged, includingunknown,contact sales,unpublished, andn/a. - The earlier industry sentence is
target_industries_textand is printed unchanged. Trade slugs are listed separately and linked to the vendor page stored for each slug. - Feature labels are the field names, with underscores turned into spaces. The exceptions are SMS, HIPAA, and CRM.
trueandfalseare shown as Yes and No. A missing feature object is “No feature fields were recorded.”
How a monthly price is chosen for sorting
The comparison table and the category lists need one number per service. That number is the smallest parsed monthly amount on the service. It is a reading aid. The plans table on each service page is the record.
- A numeric
monthly_usdis a monthly amount. - A string contributes its first number.
- Strings that contain “per min” or “/min” stay per-minute and are skipped when a monthly amount exists.
- Strings that contain “/yr” or “per year” stay yearly and are skipped the same way.
- The word “yearly” inside an otherwise monthly string is left in the display. The first number is still the monthly sort key, because the field is
monthly_usd. contact sales,unknown, and other strings with no number sort after every monthly price.
Home-page picks use the same reader, then keep verified services whose lowest monthly amount is above $0, three per category.
How these recorded values are read
| Record | Stored monthly_usd | Shown as | Used as |
|---|---|---|---|
| Upfirst · Starter | 24.95 | $24.95 | monthly |
| Sameday AI · Launch | from 449 | from 449 | monthly |
| Synthflow · Enterprise | from $30,000/yr | from $30,000/yr | per-year |
| JustCall AI Voice Agent · AI voice agent | $0.15 (per min, unit implied) | $0.15 (per min, unit implied) | per-minute |
| Allo · Solo seat + AI Receptionist | 42 (10 seat + 32 agent, yearly) | 42 (10 seat + 32 agent, yearly) | monthly |
| Numa · Custom | contact sales | contact sales | unparsed |
The service name for each plan is on its own page. These rows are the stored plan values, not a new price.
Categories
The home page groups services with a rule on the type string:
- Turnkey AI — type is “AI” or starts with “AI (”.
- Human reception — type starts with “Human”.
- Phone system with AI — type starts with “Phone system”.
- Platforms and builders — type starts with “AI platform” or “All-in-one”.
The comparison table can filter on that group and on the original type string.
Filters
- Verification matches the badge: Verified from vendor page, Partially verified, or Unverified.
- Trial or offer has three buckets.
unknownstays Unknown. Text that is “No” or starts with “No ” is “No offer recorded.” Ruby’s trial is “unknown”. Stack Space Solutions’ trial is “No free trial; non-refundable”, which starts with “No”. Every other trial string is “Offer recorded,” which covers free trials, free plans, credits, and money-back wording. The table still shows the original sentence. - Industry matches a trade slug in
target_industries: hvac, plumbing, electrical, roofing, dental, medical, law, real-estate, auto-repair, salons, landscaping, pest-control, cleaning, veterinary, property-management, restaurants, chiropractic, or insurance. - Feature noted matches a key present on the older
featuresobject. The value of that key is on the service page. - HIPAA matches the sourced value: Yes, No, or unknown.
- Languages matches whether a language value was recorded, or unknown.
- Call transfer matches Yes or unknown.
- Booking matches Yes or unknown.
- Integrations matches a named list, or none recorded.
- Price bands use the lowest parsed monthly amount: under $50 (this includes $0), $50 to under $150, $150 to under $500, $500 and above, and no monthly number.
Cost at 200 calls
The column uses 200 calls a month. A plan counts only when monthly_usd is an exact number, the included text states a call allowance (or unlimited calls), and any calls past that allowance have a single per-call overage. The service cell is the lowest such total.
- Covered calls cost the monthly price. Extra calls add (200 − included) × the per-call overage.
- Strings such as “from”, “~”, “contact sales”, and ranges are skipped for this column.
- Minutes, credits, unique customers, and per-day caps are skipped. They are not converted into calls.
- A price recorded as “per user” is computed for 1 user, and the cell says so.
- If no plan qualifies, the cell is n/a.
Upfirst’s computed figure is $159.95: Pro: $159.95 monthly includes 300 calls, so 200 calls adds $0..
Rosie’s plans are in minutes, so its 200-call cost is n/a. No plan here has an exact monthly price and a call allowance that reaches 200 calls. Minute, credit, customer, daily-cap, and contact-sales plans stay n/a.
Sourced fields
HIPAA, languages, call transfer, and booking are objects with value, source, andevidence. true and false are shown as Yes and No. The stringunknown stays unknown. When source is an http URL, the hostname is a link. Evidence, when present, sits in a collapsed disclosure. These fields were enriched on 2026-10-15. date_checked for the price snapshot remains October 14, 2026.
Integrations is a list of names, each with its own source URL when one was recorded. An empty list is “none recorded.” A name with an http source is a link to that page.
The older features object is still printed as feature notes. It is separate from the sourced HIPAA, languages, call transfer, booking, and integrations fields.
Trade pages
target_industries is a list of trade slugs. A service is on a trade page only when that slug is in the list. target_industries_sources stores the vendor page for each listed slug, and the trade page links it. The earlier free-text label is target_industries_text and is shown as a subline. Matching is the slug itself, so “auto-repair” is not inferred from a sentence about auto shops.
Vs pages
Ten pairs repeat the stored fields in two columns, including plans, notes, the sourced HIPAA, languages, call transfer, booking, and integrations values, the trade slugs with their vendor links, and the 200-call cost. The pages do not add a winner.
Missed-call calculator
The calculator uses only the numbers typed into it:
- Missed calls = calls/mo × (percent missed ÷ 100)
- Lost jobs = missed calls × (close rate ÷ 100)
- Missed-call revenue = lost jobs × average job value
At exactly 200 calls, it also shows missed-call revenue minus each computed 200-call cost. That difference is arithmetic. It is not a prediction that the service would save the calls.
Submit or claim
The listing form opens an email to a placeholder address, or copies the text. It does not store a submission. A Formspree action can be added later by setting the form action to a form id you create.
Pricing is being verified
19 services are verified from a vendor page, 5 are partial, and 6 are unverified. The note at the top of every page stays up while partial and unverified rows are in the snapshot. Notes stored on a service are shown on that service’s page.