This plugin integrates osTicket with Kanboard by calling the Kanboard API when tickets are created, assigned, put on hold, or closed.
- Department-based Routing: Map osTicket departments to specific Kanboard projects
- Automatic Task Creation: Creates Kanboard tasks when tickets are created via email or web
- Username Mapping: Automatically assigns tasks to Kanboard users with matching usernames
- Status Synchronization: Moves tasks to done column and closes them when tickets are resolved/closed
- JSON-RPC API Integration: Uses Kanboard's native JSON-RPC API
- Duplicate Prevention: Won't create duplicate tasks or process closed tickets
- osTicket v1.10.0 or later (tested on v1.18.2, but older versions should work)
- Kanboard instance with API access
- PHP with cURL support
- Matching usernames between osTicket staff and Kanboard users (for assignment feature)
-
Copy the plugin files to your osTicket plugins directory:
include/plugins/ostKanboard/ ├── config.php ├── plugin.php └── ostKanboard.php -
Set appropriate file permissions so the web server can read the files:
bash chmod 644 include/plugins/ostKanboard/*.php -
Navigate to Admin Panel → Manage → Plugins
-
Click "Install" next to "osTicket Kanboard Plugin"
-
After installation, click on the plugin name to configure it
After installing the plugin, you need to enable it, then create and configure an instance:
- Go to Admin Panel → Manage → Plugins
- Click on "osTicket Kanboard Plugin"
- Click the "Instances" tab
- Click "Add New Instance"
- Give it a name (e.g., "Default") and set Status to "Active"
Kanboard API URL Enter your Kanboard JSON-RPC API endpoint URL.
Example: http://kanboard.domain.com/jsonrpc.php
Kanboard API Key Enter your Kanboard API key. You can generate this in Kanboard:
- Go to Settings → API
- Copy the API token and paste it here
The plugin will authenticate using username jsonrpc and your API key as the password.
Map osTicket department IDs to Kanboard project and column IDs. Each mapping should be on its own line in the format:
dept_id:project_id:new_column_id:done_column_id:blocked_column_id:wip_column_id
Example Configuration:
1:1:2:1
2:3:2:5
5:1:2:1
6:1:2:1:5:3
This configuration means:
- Department 1 → Project 1, new tickets go to column 2, closed tickets to column 1
- Department 2 → Project 3, new tickets go to column 2, closed tickets to column 5
- Department 5 → Project 1, new tickets go to column 2, closed tickets to column 1
- Department 6 → Project 1, new tickets go to column 2, closed tickets to column 1, on hold tickets to column 5, Work In Progress (Open) to column 3
Blocked Column Id and WIP Column Id are optional.
Finding Department IDs:
- Go to Admin Panel → Manage → Departments
- Click on a department and look at the URL:
?id=Xwhere X is the department ID
Finding Kanboard Project and Column IDs:
- In Kanboard, go to your project
- Look at the URL for the project ID
- For column IDs, use the Kanboard API:
curl -v http://kanboard.domain.com/jsonrpc.php -u "jsonrpc:{API Token}" -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"getColumns","id":1,"params":[1]}'
The "params" value is the Project ID. This will return a JSON object of all columns in Project 1. you are looking for the value of "id".
Set the default swimlane ID for tasks. Use 0 for the default swimlane.
When a new ticket is created (via email or web) in a mapped department:
- Checks if a task already exists in Kanboard with this ticket number (prevents duplicates)
- Skips creation if ticket is already closed/resolved
- Calls
createTaskJSON-RPC method - Creates a new task in the corresponding Kanboard project
- Places it in the configured "new" column
- Maps priority and description
- Task is created unassigned (assignment happens separately)
When a ticket is assigned to a staff member:
- Searches for the task by reference (ticket number)
- Gets the staff member's username from osTicket
- Calls
getUserByNameto find the matching Kanboard user - If user exists in Kanboard, calls
updateTaskto assign the task - If user doesn't exist in Kanboard, assignment is skipped
- Note: Staff usernames in osTicket must match usernames in Kanboard
When a ticket status is set to "On Hold":
- Searches for the task by reference (ticket number)
- If task exists, calls
moveTaskPositionto move to "blocked" column - If task doesn't exist (e.g., old tickets), does nothing (won't create it)
When a ticket status is set to "Open":
- Searches for the task by reference (ticket number)
- If task exists, calls
moveTaskPositionto move to "Work In Progress" column - If task doesn't exist (e.g., old tickets), does nothing (won't create it)
When a ticket status is set to "Resolved" or "Closed":
- Searches for the task by reference (ticket number)
- If task exists, calls
moveTaskPositionto move to "done" column - Calls
closeTaskto mark as closed in Kanboard - If task doesn't exist (e.g., old tickets), does nothing (won't create it)
The plugin uses the following Kanboard JSON-RPC API methods:
createTask- Creates a new taskupdateTask- Updates task properties (used for assignment)moveTaskPosition- Moves a task to a different columncloseTask- Closes a taskgetAllTasks- Retrieves all tasks from a project (used to find tasks by reference)getUserByName- Finds a Kanboard user by username (used for assignment)
- Assignment only works if the osTicket staff username matches a Kanboard username exactly
- If a matching user isn't found in Kanboard, the task remains unassigned
- Tasks are initially created unassigned, even if the ticket has an assignee
- The plugin tracks tickets it has created to prevent duplicates
- Checks Kanboard for existing tasks before creating new ones
- Won't create tasks for tickets that are already closed/resolved
- If you close a ticket that was created before the plugin was installed, it won't create a task in Kanboard
- Only new tickets (created after plugin installation) will be synced
- API calls only fire for mapped departments: If a department is not in your mapping configuration, no API call will be sent
- Error Logging: Check your osTicket error logs for any API issues or unmapped department notifications
- Priority Mapping:
- Low (1) → Green, Priority 0
- Normal (2) → Yellow, Priority 1
- High (3) → Orange, Priority 2
- Emergency (4) → Red, Priority 2
- Verify the API URL is correct (should end with
/jsonrpc.php) - Check that your API key is valid in Kanboard Settings → API
- Check osTicket system logs (Admin Panel → Dashboard) for API error messages
- Ensure your osTicket server can reach the Kanboard server
- Test the API manually using curl:
curl -u "jsonrpc:YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"getVersion","id":1}' \
http://kanboard.domain.com/jsonrpc.php- Check that the department has a mapping configured in the plugin instance
- Verify the project_id exists in Kanboard
- Verify the column_id exists in that project
- Check osTicket system logs for error messages
- Ensure the plugin instance is enabled (Admin Panel → Manage → Plugins → Instances)
- The plugin searches for tasks by reference (ticket number)
- Ensure the ticket number format matches what's in Kanboard's reference field
- Check that
getAllTasksAPI method works for your Kanboard version - Look for "Could not find Kanboard task" messages in logs
- Verify staff usernames in osTicket match usernames in Kanboard exactly
- Test with
getUserByNameAPI call:
curl -u "jsonrpc:YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"getUserByName","id":1,"params":{"username":"staffusername"}}' \
http://kanboard.domain.com/jsonrpc.php- If user is not found, create the user in Kanboard or adjust the username
- This should not happen with the current version
- If it does, check that the plugin is properly tracking created tickets
- Verify that
getAllTasksis returning tasks with the reference field populated
- Ensure Email Fetching is enabled (Admin Panel → Emails → Settings)
- Check that the cron job is running (auto-cron or external cron)
- Plugin works with both IMAP polling and email piping
- Check Apache/PHP error logs during email fetch
- Ensure you created a plugin instance (not just enabled the plugin)
- Go to Admin Panel → Manage → Plugins → osTicket Kanboard Plugin → Instances
- Create an instance if one doesn't exist
- Configure settings in the instance, not the main plugin page
Run this SQL query on your osTicket database:
SELECT dept_id, dept_name FROM ost_department;Create a test ticket in a mapped department and check:
- osTicket error logs for any plugin errors
- Kanboard for the new task
- Your web server access/error logs