I have noticed the same, occurring randomly a couple times a week. It may happen more frequently, but we only notice it that often. We have attributed it to a drop in response from Pulseway.
I will enable and send diagnostics.

If you download the Pulseway Dashboard (https://www.pulseway.com/download/PCDashboard_x64.msi) and log in, you can right click on each desktop and edit the group name without touching any of the machines. Not exactly a batch action, but you don't have to touch any machine.

Our business operates with hundreds of products in our inventory and going through all of them and manually entering them into PSA was not exactly an option, and without an import function, I had to develop an import tool that uses the PSA API. I developed it originally with hard coded parameters, in a single class, but went back today and improved it for distribution to everyone here.
To view the source code, check out the repository at https://bitbucket.org/garrettbromley/pulseway-product-import/
To download the executable files, download PulsewayProductImport-v2.zip at https://bitbucket.org/garrettbromley/pulseway-product-import/downloads/
Instructions:
Download the Excel template and add your inventory into that sheet. I personally had a Microsoft Surface that I walked around with and inventoried everything.
To change the categories/sub categories, open the "Back End" tab on the sheet and edit those tables to your liking
The only column that isn't required is the UPC Code.
Run the Import Tool
Input your PSA credentials
Type in the full directory to the excel sheet (make sure its closed before running it)
Confirm the number of detected items
Watch the tool work
Make a stock adjustment with the levels of stock for each item (this unfortunately cannot be automated)
It will notify you how many items have successfully been imported and which ones failed (if any) and why.
Please let me know if you have any questions! I will post changelogs if any updates are made.

I do agree this should be a feature in the future, but as of right now there is only one way to do that:
Assign the user as an External User
Don't assign the ticket contact as them (leave it blank)
External Users can only see tickets assigned to them, External Managers can see all tickets associated with their account.

Inventory and Asset management has been the topic of my work within setting up PSA over the past week or two. Here is how I am handling these cases:
As of now, every item that is in stock or has the potential to be used in a ticket or project, or even outright sold to a client goes into inventory and is tracked. You can find the import tool I made at https://forum.pulseway.com/topic/2342-c-inventory-product-import-tool-from-excel/
Once an item is going to be used in a ticket/project, it is added as a charge on that ticket/project. After the charge is added, you need to click edit on the new charge to work with it further (not entirely intuitive/smooth):
After you open that up, you want to click deliver in the bottom left to take it out of your inventory stock at which point you have the option to make it into an asset. At the moment, we are only doing this for things like Desktops, Servers, Laptops, Routers, Switches, etc. For things like cables or external hard drives, I don't believe it is necessary to do this. With the hardware assets mentioned, you have the ability to track IP information/configuration, login credentials and other important information through the use of custom fields along with the default ones. If you aren't tracking important information on such as a keyboard or cable, which I don't believe you will, it isn't necessary to make an asset.
After you make an asset, you can see it populate in the charges menu as well as in your hardware assets section:
At which point you can attach it to the account (client) you installed it at.

I notice that there are tickets coming from RMM events, such as offline statuses for servers where it takes up far more room than it should. Both the title and the description contain the same information:
Only the first line is necessary in the title, or something like, "'MYSERVER' in group 'My Servers' is offline" with the full description within the ticket.

We currently use TeamViewer as our remote support software and like to have Pulseway as a backup to that, but one thing that we like to do is record our sessions for both accountability and to have the ability to reference something we have done in the past to resolve an issue or to double check one's work.
If Pulseway is to compete with this, I would like to see the ability to record these sessions.

Not sure how many people use 3CX for their phone systems, but our company utilizes the system and have recently adopted Pulseway as well. As a result, I have developed a plugin for 3CX Windows Client that opens a ticket as you pick up the phone from an incoming call. I have included the source code for reference if anyone else has a need for it.
Instructions:
Create a new project. Select C# Language and create a new “Windows Class Library” project.
Ensure that the project targets .NET Framework 4.5.1
Add a reference to the library “MyPhoneCRMIntegration.dll” installed with 3CXPhone for Windows (usually C:\ProgramData\3CXPhone for Windows\PhoneApp).
Rename Class1.cs to PulsewayTicketPlugin.cs and replace the code with the following:
using System;
using System.IO;
namespace _PulsewayTicketPlugin
{
[MyPhonePlugins.CRMPluginLoader]
public class PulsewayTicketPlugin
{
// Initialization of Variables
private static PulsewayTicketPlugin instance = null; // Holds the instance
private MyPhonePlugins.IMyPhoneCallHandler callHandler = null; // Holds the handler
private static MyPhonePlugins.CallState lastStatus = MyPhonePlugins.CallState.Undefined; // Holds the last relevant phone status
// Called upon loading 3CX Client
[MyPhonePlugins.CRMPluginInitializer]
public static void Loader(MyPhonePlugins.IMyPhoneCallHandler callHandler)
{
// Create a new instance of the plugin
instance = new PulsewayTicketPlugin(callHandler);
}
// Constructor for plugin, to add event handler
private PulsewayTicketPlugin(MyPhonePlugins.IMyPhoneCallHandler callHandler) {
this.callHandler = callHandler;
// As the status of the call changes, process the changes
callHandler.OnCallStatusChanged += new MyPhonePlugins.CallInfoHandler(callHandler_OnCallStatusChanged);
}
// Processes the status of the call
private void callHandler_OnCallStatusChanged(object sender, MyPhonePlugins.CallStatus callInfo)
{
// Process the current state
// - If it is ringing, a call is incoming, so we want to monitor it
// - If it has ended, no longer need to monitor it (happens when we end it or someone else picks it up)
// - Don't process other cases, not necessary
switch (callInfo.State)
{
case MyPhonePlugins.CallState.Ended: { lastStatus = MyPhonePlugins.CallState.Undefined; break; };
case MyPhonePlugins.CallState.Ringing: { lastStatus = MyPhonePlugins.CallState.Ringing; break; };
default: { break; };
}
// If the phone was ringing and we picked it up, open a new ticket
if (lastStatus == MyPhonePlugins.CallState.Ringing && callInfo.State == MyPhonePlugins.CallState.Connected)
{
// Windows will automatically use the default application used to open URL's
System.Diagnostics.Process.Start("https://psa.pulseway.com/MSP/TicketEdit.aspx");
}
}
}
}
Build the DLL and place it into the 3CX Phone Directory (C:\ProgramData\3CXPhone for Windows\PhoneApp).
Edit the 3CX Phone Configuration file (C:\ProgramData\3CXPhone for Windows\PhoneApp\3CXWin8Phone.user.config) and add the following:
<add key="CRMPlugin" value="CallNotifier,3CXPhoneTapiPlugin,PulsewayTicketPlugin"/>
Reload your 3CX Windows Client and it should work with the next incoming call!