A Powerful Laravel Help Desk and Lead Management App

Last update: May 24, 2022

Handesk

Description

Handesk has been created by our need (At Revo Systems www.revo.works) to have a powerful yet simple Ticketing system, we needed a system that allowed us to have multiple teams, with multiple users, easy and efficient reporting by all/team/user as well as lead management.

Landing page: http://handesk.io

Check out the screenshots to see how nice it looks, and feel free to contribute by sending us PRs. We will keep adding features as we need them, but our basic workflow is totally covered :D

Features

  • Email polling (new tickets and tickets updates)
  • Email attachments as ticket attachments (using laravel storage driver)
  • API for creating/updating/fetching tickets/leads so you can display them into your main app
  • Instant email/slack notifications when tickets are created/updated
  • Everything is unlimited
  • Lead management (With its API as well)
  • Auto lead subscription to mailChimp based on its tags
  • Tickets reporting
  • Tickets internal notes
  • Tickets can be escalated, so assistants can comment on them to help the teams
  • Can merge tickets
  • Mention agents with @name so they get notified
  • Lead tasks, that can have a due date, and sending daily tasks email
  • Create issues to your code repository directly from the ticket
  • Updating the ticket automatically when an issue is marked as resolved
  • UI multi language support (default en, alternative ca, de, fr, es)
  • Roadmap module, you can create ideas that come from your customers or your own, give them deadlines and integrate them with your repository manager, you can even create ideas from support tickets so you never lose track.
  • You can also create ideas by sending an email to you support accounts starting with Idea: it will create an idea instead of a ticket
  • Ticket rating, when a ticket is solved a rating email is sent to the customer (check config/handesk.php to disable it)

Follow us on twitter [@codepassionapp(https://twitter.com/codepassionapp) to stay tuned

Installation

Its very simple, you just need to follow the standard Laravel installation

git clone https://github.com/BadChoice/handesk.git
cd handesk
composer install
# Setup your .env file to match your desired database
php artisan key:generate

# Purge the cache before running migrations
php artisan config:cache
php artisan config:clear

# Run migrations and seed
php artisan migrate --seed
php artisan storage:link #if you use the local driver

Alternatively, you can use the following docker setup

The default admin user is [email protected] / admin If you want email pulling, you need to enable the imap extension on php (note that on mac the php-cli runs very slow, you need to update your /etc/hosts file

::1         localhost YourMac.local
127.0.0.1   localhost YourMac.local

Open your app/Console/Kernel.php to update the schedulers as you want (comment them if not needed) Add the cron job * * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

Further configuration

Email pulling

Enter your mail credentials in .env

MAIL_FETCH_HOST=pop3.handesk.com
MAIL_FETCH_PORT=110
[email protected]
MAIL_FETCH_PASSWORD=secret-password

Sidebar

You can toggle the visibility of leads and ideas in the config/handesk.php file.

'leads'    => env('HANDESK_LEADS_ENABLED', true),
'roadmap'  => env('HANDESK_ROADMAP_ENABLED', true),

Mailchimp

Set your mailchimp key in .env MAILCHIMP_API_KEY=448027f3acac5594605be3adf78be862-us15

And enter the relation of tags => list id in config/services.php mailchimp section

Bitbucket

You can create issues directly to your code repository from tickets. You need to setup your credentials in the .env

BITBUCKET_USER=bitbucket-user-if-using-basic-auth
BITBUCKET_PASSWORD=bitbucket-password-if-using-basic-auth

And enter your repositories list in config/issues.php file, filling the repositories field.

You can event update the tickets automatically (adding a private note using bitbucket webhooks). You just need to go to your report webhooks settings and add a new webhook with the url

http://{handesk.io}/webhook/bitbucket

You just need to check the issues updated option

Api Token

Set your desired API token in the .env

API_TOKEN=the-api-token

We have the following SDK's to easily interact with Handesk api There is the badchoice/handesk-php package in packagist to easily talk with the api. Handesk-php Handesk-ios In progress

Screenshots

Tickets screenshot Ticket screenshot Leads screenshot Lead screenshot Invitation screenshot Email screenshot

Community

We have a slack channel at https://handesk.slack.com/ And you can join with the following invitation

Join in with the following link

Join handesk slack

Or you can follow me on twitter too [@codepassionapp(https://twitter.com/codepassionapp)

Development

We try to follow a TDD approach as well as some mixed functional CSS for the frontend.

PRs are welcome!

License

Handesk is open-sourced software licensed under the MIT license.

Special thanks to Jetbrains for their support to open source projects!

GitHub

https://github.com/BadChoice/handesk
Comments
  • 1. reply to solved tickets can get lost

    To-Reproduce: Customer sends email Will get notification about ticket created - fine :) Supporter is writing answer and mark ticket as solved.

    Customer don't think so and will reply

    Supporter will not se the reply because it's listed under solved ... this will be a little show stopper ;) Support will not react ...

    Version: current master

    Possible solution: if ticket is in solved list and customer replys ticket will get back to pending state

    Maybe related to issue #22

    Reviewed by marco-aa at 2017-09-14 10:50
  • 2. PSR-2

    Image

    Believe it or not, I'm all #teamBracesInSameLine (second type). Unfortunately that's not the path that PSR-2 chose.

    After working with some open sources projects (and Laravel source code itself), I learned to deal with it. PSR-2 does make code more readable from a world-wide perspective. If you get used to reading PSR-2 formatted code, you can read anybody's PSR-2 formatted code in the world.

    Anyway, the point of this topic is to say I hope you guys don't mind my PRs with PSR-2 code-style. PHPStorm will automatically format code for me that way.

    Reviewed by deleugpn at 2017-09-08 09:23
  • 3. No emails on new tickets for supporting crew

    I don't get emails notifying me that I have a new ticket. The requester does get a mail but the support team (2 users) don't get any. Log file is empty/not even created and the users have all notifications active.

    any idea what might have happened here?

    Reviewed by lucidlemon at 2018-08-06 08:02
  • 4. Integrity constraint violation: 1048 Column 'body' cannot be null

    Possible Bug - maybe i can fix it the next days but today im running low in time ;)

    Steps to reproduce:

    • Write a Email to support from extern
    • Cron Job will pull Email
    • Cron Job will fail s. Stack-Trace

    Possible Solution: App\Jobs\CreateTicketsFromNewEmails while process uses $message-text but with php-imap library it will be ->textPlain or ->textHtml s. Mailbox.php in vendor folder

     if($partStructure->type == 0 && $data) {
                                    if(strtolower($partStructure->subtype) == 'plain') {
                                            $mail->textPlain .= $data;
                                    }
                                    else {
                                            $mail->textHtml .= $data;
                                    }
                            }
                            elseif($partStructure->type == 2 && $data) {
                                    $mail->textPlain .= trim($data);
                            }
    

    Stack-Trace:

    Next Illuminate\Database\QueryException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'body' cannot be null (SQL: insert into `tickets` (`title`, `body$
    Stack trace:
    #0 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php(607): Illuminate\Database\Connection->runQueryCallback('insert into $
    #1 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php(450): Illuminate\Database\Connection->run('insert into `ti...', Arra$
    #2 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php(404): Illuminate\Database\Connection->statement('insert into `ti...'$
    #3 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/Processor.php(32): Illuminate\Database\Connection->insert('insert $
    #4 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2133): Illuminate\Database\Query\Processors\Processor->processIns$
    #5 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1251): Illuminate\Database\Query\Builder->insertGetId(Array, '$
    #6 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(688): Illuminate\Database\Eloquent\Builder->__call('insertGetId'$
    #7 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(653): Illuminate\Database\Eloquent\Model->insertAndSetId(Object($
    #8 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(522): Illuminate\Database\Eloquent\Model->performInsert(Object(I$
    #9 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php(284): Illuminate\Database\Eloquent\Model->save()
    #10 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Support/helpers.php(950): Illuminate\Database\Eloquent\Relations\HasOneOrMany->Illuminate\D$
    #11 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php(285): tap(Object(App\Ticket), Object(Closure))
    #12 /home/forge/handesk.vikinks.com/app/Ticket.php(33): Illuminate\Database\Eloquent\Relations\HasOneOrMany->create(Array)
    #13 /home/forge/handesk.vikinks.com/app/Jobs/CreateTicketsFromNewEmails.php(34): App\Ticket::createAndNotify(Object(App\Requester), 'New ticket: #1:...', NULL, Array)
    #14 /home/forge/handesk.vikinks.com/app/Jobs/CreateTicketsFromNewEmails.php(26): App\Jobs\CreateTicketsFromNewEmails->processMessage(Object(PhpImap\IncomingMail))
    #15 /home/forge/handesk.vikinks.com/vendor/laravel/framework/src/Illuminate/Support/Collection.php(287): App\Jobs\CreateTicketsFromNewEmails->App\Jobs\{closure}(Object$
    #16 /home/forge/handesk.vikinks.com/app/Jobs/CreateTicketsFromNewEmails.php(28): Illuminate\Support\Collection->each(Object(Closure))
    #17 [internal function]: App\Jobs\CreateTicketsFromNewEmails->handle(Object(App\Services\Pop3\Mailbox))
    
    Reviewed by marco-aa at 2017-08-22 07:33
  • 5. create issue button

    If we don't use bitbucket we should remove the button.

    I change the issue.blade.php with the following line at the beginning @if(strcmp(config('issues.credentials.key'),'the-bitbucket-key-if-using-oauth') !== 0)

    and ending with an other @endif

    I know that the condition is not really good but when I made the first copy of the .env.example is the string you had inside for credentials.key

    Should be better to use a switch inside the .env and issue config file to check if we have any issue addon activated.

    As I know that I'm not going to use it for now, I'll let it like that.

    I'm not making any PR because It's now an optimal solution but at least my agents are not getting errors when they press the button ;)

    Thanks for all!

    Reviewed by antton at 2017-10-11 16:45
  • 6. Getting 500 Internal Server Error when trying to view the attachement in the ticket

    When a customer attaches an image, when trying to view the attachment, I'm getting 500 internal server error message.

    The attachment appears in this folder mysite/storage/attachments/9_tickets.PNG

    Is this a something on my end?

    Reviewed by pavlenex at 2018-04-03 15:50
  • 7. Integrity constraint violation: 1048 Column 'name' cannot be null

    Today the polling of emails stopped working.

    I checked the log files and found a DB Exception i guess the Email from the customer is correct but it did not contain a Name.

    Next Illuminate\Database\QueryException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null (SQL: insert intorequesters(email,na me,updated_at,created_at) values ([email protected], , 2017-09-19 07:51:02, 2017-09-19 07:51:02)) in /home/forge/....../vendor/laravel/framework/src/ Illuminate/Database/Connection.php:647

    Reviewed by marco-aa at 2017-09-19 07:55
  • 8. Parse error: syntax error, unexpected '@'

    After I the installation I get the error message "Parse error: syntax error, unexpected '@'". Full error message can be viewed at http://desk.lhenriksson.se/tickets

    Looks like maybe a problem with the blade template?

    Or have I made something stupid? :)

    Reviewed by lhenriksson at 2017-09-08 06:48
  • 9. Users endpoint

    I saw this ticket system and seems perfect for my needs. The big problem is how to integrate my payment system to handesk when they pay. Right now I have another helpdesk and they have endpoints to create users but this one miss this feature. There are in case other ways to create users and disable the create accounts page?

    Reviewed by Mte90 at 2019-06-14 14:49
  • 10. Team ticket overview

    SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'team_id' in where clause is ambiguous (SQL: select count(*) as aggregate fromticketsinner joinmembershipsontickets.team_id=memberships.team_idwherememberships.user_id= 2 andstatus< 4 andteam_id= 2 andtickets.deleted_atis null) (View: handesk/vendor/badchoice/thrust/src/resources/views/index.blade.php)

    Getting this error when a ticket is assigned to a team (id 2 in this case), using an account that is in team (id2) and browsing to /tickets?team_id=2

    Reviewed by Onurrr at 2019-01-17 21:06
  • 11. HANDESK CONFIG: NEW TICKET FROM EMAILS

    Hi, everybody,

    Im new handesk user. So i have a question, i think it is a silly one but i just cant figure out, so we’re going to appreciate if you could help us.

    Well!, we were trying you awesome Helpdesk platform, which it is great, and fit to our needs. But after installing, and configuring it, we realize that when we send an email to our support email account, the Handesk does not create the new ticket.

    I read: Email polling (new tickets and tickets updates) and we understand that this feature make possible that when a costumer send us an email to out support email the system create and open a new ticket or it isnt?.

    Could you help us.

    Thank in advance,

    Reviewed by CarlosVillagra at 2018-11-26 13:36
  • 12. Bump guzzlehttp/psr7 from 1.8.2 to 1.8.5

    Bumps guzzlehttp/psr7 from 1.8.2 to 1.8.5.

    Release notes

    Sourced from guzzlehttp/psr7's releases.

    1.8.5

    See change log for changes.

    1.8.4

    See change log for changes.

    1.8.3

    See change log for changes.

    Changelog

    Sourced from guzzlehttp/psr7's changelog.

    1.8.5 - 2022-03-20

    Fixed

    • Correct header value validation

    1.8.4 - 2022-03-20

    Fixed

    • Validate header values properly

    1.8.3 - 2021-10-05

    Fixed

    • Return null in caching stream size if remote size is null
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    Reviewed by dependabot[bot] at 2022-03-29 22:26
  • 13. Docker compose up not working

    I'm trying to take a look at this software but when doing docker-compose up --build only mysql is starting. For nginx I'm getting nginx_1 | nginx: 1: nginx: /entrypoint.sh: Permission denied and for handesk php-fpm_1 | /bin/sh: 1: /start.sh: not found

    Reviewed by Mistic92 at 2021-12-06 09:46
  • 14. ErrorException

    Hi, I just installed Handesk. When I try to create a new ticket, I receive this error

    1/1) ErrorExceptionTrying to access array offset on value of type null
    --
    in Parser.php (line 147)
    at HandleExceptions->handleError(8, 'Trying to access array offset on value of type null', '/private/private/private.org/Tickets2/vendor/egulias/email-validator/EmailValidator/Parser/Parser.php', 147, array('previous' => null))in Parser.php (line 147)
    at Parser->escaped()in Parser.php (line 127)
    

    Let me know what else is needed for you to debug or troubleshoot.

    Reviewed by SDCode1 at 2021-11-04 17:20
  • 15. Dependabot couldn't access bitbucket-api-fork

    Reviewed by dependabot-preview[bot] at 2021-08-03 04:19
FreeScout — Free self-hosted help desk & shared mailbox (Zendesk / Help Scout alternative)
FreeScout — Free self-hosted help desk & shared mailbox (Zendesk / Help Scout alternative)

Free Self-Hosted Zendesk & Help Scout Alternative FreeScout is the super lightweight free open source help desk and shared inbox written in PHP7+ (Lar

May 17, 2022
DooTask is a lightweight open source online project task management tool that provides various document collaboration tools, online mind mapping, online flowcharting, project management, task distribution, instant IM, file management and other tools.

DooTask is a lightweight open source online project task management tool that provides various document collaboration tools, online mind mapping, online flowcharting, project management, task distribution, instant IM, file management and other tools.

May 24, 2022
GitScrum is a Project Management Tool, developed to help entrepreneurs, freelancers, managers, and teams Skyrocket their Productivity with the Agile methodology and Gamification.
GitScrum is a Project Management Tool, developed to help entrepreneurs, freelancers, managers, and teams Skyrocket their Productivity with the Agile methodology and Gamification.

GitScrum is a Project Management Tool, developed to help entrepreneurs, freelancers, managers, and teams Skyrocket their Productivity with the Agile methodology and Gamification.

May 20, 2022
This app is designed to help Romanian teenagers and adults with learning

This app is designed to help Romanian teenagers and adults with learning. The app has a lot of good resources to support students in every possible way. The main resource we have are high school lesons. ??

Apr 27, 2022
Powerful, yet easy to use, open-source online ordering, table reservation and management system for restaurants
Powerful, yet easy to use, open-source online ordering, table reservation and management system for restaurants

TastyIgniter provides a professional and reliable platform for restaurants wanting to offer online food ordering and table reservation to their custom

May 17, 2022
mini Project in Laravel and vue js. Real World Laravel 8x + vue js Dashboard.Task management and project management system
mini Project in Laravel and vue js. Real World Laravel 8x + vue js Dashboard.Task management and project management system

mini Project in Laravel and vue js. Real World Laravel 8x + vue js Dashboard.Task management and project management system. Dashboard features such as: Complete Dashboard, Custom Authentication, Email Verification, custom-login-register-forgot password (without jetstream).

Nov 27, 2021
Scrumwala: Your very own Scrum, Agile project management web app - built with Laravel
Scrumwala: Your very own Scrum, Agile project management web app - built with Laravel

Scrumwala Your very own Scrum/Agile web app built with Laravel Features Create and manage projects with plan and work views Group issues in a project

Apr 20, 2022
Hotel Management App using Laravel & Orchid for admin

Hotel Management System Installation Open a terminal session in the project's root. Install dependencies by running the command: composer install Run

Feb 8, 2022
A powerful open source Laravel Blog with WYSWYG and CRUD (Create Read Update Delete) built on Laravel 5.8 and Bootstrap 4
A powerful open source Laravel Blog with WYSWYG and CRUD (Create Read Update Delete) built on Laravel 5.8 and Bootstrap 4

Larablog A powerful open source Laravel Blog with WYSWYG and CRUD (Create Read Update Delete) built on Laravel 5.8 and Bootstrap 4 Table of contents F

May 17, 2022
Health Management App for WTM Buea community to work on during the period of Hacktoberfest

Laravel web application developed by WTM Buea community members Health Care Management App An app that enables users and or patients to get consultati

Oct 28, 2021
A learning management app

TECHADEMIA Techademia is a learning management system. It's an app built to help people learn various technologies from categories such as DevOps, Pro

Mar 9, 2022
A powerful and responsive blog system powered by laravel 5.5.
A powerful and responsive blog system powered by laravel 5.5.

Powerful and responsive blog system powered by laravel 5.5. Click https://lufficc.com/blog to view live demo. Xblog 中文 README | Docs This blog is for

May 22, 2022
Open source ERP software. Built on modern PHP and bootstrap 4. Easy and powerful.

FacturaScripts Open source ERP software. Built on modern PHP and bootstrap 4. Easy and powerful. Install Clone and deploy with composer and npm (compo

May 16, 2022
Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS powered by PHP, Markdown, Twig, and Symfony

Grav Grav is a Fast, Simple, and Flexible, file-based Web-platform. There is Zero installation required. Just extract the ZIP archive, and you are alr

May 14, 2022
DaybydayCRM an open-source CRM, to help you keep track of your daily workflow.
DaybydayCRM an open-source CRM, to help you keep track of your daily workflow.

====================== DaybydayCRM is an everyday customer relationship management system (CRM) to help you keep track of your customers, tasks, appoi

May 17, 2022
Remindle is here to help you remember. Remember everything you want, by the means you prefer, in the frequency you like

platform Personal reminders About Remindle Remindle is a platform which helps you to remember all important events. You can set the means you’d like t

Dec 23, 2021
A PHP based web application to help manage your postmortems
A PHP based web application to help manage your postmortems

morgue a safe place for all your postmortem data Overview This is a PHP based web application to help manage your postmortems. It has a pluggable feat

Apr 15, 2022
Cachet is a beautiful and powerful open source status page system.
Cachet is a beautiful and powerful open source status page system.

Cachet is a beautiful and powerful open source status page system. Overview List your service components Report incidents Customise the look of your s

Dec 5, 2021
NamelessMC is a free, easy to use & powerful website software for your Minecraft server
NamelessMC is a free, easy to use & powerful website software for your Minecraft server

NamelessMC - v2 pre-release 10 NamelessMC is a free, easy to use & powerful website software for your Minecraft server, which includes a large range o

May 21, 2022