TextWise is an SMS messaging and authentication pod for ConnectWise Manage (PSA) and Nilear. It provides an integration for sending SMS messages and performing authentication directly from within tickets.
We've developed TextWise and have been using it internally for a while, and have now open-sourced it for the benefit of the community. We find it's perfect for authenticating unknown users, or for sending sensitive information to a contact.
Care has been taken to ensure that TextWise works with on-prem or cloud, and has been styled to fit in with the rest of the ConnectWise Manage (PSA) user interface to provide a seamless experience.
- Supports SMSBroadcast and Twilio
- Send SMS messages or authentication codes directly to a contact
- Authenticate ticket contacts with randomly generated 4 digit codes
- Optional configuration for:
- Cooldown timers on messages to prevent misuse
- Supports both ConnectWise Manage (PSA) and Nilear MTX
The application uses the following environment variables:
Variable | Required | Description | Expected Shape | Default |
---|---|---|---|---|
CW_CLIENT_ID | true | Your ConnectWise Developer Client ID | string | |
CW_CODE_BASE | false | Your ConnectWise instance codebase - in most cases, this is "v4_6_release", and defaults to this. You can provide this variable to override the default if necessary | string | v4_6_release |
CW_COMPANY_URL | true | The URL for your ConnectWise instance, used for API calls | string |
Variable | Required | Description | Expected Shape | Default |
---|---|---|---|---|
SMS_PROVIDER | false | The SMS provider to use. Currently only supports Twilio or SmsBroadcast | twilio or smsbroadcast | smsbroadcast |
SMSBROADCAST_USERNAME | true if SMS_PROVIDER is set to smsbroadcast | Your SmsBroadcast username | string | |
SMSBROADCAST_PASSWORD | true if SMS_PROVIDER is set to smsbroadcast | Your SmsBroadcast password | string | |
SMSBROADCAST_FROM | true if SMS_PROVIDER is set to smsbroadcast | The from label for your messages | string | |
TWILIO_AUTH_TOKEN | true if SMS_PROVIDER is set to twilio | Your Twilio auth token | string | |
TWILIO_ACCOUNT_SID | true if SMS_PROVIDER is set to twilio | Your Twilio account SID | string | |
TWILIO_PHONE_NUMBER | true if SMS_PROVIDER is set to twilio | The phone number to use for sending | string |
Variable | Required | Description | Expected Shape | Default |
---|---|---|---|---|
NEXT_PUBLIC_ENABLE_COOLDOWNS | false | Enables a cooldown timer on sending messages to prevent misuse, accidental double-clicks, etc. | true or false | true |
NEXT_PUBLIC_COOLDOWN_TIMER | false | How long the cooldown should be (in seconds) | number | 30 |
SMS_AUTH_MSG | false | The template to use for authentication messages. Can be changed to whatever you like, as long as it includes the {code} token |
string containing {code} |
Hi! Your auth code is {code}. |
This is a NextJS application and is provided as-is. It's up to you to build and serve it on whichever platform you'd like. We use bun as our package manager - the below instructions can be adapted to whichever package manager you'd prefer (npm, pnpm, yarn)
git clone https://github.com/HealthITAU/textwise.git
bun install
bun dev
bun build
- Navigate to System > Setup Tables > Manage Hosted API in ConnectWise Manage
- Create a new entry with the + button
- Configure as follows:
- Description should be TextWise (or whatever you'd prefer)
- Screen must be Service Ticket
- Origin must be *
- URL must be set to the URL where you're hosting the pod - for example, https://mywebsite.com/pod?id=[cw_id]&screen=[cw_screen]
- It is essential you include
?id=[cw_id]&screen=[cw_screen]
after the URL. The pod will not work unless you do so.
- It is essential you include
- Out of Tab or Pod, select Pod
- Set Pod Height to whatever you like - we think 256 looks great!
- Optionally enable Location Restrictions
Contributions to the project are welcome. If you find any issues or have suggestions for improvement, please feel free to open an issue or submit a pull request.
❤️ the project and would like to show your support? Please consider donating to either (or both!) of our favourite charities: