The project Integrations tab connects one project to other systems:
- Outgoing webhooks push project events (task created, sprint started, document created…) to an HTTPS endpoint you own, signed so the receiver can trust them.
- Incoming webhook tokens let an outside system (a form tool, GitHub, a script) create tasks or comments in the project.
- Public API tokens give another system scoped, read or write access to the project's tasks and time through the SolaProjects API.
- Native provider readiness shows ready-made connections (Slack, Microsoft Teams, GitHub, GitLab, Google Calendar, Google Drive, OneDrive, Zapier / IFTTT) and whether each can be connected.
Use it when a project needs to talk to another tool — for example to post task updates to a client dashboard, or to turn website enquiries into tasks. Project managers and administrators set it up; it is usually done once per project with your IT contact.
Two pages are called Integrations. This page covers the project tab. The Integrations item in the Workspace part of the sidebar (
/projects/settings/integrations) is the organization's SolaCount connection — see Organization SolaCount connection below and Budget and finance.
Where to find it
| Sidebar | Project section → Integrations (between Automations and AI) |
| URL | /projects/{project}/integrations |
| Command palette | Integrations · {project name} under Current project |
Who sees it:
- Plan: integrations are a Premium-plan feature (also Enterprise). On lower plans the tab is hidden. If a paid plan lapses, the tab disappears and webhooks stop being offered until you renew.
- Role: only people who can edit the project can load the tab (see Permissions). Others see "We couldn’t load integrations." with Retry.
Screen tour
Header card
Integrations — Outgoing webhooks, incoming tokens, and delivery history.
| Tile | Meaning |
|---|---|
| Outgoing | Active outgoing webhooks. |
| Incoming tokens | Active, unrevoked incoming tokens. |
| Recent deliveries | Delivery attempts listed in Recent deliveries. |
| Failed deliveries | Failed attempts among them (red when above zero). |
Outgoing webhooks card
POST project events to an external HTTPS endpoint, signed with HMAC-SHA256. New webhook at the top-right.
Each webhook card shows the name, endpoint URL, a status badge (Active, Disabled or Archived), one chip per subscribed event, and {n} deliveries · {n} failed. Row actions (not on archived webhooks): Edit, Test, Rotate secret, Archive.
Empty state: No outgoing webhooks — Create one to push events to an external system.
Incoming webhook tokens card
Let external systems create tasks/comments by POSTing with a secret token. New token at the top-right.
Each token card: name, provider (Custom or GitHub) · last used {date} or never used, badge Active, Inactive or Revoked. Actions (not on revoked tokens): Rotate, Revoke.
Empty state: No incoming tokens — Create a token to accept inbound webhooks.
Public API card
Create scoped bearer tokens for documented project, task and time-entry endpoints. Buttons: Docs (opens the OpenAPI reference in a new tab) and New token.
Each token card: name, last used {date} / never used, status badge, one chip per ability. Actions: Rotate, Revoke.
Empty state: No API tokens — Create a token for the public API.
Recent deliveries card
Outgoing delivery attempts and their outcome. Badge with the count.
| Column | Meaning |
|---|---|
| When | Date of the delivery. |
| Webhook | Webhook name, or Archived webhook. |
| Event | Event type, e.g. task.status_changed. |
| Status | Delivered (green), Pending (amber, waiting or retrying), Failed (red), Skipped. |
| Attempts | How many times SolaProjects has tried. |
| Response | The HTTP status code returned by your endpoint, error when no response was received, or —. |
| (button) | Retry on any delivery that is not delivered. |
Empty state: No deliveries yet — Delivery attempts appear here once an event fires or you send a test.
Native provider readiness card
Connection state and setup prerequisites for provider-specific integrations. One tile per provider:
| Provider | What it does |
|---|---|
| Slack | Send project notifications to Slack and receive task commands from Slack. |
| Microsoft Teams | Send project notifications to Teams channels and support Teams actions. |
| GitHub | Link repository events, issues, pull requests and commits to project tasks. |
| GitLab | Link GitLab merge requests, issues and pipeline events to project tasks. |
| Google Calendar | Sync project milestones and task dates to Google Calendar. |
| Google Drive | Attach or sync project documents with Google Drive folders. |
| OneDrive | Attach or sync project documents with OneDrive folders. |
| Zapier / IFTTT | Expose SolaProjects triggers and actions to no-code platforms. |
Each tile shows a status (Available, Pending, Active, Failed), the capability, and either Live provider configuration detected. or Local simulator is available; production credentials are activation settings. (the provider is not yet live for your organization). It may also show Blocked by missing setup: …, Activation notes: …, OAuth callback pending., Last error: …, the last message or last event received.
Events you can send
Tick one or more on the webhook form:
| Event | Sent when |
|---|---|
task.created |
A task is created (including from an incoming webhook). |
task.updated |
A task is edited. |
task.status_changed |
A task's status changes. |
task.completed |
A task is marked done. |
task.blocked |
A task is marked blocked. |
comment.created |
A task comment is added. |
doc.created |
A project document is created. |
time_entry.created |
Time is logged. |
milestone.completed |
A milestone is completed. |
sprint.started / sprint.completed |
A sprint starts / completes. |
share_link.created |
A guest share link is created. |
automation.run_failed / automation.rule_failed |
An automation run fails. |
ai.suggestion_applied |
An AI suggestion is applied. |
Each request is a JSON POST with headers X-SolaProjects-Event (event type), X-SolaProjects-Delivery (delivery id) and X-SolaProjects-Signature (HMAC-SHA256 of the raw body with your signing secret), and User-Agent: SolaProjects-Webhooks/1.0. Verify the signature before trusting a request.
Retries. A failed delivery is retried automatically after about 1, 5, 15 and 60 minutes; after the fifth attempt it stays Failed. Use Retry to try again by hand.
Tasks
Create an outgoing webhook
-
Open the project → Integrations → New webhook.
-
Fill in New outgoing webhook:
Field Required Rules / defaults Notes Name Yes Up to 160 characters. e.g. Client dashboard. Endpoint URL (HTTPS) Yes Valid URL, up to 2,048 characters, public HTTPS. Placeholder https://example.com/hooks/solaprojects. Local and private-network addresses are refused: "Use a public HTTPS endpoint. Local and private network URLs are blocked."Events Yes At least one. See the table above. Active — Ticked by default. Untick to save it Disabled. -
Click Create. You see Outgoing webhook created. and the Signing secret dialog: "Store this now — it is shown only once and cannot be retrieved later." Click Copy (Copied to clipboard.), store the secret in the receiving system, then Done.
Edit, test, rotate and archive a webhook
| Action | Steps | Result |
|---|---|---|
| Edit | Change name, URL, events or Active → Save. | Outgoing webhook updated. |
| Test | Click Test. | Test delivery queued. A row appears in Recent deliveries. |
| Rotate secret | Confirm Rotate secret — "The current secret will stop working. Update connected services with the new secret." | Secret rotated. and the new secret is shown once. |
| Archive | Confirm Archive webhook — "This outgoing webhook will stop delivering project events." | Webhook archived. Badge Archived; no more deliveries; history kept. |
Create an incoming webhook token
- Click New token on Incoming webhook tokens.
- Name (required, up to 160 characters) and Provider: Custom (default) or GitHub.
- Click Create → Incoming token created. Copy the Incoming webhook token shown once: "Use this as the token in your incoming webhook URL. Shown only once."
The external system then sends POST /api/projects/webhooks/incoming/{token} with a JSON body (limit 60 requests per minute per sender):
| Provider | Body | What happens |
|---|---|---|
| Custom | {"title": "...", "description": "...", "priority": "high"} |
Creates a private task in Todo (priority defaults to medium; title cut at 180 characters). Response includes the new task_key. |
| Custom | {"task_key": "ALN-14", "comment": "..."} |
Adds an internal comment to that task. |
| GitHub | Issue or issue-comment event | An issue becomes a task; a comment on an issue whose title contains a task key (e.g. ALN-14) becomes a comment on that task. |
Anything else is refused with "Webhook rejected."; a revoked or wrong token gets the same answer. Tasks and comments are authored by the person who created the token.
Rotate issues a new token and revokes the old one immediately (Token rotated.). Revoke asks Revoke token — "Requests using this token will no longer have access." → Token revoked.
Create a public API token
-
Click New token on Public API.
-
Name (required, up to 120 characters) and Abilities (at least one;
projects:read,tasks:readandtime:readare pre-ticked):Ability Allows projects:readRead this project. tasks:read/tasks:writeRead / create and update tasks. time:read/time:writeRead / create time entries. -
Create → API token created. Copy the Project API token: "Use this as a Bearer token for /api/v1. Shown only once."
Tasks created through the API fire the same automations and webhooks as tasks created in the app. Rotate → confirm Rotate token ("The current token will stop working. Update connected services with the new token.") → API token rotated. Revoke → API token revoked.
Retry a failed delivery
In Recent deliveries, click Retry on the row → Delivery retried. Check Status and Response after a moment.
Connect a native provider
- On the provider tile pick the channel (e.g. #projects for Slack) and click Connect → {Provider} connection started.
- Complete the authorization dialog {Provider} authorization with Complete callback (or Later) → Native integration connected.
- Once connected, use Send test ({Provider} test message sent.), Refresh ({Provider} refreshed.) or Disconnect ({Provider} disconnected.).
Tiles in simulator mode also show Simulate event and Error for checking the setup before the provider goes live; they do not contact the real service.
Statuses
| Object | Statuses |
|---|---|
| Outgoing webhook | Active, Disabled (saved with Active unticked), Archived |
| Delivery | Pending, Delivered, Failed, Skipped |
| Incoming / API token | Active, Inactive, Revoked |
| Native provider | Available, Pending, Active, Failed |
Permissions
| Role | Open the tab | Create / change webhooks, tokens, providers |
|---|---|---|
| Organization owner | Yes | Yes |
| Projects Administrator | Yes | Yes |
| Projects Manager who is a project Manager here | Yes | Yes |
| Projects Member, project Viewer, guests | No | No |
If integration editing is switched off for your organization, the tab is read-only (no New, row actions or Retry). A refused change shows "Integration edits are disabled or not permitted."; a stale page "Please reload and try again." Secrets and tokens are never shown again after the one-time dialog — not even to owners.
Organization SolaCount connection
The Workspace sidebar item Integrations (/projects/settings/integrations) is a different page. It shows whether SolaProjects is connected to SolaCount (Connected, Ready to connect, Integration paused, Disconnected — history preserved, …), and lets an organization owner or Finance administrator connect, pause, disconnect or check the connection. A single project can opt out on its Settings tab (Integrations card → Internal project / finance disabled). See Budget and finance and the SolaProjects overview.
Worked examples
Example 1 — Enquiries become tasks (everyday)
Sara Khan wants website enquiries for Al Noor Showroom Fit-out (ALN-FIT) to land as tasks.
- New token → Name Website enquiries, Provider Custom → Create; she gives the token to the web developer.
- The website posts
{"title": "Quote request – reception desk", "priority": "high"}. - Task ALN-31 Quote request – reception desk appears in Todo, private, priority High. The token card shows last used Oct 6.
Example 2 — Client dashboard feed with a failure (full scenario)
Omar Haddad connects Al Noor Trading LLC's site dashboard.
| Step | Action | Result |
|---|---|---|
| 1 | New webhook: Site dashboard, https://hooks.alnoor.ae/projects, events task.status_changed, task.completed, milestone.completed. |
Outgoing webhook created.; signing secret copied to the dashboard. |
| 2 | Test. | Test delivery queued.; row Delivered, Response 200. |
| 3 | Sara moves ALN-12 to Done. | Two deliveries: task.status_changed and task.completed, both Delivered. |
| 4 | The dashboard is down for maintenance. | Next delivery shows Pending, then Failed with Response 503; header Failed deliveries 1 in red; it is retried at ~1, 5, 15, 60 minutes. |
| 5 | Dashboard back; Omar clicks Retry. | Delivery retried. → Delivered. |
| 6 | IT suspects the secret leaked. Omar clicks Rotate secret and confirms. | Secret rotated.; new secret shown once; IT updates the dashboard. |
How it connects
| Where | Link |
|---|---|
| Tasks | Incoming tokens and the API create tasks and comments; task changes send events. |
| Planning | Milestone completion and sprint start/complete send events. |
| Automations | Act inside SolaProjects; failed runs can be sent out as events. |
| Guest share links | share_link.created event. |
| AI | ai.suggestion_applied event. |
| Time tracking | time_entry.created event; time API abilities. |
| Settings | Per-project SolaCount finance switch. |
Tips and common problems
| Problem | Cause | Fix |
|---|---|---|
| Tab missing. | Plan below Premium or expired. | Upgrade or renew. |
| Use a public HTTPS endpoint… | URL is http, localhost or a private address. |
Use a public HTTPS URL. |
| Lost a secret or token. | Shown only once. | Rotate and update the other system. |
| Deliveries Failed with a 4xx code. | Your endpoint rejects the request (often signature check). | Check the endpoint uses the current secret. |
| Webhook rejected. on incoming calls. | Revoked/wrong token, or body has no title or task_key + comment. |
Check token and body. |
| Comment not added from GitHub. | Issue title has no task key. | Put the key (e.g. ALN-14) in the issue title. |
| API returns access denied. | Token lacks the ability or is revoked. | Create a token with the right abilities. |
| Provider says Local simulator is available… | Not yet live for your organization. | Ask Solavel support about activation. |