Integrations Overview¶
Leanmote integrates with 20+ development and collaboration tools to provide comprehensive engineering analytics.
Supported Integrations¶
Source Control¶
| Platform | OAuth | Webhooks | Data Collected |
|---|---|---|---|
| GitHub | Yes | Yes | Repos, commits, PRs, reviews, comments |
| GitLab | Yes | Yes | Projects, MRs, discussions, approvals |
| Bitbucket | Yes | No | Repos, commits, PRs |
| Azure DevOps | Yes | Yes | Repos, commits, PRs |
Project Management¶
| Platform | OAuth | Webhooks | Data Collected |
|---|---|---|---|
| Jira | Yes | Yes | Projects, issues, sprints, history |
| Linear | Yes | Yes | Teams, issues, cycles |
| ClickUp | Yes | Yes | Spaces, lists, tasks |
| Monday.com | Yes | Yes | Boards, items, updates |
| Notion | Yes | Yes | Databases, pages |
| Azure DevOps Boards | Yes | Yes | Work items, sprints |
Communication¶
| Platform | OAuth | Webhooks | Data Collected |
|---|---|---|---|
| Slack | Yes | Yes | Channels, messages, reactions |
| Discord | Yes | No | Servers, channels, messages |
Calendar¶
| Platform | OAuth | Webhooks | Data Collected |
|---|---|---|---|
| Google Calendar | Yes | No | Events, attendees, duration |
AI Tools¶
| Platform | OAuth | API | Data Collected |
|---|---|---|---|
| GitHub Copilot | N/A | Yes | Usage metrics, completions |
| Claude Code | N/A | OTLP | Sessions, tokens, commands |
Integration Architecture¶
OAuth Flow¶
1. User clicks "Connect {Platform}"
2. Redirect to provider's OAuth consent screen
3. User authorizes Leanmote
4. Provider redirects to callback URL with auth code
5. Leanmote exchanges code for access/refresh tokens
6. Tokens encrypted and stored in user_apps_credentials
7. Initial data sync triggered
Data Synchronization¶
Pull-based (Cron): - Scheduled jobs fetch data from provider APIs - Incremental sync using last_update timestamps - Results stored in normalized tables
Push-based (Webhooks): - Provider sends events in real-time - Lambda validates and processes events - Immediate database updates
Token Refresh¶
OAuth tokens are automatically refreshed:
- Access tokens: Short-lived (1 hour typically)
- Refresh tokens: Long-lived (30-90 days)
- Automatic refresh before expiration
- Failed refresh triggers re-authorization prompt
Connecting an Integration¶
Step 1: Navigate to Integrations¶
- Log in to Leanmote
- Go to Settings > Integrations
- Find the platform you want to connect
Step 2: Authorize Access¶
- Click "Connect"
- Authorize Leanmote on the provider's consent screen
- Select the resources to share (repos, projects, etc.)
- Click "Authorize"
Step 3: Configure Data Sources¶
- After authorization, select which resources to track
- For GitHub: Choose repositories
- For Jira: Choose projects
- For Slack: Choose channels
- Click "Save Configuration"
Step 4: Initial Sync¶
- Leanmote queues initial data extraction
- Progress shown in Integration Status
- Historical data imported based on plan limits
- Ongoing sync begins automatically
Data Mapping¶
User Identity Mapping¶
Leanmote maps user identities across platforms:
| Platform | User Identifier |
|---|---|
| GitHub | username, email |
| GitLab | username, email |
| Jira | account ID, email |
| Slack | user ID, email |
Mapping is stored in user_apps_mapping table.
Interaction Recording¶
Cross-platform interactions are normalized:
| Source | Interaction Type |
|---|---|
| PR comment | Code review |
| MR approval | Code review |
| Slack mention | Communication |
| Jira assignment | Task assignment |
Rate Limits¶
Each provider has API rate limits:
| Provider | Rate Limit | Reset |
|---|---|---|
| GitHub | 5000/hour | Hourly |
| GitLab | 1000/hour | Hourly |
| Jira | 1000/hour | Hourly |
| Slack | Varies | Per endpoint |
Leanmote throttles requests to stay within limits.
Troubleshooting¶
Connection Failed¶
- Check OAuth credentials are correct
- Verify redirect URI matches exactly
- Ensure required scopes are granted
- Check provider status page
Data Not Syncing¶
- Check Integration Status for errors
- Verify credentials haven't expired
- Check cron job logs
- Ensure selected resources exist
Missing Historical Data¶
- Initial sync may take time
- Check plan limits for history depth
- Verify resource was active during period
Security¶
Token Storage¶
- Tokens encrypted at rest
- Stored in
user_apps_credentialstable - Accessed only during sync operations
Permissions¶
Each integration requests minimal required scopes:
| Platform | Scopes |
|---|---|
| GitHub | repo (read), user (read) |
| GitLab | read_api, read_user |
| Jira | read:jira-work, read:jira-user |
| Slack | channels:read, users:read |
Data Retention¶
- Active integrations: Data synced continuously
- Disconnected integrations: Historical data retained
- Account deletion: All data permanently removed