Summary: The 3.23 update introduces numerous features and improvements for Avochato, including a new call tree for routing inbound calls, enhancements to call verification with STIR/SHAKEN support, and options for managing low-score calls. Other updates include streamlined inbox navigation, new user management for Salesforce integration, and breaking changes to contact importing and campaign APIs. Additionally, various bug fixes and performance optimizations have been implemented to enhance overall functionality and user experience.
The following breaking changes have been introduced which may impact existing workflows depending on your Avochato configuration and use-case:
- Salesforce Contact Importing
- Campaigns API and removal behavior
Read on to learn more.
Avochato for Salesforce
New: User Management
There is a new “Salesforce Users” page which lists all the Salesforce users that currently are synced to your Avochato inbox. Managers can get there by clicking “Integrations” > “Salesforce” > “Users”.
Syncing users between Avochato and Salesforce means that any activity associated with a user in Salesforce (such as ownership) properly ties back to that same user in Avochato when assigning contacts or conversations as well as reporting on activity.
Users with a paid Salesforce seat are synced automatically by matched by their salesforce email to their Avochato email.
Managers can optionally refresh the sync for a user, or delete Avochato↔Salesforce connection for that particular user.
You can also “Sync All” users in your inbox and any users with matching emails will be linked.
This can be useful when debugging or freeing up seats from deactivated Salesforce users.
[Breaking Changes] Salesforce Contact Importing
We’ve upgraded the contact importing process to be smoother, faster, more accurate.
There are also a few updates to note, which bring our Salesforce contact import feature in line with our Contact CSV and API import features, effective immediately. These may be considered “breaking” changes depending on your use-case:
- We no longer process duplicate contacts (unique phone number) in a given Salesforce import. Only the first record per phone number will be processed, per import.
- Invalid phone numbers are now skipped while syncing. This includes any records with a missing or fake phone number (or area code) will be ignored and will not be synced to your Avochato contacts list.
- List View Syncing now requires a specific list view ID and Avochato will no longer sync “All Contacts” automatically when the List View ID is unset. While a list view ID is set, Avochato will sync the list every night as usual. If no list view ID is specified, we will not attempt to sync your Salesforce contacts to Avochato. Once you add a List View ID, we will resume syncing the following night or when you click “sync now” You can still manually import “all contacts” by using the Import Contacts button.
- The import summary (see below) will include a count of the number of records we skipped due to missing, malformatted, or blank phone fields.
Salesforce Contact Import Summaries and Logging
Just like Contact CSV import summaries, we now log a summary with information about bulk contact imports from Salesforce. This includes hourly or nightly imports of a list view, as well as any manual imports triggered from Avochato’s Salesforce integration pages. Summaries are not generated by any individual contact updates (for example, using our Process Builder actions for updating a single contact; updating contacts one at a time using our API; or any changes to contacts made in the Avochato app manually).
Additionally, we have added more information and shortcuts in the Salesforce import email summary, including a count of the number of contacts that were updated as a result of an import (if applicable).
The Contact Import page includes new shortcuts to filter the list by source (either CSV or Salesforce).
Finally, any RESTforce errors that Avochato encounters during an import will be logged to the Salesforce Logs page for further debugging.
API
[Breaking Changes] Campaigns API changes & removal behavior
We’ve overhauled a number of mechanisms for managing campaigns via the API, but this requires making some breaking changes to the values returned by the Campaigns API. Specifically, we are slightly changing how we remove contacts from campaigns that are scheduled to receive a campaign keyword in the future, and making changes to the response body of some of our API routes for adding and removing contacts from campaign steps. A couple new features are optional, which I’ll go into detail below, and should not impact existing workflows. However, the following changes applies to all campaigns for customers who schedule campaign messages in the future using the Scheduled Messages API or the schedule button:
- Breaking change: Removing a contact from a specific campaign step (either via API or via the “Cancel All” button on the campaign step page) will now both remove that contact from that campaign step (just like before) as well as also prevent sending any currently-scheduled pending message that would queue up that campaign step (such as the $campaign activation keyword).
Why are we making this change? Usually, removing someone from a campaign is a very specific and intentional act - we want it to be meaningful, without developers having to worry about cleaning up any lingering messages that will cause the contact to still get the campaign text. The general expectation has been that if users choose to “remove contact x from campaign y”, Avochato should be aware of the context of where the user is currently at in the campaign (including if they are about to enter the campaign). The overlap of campaign activation keywords and scheduling messages has created interesting scenarios, and we want to choose the simplest option for you to automatically remove .
Example: I create a scheduled message for a contact “Alice” to receive my two-step
$campaign_onboarding
campaign keyword one week from now because she signed up for my newsletter. Alice technically has not “entered” my campaign yet - she has not received the campaign message’s first step at all, but they are due to receive the first message (and all subsequent follow-ups) in the near future.
A day later, my CRM informs me that Alice has been removed from my newsletter - she never meant to sign up. In response, I trigger the Avochato API to remove her from my onboarding campaign. Now, she will not receive the first campaign message later in the week. Avochato will cancel the pending message automatically so you don’t have to worry about managing it yourself. (Previously, “removing” this contact from the campaign in this example wouldn’t have actually done anything, and they’d still receive the campaign message in seven days time.) Note: this does not apply to contacts who are part of a broadcast that contains a campaign keyword. In order to prevent contacts from receiving a broadcast, remove them from the broadcast or cancel the broadcast.
- Breaking change: for performance reasons,
/v1/campaigns/:id/cancel
now cleans up campaigns asynchronously instead of synchronously. This means the API response time will be faster, but the response body’s values have changed. You may need to adjust automation accordingly when handling the response. The response body will confirm receipt of the API request and its parameters. Why are we making this change?
In order to process the contacts properly, especially for larger contact lists or multi-step campaigns, this must be done in the background.
- Breaking change: Passing no contact or phone numbers to the
/v1/campaigns/:id/cancel
route no longer cancels all contacts. You must explicitly pass the “all” parameter with the value true or 1. Why are we making this change?
This was way too easy to get wrong, such as accidentally providing no data parameter when cURLing our API and accidentally removing all contacts from a campaign by mistake.
- Breaking change: Attempting to remove a contact from a campaign step which they are not due to receive will no longer respond with an error. Why are we making this change?
Previously you had to know the exact step that an exact contact was on in order to remove them without getting a 4XX error from our API, but this is not helpful. Even though we will take no action, this does not justify a hard error - our API will acknowledge your request successfully, see that contact doesn’t actually belong to the campaign, and do nothing.
We’ve also made a number of quality-of-life improvements to make the Campaigns API more intuitive to use:
- New: You can specify an array or comma separated list of contact IDs or phone numbers via the
contacts
parameter to add or remove from a campaign in bulk. Invalid IDs or blank phone numbers will be ignored. This is mutually exclusive from using thephone
parameter which will lookup a single contact by their phone number. If you pass an empty array or csv to “contacts” key, the API will error.
- You can specify the campaign step using either the keyword or the campaign_keyword (ex: a campaign called “onboarding” can be used with “onboarding”, “campaign_onboarding”, or “$campaign_onboarding” as the “id” parameter).
- New: you can now pass multiple campaign IDs to
/v1/campaigns/:id/cancel
(just like/v1/campaigns/:id
) and they will all be handled asynchronously. This can be used to remove contacts from a series of campaign steps, whichever they are currently on. However, you don’t need to do this if you use therecursive
flag (see below)
We have added new parameters to the Campaigns API as well, which let you do a better job of cleaning up a campaign(s) step in a single API request:
New: remove “All” contacts - added the optional all
parameter to /v1/campaigns/:id/cancel
which allows you to cancel the campaign step for all contacts currently in that campaign step.
Previously this was the default behavior of POSTing to /v1/campaigns/some_campaign_step/cancel
without passing explicit contacts or phone numbers — but that was dangerous and easy to do by mistake.
This flag is mutually exclusive to passing the contacts
or phone
parameters. If you pass all
, we will ignore the contacts
or phone
parameters.
Example: my store is ending our Black Friday campaign a day early because they sold out of all their merchandise. I can pass id=campaign_black_friday&all=true
to make sure all the contacts in my inbox do not receive that campaign step.
New: remove using the “Recursive” strategy - We added the optional recursive
param to /v1/campaigns/:id/cancel
which allows cancelling all subsequent follow-up steps after and including the target step. This is not the default behavior, but is often what users expect when removing someone from a full campaign.
Example: my Black Friday campaign has multiple steps - and my contacts are on all different steps because they entered the campaign at different days of the week.
I want anybody who is anywhere in the campaign to no longer receive any of the campaign messages (whether they are on step 1, step 5 or step 10, or haven’t even received step 1 yet). To do this, I can pass:
id=campaign_black_friday&all=true&recursive=true
to make sure all my contacts, no matter what step they are on in the campaign, do not receive any more messages associated with this campaign. If you pass a step in the middle of the campaign without the recursive parameter, we only remove contacts from that step (note: this is how the Remove from Campaign API has always behaved). If you pass a step in the middle of the campaign and the recursive parameter, we will remove contacts from that step and all subsequent steps. Contacts on earlier steps will be unaffected.
Lastly, we have updated our API docs accordingly to include the new optional parameters, as well as the new response format that may break previous expectations.
Calls
3.23 brings a number of new features and improvements to phone calls made through your Avochato numbers.
New: Call Tree
You can setup a simple call tree in Avochato to route inbound calls to map the digits 1-9 to up to 9 phone numbers. This new optional step in your inbound call flow happens after your greeting and robocall protection (if enabled), but before call forwarding and voicemail.
Call flow when someone calls in:
- Caller dials your Avochato number
- Call Greeting plays
- Robocall protection screens the call
- Call Tree instruction plays (New)
- Call Tree routes the call
- Call Forwarding kicks in
- Voicemail recording plays
- Caller can leave a voicemail recording
- Call ends
How it works:
When entering the call tree experience, callers will hear your “Call Tree Instructions” recording, if enabled, then must press 1, 2, etc to forward to a number of your choice.
Callers who press zero will proceed to your usual call forwarding rules, including in-browser calling, voicemail etc.
Callers who fail to press a correct digit will loop back to the call instructions.
You can toggle the call tree on or off without changing the recording or your mapping of digits to phone numbers.
Update: Call Verification & STIR/SHAKEN
We’ve added support for the STIR/SHAKEN attestation when handling inbound calls.
This “score” proves the person who owns the phone number is the person making the phone call, to the best of the knowledge of the telecom providers that are transmitting the call.
For context, this is the current industry-standard for preventing spoofed phone calls (where a caller disguises their real number to impersonate or mislead the callee). For example, some cellular providers and handset makers already show warnings like “scam likely” etc on your phone screen when you receive an inbound call with a low STIR/SHAKEN score to your personal device.*
Avochato has new functionality for call features that take advantage of STIR/SHAKEN if available, specifically:
- Avochato now logs the STIR/SHAKEN attestation of every call. This attestation is available in CSV downloads of call logs as well as some parts of the app UI.
- Avochato now attempts to forward the attestation when forwarding calls - this should improve deliverability and reduce likelihood that your forwarded calls are blocked or appear fraudulent to the recipient of the forwarded call.
- Robocall Protection now prioritizes inbound calls based on their STIR/SHAKEN attestation:
- “A” grade calls will be considered “screened” and longer prompted to press 1 when they call your Avochato number.
- “B” grade calls will also no longer be prompted to press 1 but only if they also have a contact priority score of 3 or more.
- “C” grade calls or worse — as well as calls with no attestation — will always be prompted to press 1, regardless of priority or any other metadata.
We expect this change makes Robocall protection more seamless for your callers while still keeping out fraudulent.
Please keep in mind that international callers and callers using a VOIP number are most likely to be graded lower than domestic calls made from end-users with iPhones/Androids/landlines etc.
* To improve the STIR/SHAKEN score of your own Avochato number, please contact our support team. Avochato numbers’ attestations can be improved on a case-by-case basis by providing business information similar to our Verification process for sending text messages.
New: Send low score calls straight to voicemail
You can configure your inbox to send inbound “C” grade or lower calls straight to voicemail instead of entering your call tree or undergoing call forwarding. Inbound calls without any attestation information (on a pre-carrier basis) will be exempt from this feature for now.
While this setting is enabled, and your Avochato inbox’s voicemail is not enabled, C-grade and lower calls will just hang up automatically.
This feature is optional per inbox and is off by default. This feature does not require robocall protection to be enabled.
New: Display your Avochato Number when forwarding calls
Enable this feature to display your Avochato number in the CallerID when forwarding inbound calls. This makes it easy to know if an inbound call is coming through Avochato (versus a direct call to your cell phone). This behavior is similar to the current experience when using Avochato’s “Call Conferencing” configuration.
It also lets you do to setup personal workflows such as setting your Avochato number as a contact on your device with its own special dialing rules (ex: custom ring tone, ignore after 5pm, etc ) on a per-device level. How you handle this is left up to you.
This feature is optional per inbox and is off by default.
Note: If you forward phone calls from Avochato to another IVR system, changing the caller ID will void any STIR/SHAKEN attestation that is part of the inbound call. This feature is not recommended when forwarding calls to an IVR or other automation software.
New: Opt Out contacts created by inbound calls
Inboxes can be configured to treat new contacts created by a phone call as opted out by default. Existing contacts are unaffected by this change, and turning this feature on does not modify the historical opt out state of any of your contacts.
Historically, any contact that was automatically created as a result of an inbound call to your Avochato number(s) was treated as “opted in” - this setting changes that behavior to better manage your contact list, especially for customers with high volumes of inbound calls.
This feature is optional per inbox and is off by default.
Update: Call Logs page
We’ve updated the Calls page to incorporating more modern styles with functional layout changes to the overall page, especially on mobile devices.
- We’ve reorganized the calls table, including the table columns and the nested “more info” section per call log.
- We’ve added the StirShaken Attestation to the “more info” section
- You can now listen to voicemail recordings from the call logs list without having to click into the call record (desktop experience only)
- Call logs and CSV downloads can now be filtered by up to one year of records.
- We’ve updated the user experience on mobile, including making the page easier to navigate on small screens, making the call links larger and easier to click on, collapsed the filter button for toggling the filter menu (which is now hidden by default instead of always open).
- Finally, the “Download Logs” button has been moved below the list of calls.
Update: Avochato text-to-speech voice
The default automated text-to-speech voice that reads instructions to incoming callers has been updated and will sound similar but less robotic.
Bug fixes
- The maximum bandwidth utilized by Avochato’s in-browser calling has been doubled to improve call fidelity.
- Missed calls: Inbound calls that go to voicemail without forwarding to any other numbers should now properly trigger a "missed call" notification, appear in the “missed calls” list, and have their
dial_call_status
set to "no-answer”.
Previously, these were not considered “missed calls” in some cases.
- Fixed a bug where the “this billing period” date filter wouldn’t work until you had actually been billed. The filter should always work now, including unpaid trials or inboxes created under special circumstances without the prerequisite billing information.
Inbox
We’ve streamlined the wide mode experience, added support for hotkeys and tab-navigation and more.
Wide Mode
- You can now take actions in the inbox while focusing on a conversation without dismissing the active conversation. This includes searching the inbox, using bulk actions, changing filters, switching to other conversations, marking conversations as addressed, changing statuses, and more. Try it out!
- You no longer have to double-click to switch from one active conversation to another when using Wide Mode.
Accessibility Updates
Combined with our hotkey updates (see below), we hope this makes power users able to navigate their inbox and manage conversations faster than ever:
- The inbox has been updated to better support keyboard-only navigation for users who don’t or can’t use a mouse. Not every component in the inbox has been modified, but nearly all major inbox UI elements can be navigated without using a mouse via the
tab
key and interacted with via thereturn
orspacebar
keys.
- This includes all inbox action buttons and menus, the search bar, the filters menu and its various options, bulk actions (in wide mode), and more.
- Visual indicators have been added to various components so it is clear that they are currently in focus when tab-navigating through the inbox.
The Escape key
- For desktop users, the
escape
key should now properly dismiss the active conversation so you don’t have to click the X button with your mouse.
- Hitting
escape
while using the search bar will unfocus it and reset the search bar input (without changing the active filters or search applied to the current page).
- Hitting
escape
while typing a message to a conversation will unfocus the chat box. Hit it again to dismiss the conversation.
New: Navigation Hotkeys
Desktop power users rejoice - there are new hotkeys to manage navigating around the inbox as well as taking actions, opening menus and filters, and generally making it faster to get things done.
- New hotkey actions have been added to the inbox and conversation pages. They allow you to toggle various menus and UI elements in the Avochato, place calls, find conversations, and more, all without your hands leaving the keyboard.
- To enable the Navigation Hotkeys for your user, go to your www.avochato.com/profile then check the “Enable Navigation Hotkeys” box and hit Save. Note: “Template Hotkeys” is a separate feature and is not required to use Navigation Hotkeys.
- For a full list of the new hotkeys, please see below
- Hotkeys can be enabled on a per-user basis. However, they are not customizable at this time - what you see is what you get.
- Examples:
Escape
: see abovej/k
: While you are not typing to a contact or using any other forms, you can navigate up and down the inboxc
: open the “new chat” window to start or lookup a conversation- `: Go back (will undo "escape" if you just escaped from a conversation)
- … and many more!
The “Escape” key now exits the active conversation, regardless of your hotkey status. In wide mode, this dismisses the conversation panel on the right side (if there is one) In compact and classic mode, this means collapsing the current ticket so you just see the ticket list on the left side. This will apply to all users.
Historically, escape has dismissed many open menus in Avochato. Now it explicitly escapes and clears the inbox search bar, as well as the chat box in a conversation.
Note: you can use the backtick “`” to “undo” this action and go back to the ticket you were previously had open but only with “Navigation Hotkeys” enabled.
New Navigation hotkeys
These hotkeys only apply if you have the "Navigation Hotkeys" feature enabled in your profile.
This is a separate flag from the legacy “Templates Hotkeys” feature, and defaults to “off” for new and existing users.
While viewing the inbox (wide, compact, or classic)
These hotkeys can all be used while viewing the inbox and while in a conversation.
They don’t work while the chat box or other text input fields are focused.
1-9 | Switch to conversation 1...9, starting from the top of the inbox. |
` (backtick) | Reopen the conversation you just escaped, or navigate backwards through previous open conversations. |
Esc | Dismiss the active conversation. While using the searchbar, clears and unfocuses the search. |
C | Chat (opens the "new convo" popup) |
F | Filters menu opens or closes. All items in the filters many can be menu can be selected using the tab key, and manipulated using the space key. |
Alt+F | Apply Filters |
Shift+Alt+F | Clear Filters |
J / K | Move up or down the inbox list, from your current conversation. |
Ctrl+J / Ctrl+K | Move up or down the inbox list in increments of ten, from your current conversation. |
P | Pause or unpause the live inbox |
R | Refresh the inbox convo list, retaining any current active filters |
U | Unfilter the inbox, removing all active filters |
/ | Focus the search bar |
While viewing a conversation
These hotkeys can be used while you view a conversation. Inbox hotkeys still apply.
Esc | Unfocus the chat box, if it’s focused. Otherwise, minimize the current convo. |
Ctrl+Space | Focus the chat box |
A | Toggle the AgentAssist tab. |
D | Toggle the "Device / Convo Info" tab (if available) |
I | Toggle informational events in the convo feed (addressed/unaddressed and other “hidden” events we don’t normally show customers. |
N | Toggle the Notes tab. |
T | Toggle the Tags bin, and focuses the new tag form. |
Ctrl+L | Clear the chat box (and the latest draft message, if there is one). This only works while the chatbox is not focused. So, if you’re actively typing unfortunately you have to click out of the box to use it: instead, use Esc then ctrl+L right after |
Shift+Ctrl+P | Call the current contact (if available). I made this a little more difficult so that its hard to do by accident. |
New: Ticket Status Webhooks
A new Webhook has been added per inbox under the Integrations page. Every time a conversation/ticket changes status (examples: when a new conversation begins; when a user changes a status from “open” to “closed”; when Avochato automatically reopens a closed conversation), the webhook will send a payload to the url of your choosing.
The payload includes a JSON representation of the Conversation, Contact, and the most recent Message event in the conversation.
Additionally, the webhook logs page has received a visual update. We now show an expanded view of the webhook request body to make it easier to see the format and values of data that Avochato sent to your webhook endpoints when making an webhook request. We hope this makes it easier for developers to quickly debug their issues handling the payload(s) from Avochato.
Additional Bug Fixes
AvoAI
- Auto-suggestions no longer populate when viewing a closed conversation.
- Sentiment scores of zero now are visibly distinct from “unranked” conversations. Note: Zero is the lowest sentiment score.
- The AvoAI Salesforce digest no longer triggers if an inbox has not configured an AvoBot in the Automation tab.
Verification
- Fixed an issue on mobile apps where you could not scroll all the way down the US State list while setting up a new brand.
Broadcasting
- The broadcast date scheduler input field is more obvious on mobile and no longer appears to be a blank white bar when no date has been selected yet.
Inbox
- The “toll free reminder” banner properly goes away once all your toll-free numbers have been registered.
- Dismissing the A2P / Toll free Registration banners is smoother and no longer triggers a hard page reload. It also no longer visually impacts the position of other elements of the page (such as the left-hand inbox list pop-ups appearing in the wrong place while the banner is active)
- Fixed an issue with the “demo” templates always appearing above the chat box while testing Avochato before signing up for a subscription.
Analytics
We’ve made a number of small changes to make picking custom date ranges for reports easier and less buggy:
- Custom date ranges are easier to set and less likely to reset or get stuck when you are navigating between tabs.
- Switching back from a custom date range to one of the default date range shortcuts (such as “Last week”) no longer prevents you from entering a new custom date range.
- Fixed a bug where you could not change the selected dates at all.
Finally, our legacy reports pages have received some minor cosmetic adjustments.
Sign In and Profile
We’ve also addressed a number of edge cases where users could not modify their factor-of-choice for multi-factor authentication without getting kicked out of the app, or got stuck while trying to use third party apps to view their inbox.
Session duration and cookies
- Avochato is less aggressive about logging users out - sessions now last up to 7 days on desktop by default (up to 30 days if you check the “remember me” box)
- Sign in lock-outs are less likely to occur when frequently logging in as the same Avochato user throughout the day on one or more devices.
- Enabling MFA while viewing Avochato via the Salesforce or Microsoft Teams apps should no longer stick you into an inescapable loop.
Sign in form updates
- Fixed an issue with sign in forms being broken within the Avochato for Salesforce experience on various screen sizes. They should look normal now.
- You can once again reveal the password you’re typing when signing up, signing in, or entering a new password. We’ve also made the password revealer button more obvious, and it should no longer conflict visually with other password manager browser extensions (such as 1password).
- Sign in (and sign up) forms have been adjusted so that their contents are better aligned on all screen sizes to always appear above the fold.
- Additionally, all sign in and sign up forms can be fully navigated without a mouse using the Tab key.
User Profile & MFA configuration
- After you have used MFA to log into Avochato, you won’t get kicked out automatically if you unset your MFA authenticator or phone number during your session. This makes it possible to reset your phone number or authenticator app after successfully logging in (without being locked out before you can update it). Note: If you have lost access to your authenticator, you must log in via your email and phone 2FA code in order to reset it, so we advise always configuring a phone number in your Profile for emergency access.
- Fixed various usability issues for mouse-free users - Avochato sign up, sign in, and member invite forms all properly respect tab-navigation, and those form’s elements all have visible indicators when they are focused. Also, these forms have all been adjusted to better fit various screen sizes and have their submit actions always appear above the fold of the page.
- Any errors that occur when saving your profile information are now more prominently displayed.
- The default format for the profile phone field is now correctly displayed in the input field, including support for international numbers. Note: International numbers are still not fully supported for receiving MFA codes (on a region by region basis), so we encourage users who want to assign their international number to their profile to also setup MFA using an authenticator app instead of SMS.
Website Widgets
- Fixed an issue with the widget list where the “last activity” date wouldn’t actually show the latest submission. The date should always be populated for any widgets that have had a submission, and sorting the widget list based on that timestamp now works properly.
- Fixed an issue where the widget icon itself could get cropped when your pop-out message was multiple lines.
- Fixed an issue with the widget preview getting cropped improperly in the customization page.
- The widget list has received a few cosmetic adjustments, including widget icons in the list view getting squished when the widget name was too long.
- The instructions under the “Learn More - Go Live” menu has been updated.