Workfront Event Subscription (Independent Publisher) (Preview)
Custom connector for Adobe Workfront.
This connector is available in the following products and regions:
| Service | Class | Regions |
|---|---|---|
| Copilot Studio | Premium | All Power Automate regions except the following: - US Government (GCC) - US Government (GCC High) - China Cloud operated by 21Vianet - US Department of Defense (DoD) |
| Logic Apps | Standard | All Logic Apps regions except the following: - Azure Government regions - Azure China regions - US Department of Defense (DoD) |
| Power Apps | Premium | All Power Apps regions except the following: - US Government (GCC) - US Government (GCC High) - China Cloud operated by 21Vianet - US Department of Defense (DoD) |
| Power Automate | Premium | All Power Automate regions except the following: - US Government (GCC) - US Government (GCC High) - China Cloud operated by 21Vianet - US Department of Defense (DoD) |
| Contact | |
|---|---|
| Name | P-Product |
| partners@p-product.com |
| Connector Metadata | |
|---|---|
| Publisher | axltweek |
| Website | https://business.adobe.com/products/workfront.html |
| Privacy policy | https://www.adobe.com/privacy.html |
| Categories | Productivity;Collaboration |
Adobe Workfront Event Subscriber Connector
This repository contains a Power Automate custom connector for Adobe Workfront event subscription API.
The connector exposes a trigger for Workfront event subscriptions and handles Workfront authentication inside the custom connector policy script. It supports two authentication modes:
- API key to
sessionIDexchange - JWT exchange to OAuth access token
The trigger creates a Workfront event subscription and receives webhook payloads from Workfront when supported objects are created, updated, or deleted.
Connector idea
The connector is designed to bridge Adobe Workfront event subscriptions into Power Automate.
At a high level it works like this:
- A flow uses the custom trigger
When a Workfront event occurs. - The trigger creates a Workfront event subscription against
/attask/eventsubscription/api/v1/subscriptions. - Power Automate provides the callback URL that Workfront should call.
- Workfront sends event payloads to the flow when matching events happen.
- The policy script in script.csx converts connector credentials into the authentication artifacts expected by Workfront.
Supported authentication modes:
api-auth: uses a Workfront API key and exchanges it forsessionIDjwt-exchange: signs a JWT with an RSA private key, exchanges it for an access token, and sends that token to Workfront assessionID
How to set up Workfront
General prerequisites
- You must know your Workfront domain, for example
mycompany.my.workfront.com - The user behind the connector must have enough rights to work with Event Subscriptions
- For Event Subscription API operations, Adobe documents that a Workfront administrator account is required
- Your Power Automate callback endpoint must be reachable by Workfront
Adobe Workfront documentation:
- Event Subscription API: https://experienceleague.adobe.com/en/docs/workfront/using/adobe-workfront-api/event-subscriptions/event-subs-api
- Event subscription delivery requirements: https://experienceleague.adobe.com/en/docs/workfront/using/adobe-workfront-api/event-subscriptions/setup-event-sub-endpoint
Option 1. API key authentication
This connector still supports API key authentication for legacy environments.

- Generate or retrieve an API key for the Workfront user that will own the subscription.
- Create a connector connection with:
Workfront DomainAPI Key
- The policy script exchanges the API key for a Workfront
sessionID.
Adobe notes that API keys are legacy and recommends JWT or OAuth2-based authentication for newer setups:
- API basics: https://experienceleague.adobe.com/en/docs/workfront/adobe-workfront-api/api-general-information/api-basics
- Manage API keys: https://experienceleague.adobe.com/en/docs/workfront/using/administration-and-setup/manage-wf/security/manage-api-keys
Option 2. JWT exchange authentication
This is the preferred setup for machine-to-machine integrations.

- In Workfront, open
Setup->System->OAuth2 Applications. - Create a new
Machine to Machine Application. - Save the generated values:
Client IDClient Secret
- Add a public key to the app.
- You can either paste a public key generated outside Workfront, or
- use Workfront to generate a keypair and then securely export/store the private key
- Note the
Customer IDfrom the app details. - Identify the Workfront user ID that the JWT should impersonate as
sub. - Create a connector connection with:
Workfront DomainClient IDClient SecretCustomer IDSubject UserRSA Private Key (Base64 JSON)
Adobe Workfront documentation:
- Create OAuth2 applications: https://experienceleague.adobe.com/en/docs/workfront/using/administration-and-setup/configure-integrations/create-oauth-application
- JWT flow: https://experienceleague.adobe.com/en/docs/workfront/using/adobe-workfront-api/api-notes/oauth-app-jwt-flow
How to generate keys for JWT exchange
The connector code in script.csx does not expect a PEM file directly. It expects a base64-encoded JSON object containing RSA parameters:
modulusexponentdpqdpdqinverseQ
Each value must itself be standard base64, and then the full JSON must be UTF-8 encoded and base64-encoded again before being pasted into the connector connection.
Recommended flow
- Generate an RSA keypair.
- Upload the public key to the Workfront OAuth2 application.
- Convert the private key into RSA parameters JSON.
- Minify the JSON.
- Base64-encode the full JSON string.
- Paste the final single-line value into
RSA Private Key (Base64 JSON).
Example scripts
You can find scripts with detailed instructions in this repository: https://github.com/P-Product-Inc/AdobeWorkfrontEventSubscriberPreparationScripts
JWT payload used by this connector
The policy script generates a short-lived JWT with:
alg = RS256iss = clientIdsub = subjectUserIdiat = current unix timeexp = current unix time + 60 seconds
It then posts the signed token to:
https://<workfront-domain>/integrations/oauth2/api/v1/jwt/exchange
Known issues
Private key must be serialized as base64 JSON
The connector stores the private key as base64-encoded JSON with RSA parameters instead of a PEM block.
Reason:
- The Power Automate custom connector runtime produced errors when the private key was passed in a more conventional PEM-like representation
- Serializing the RSA parameters into JSON and then wrapping that JSON in base64 avoids the runtime parsing problem and allows the policy script to reconstruct
RSAParametersreliably
This behavior is implemented in script.csx in ParseRsaParamsFromB64Json.
Webhook delete does not work
Deleting the Workfront event subscription from Power Automate currently does not work reliably.
Power Automate Community thread: https://community.powerplatform.com/forums/thread/details/?threadid=ca556f3b-9e27-f111-8341-000d3a5747e9
Observed behavior:
- Power Automate sends an unauthorized
DELETErequest when it attempts to remove the webhook subscription - Because of that, the Workfront subscription can remain orphaned and may need to be deleted manually from Workfront
Relevant Adobe reference for delete behavior:
- Event Subscription API delete operation: https://experienceleague.adobe.com/en/docs/workfront/using/adobe-workfront-api/event-subscriptions/event-subs-api#deleting-event-subscriptions
OAuth 2.0 Authorization Code with PKCE is not practical for this connector
Using Authentication through OAuth 2.0 Authorization Code flow with Proof Key for Code Exchange (PKCE) is not practical for this connector because of the combination of Workfront tenant isolation and Power Automate custom connector deployment rules.
Workfront limitation:
- Workfront is effectively tenant-specific by domain
- Each tenant can require its own OAuth application registration and endpoints
- That means the OAuth client configuration is not naturally shared across all customer tenants
Power Automate custom connector limitation:
- For OAuth-based custom connector authentication,
clientId,authorizationUrl,refreshUrl, andtokenUrlare defined statically inapiProperties.json - The client secret is provided separately during connector deployment
- As a result, the OAuth configuration is effectively fixed for the connector deployment and cannot be varied dynamically per flow or per tenant connection
Impact:
- We cannot reliably support a per-tenant OAuth Authorization Code with PKCE setup in a single reusable connector package
- We cannot let each flow unit bring its own tenant-specific authorization endpoints and app registration details
- Because of this, the connector uses API key exchange or JWT-based machine-to-machine authentication instead
Repository contents
- apiDefinition.swagger.json: custom connector trigger definition
- apiProperties.json: connector properties, auth inputs, icon color, and policies
- script.csx: policy script that performs API key or JWT exchange before forwarding requests
Creating a connection
The connector supports the following authentication types:
| Use Worfront API key for the authentication. | You need to generate API key in the Workfront dashboard. | All regions | Not shareable |
| Use Workfront JWT exchange | Use Workfront JWT exchange approach for the machine-to-machine communication | All regions | Not shareable |
| Default [DEPRECATED] | This option is only for older connections without an explicit authentication type, and is only provided for backward compatibility. | All regions | Not shareable |
Use Worfront API key for the authentication.
Auth ID: api-auth
Applicable: All regions
You need to generate API key in the Workfront dashboard.
This is not shareable connection. If the power app is shared with another user, another user will be prompted to create new connection explicitly.
| Name | Type | Description | Required |
|---|---|---|---|
| Workfront Domain | string | Your full Workfront domain (e.g., mycompany.my.workfront.com or dmeps.sb01.workfront.com) | True |
| API Key | securestring | The API key | True |
Use Workfront JWT exchange
Auth ID: jwt-exchange
Applicable: All regions
Use Workfront JWT exchange approach for the machine-to-machine communication
This is not shareable connection. If the power app is shared with another user, another user will be prompted to create new connection explicitly.
| Name | Type | Description | Required |
|---|---|---|---|
| Workfront Domain | string | Your full Workfront domain (e.g., mycompany.my.workfront.com or dmeps.sb01.workfront.com) | True |
| Client ID | string | Workfront Client ID | True |
| Client Secret | securestring | Workfront Client Secret | True |
| Customer ID | string | Workfront Customer ID | True |
| Subject User | string | Workfront Subject User | True |
| RSA Private Key (Base64 JSON) | string | Base64-encoded minified JSON containing RSA private key parameters (modulus, exponent, d, p, q, dp, dq, inverseQ). Generated by the setup script and used to sign Workfront JWT assertions at runtime. Single-line value; do not include line breaks. | True |
Default [DEPRECATED]
Applicable: All regions
This option is only for older connections without an explicit authentication type, and is only provided for backward compatibility.
This is not shareable connection. If the power app is shared with another user, another user will be prompted to create new connection explicitly.
| Name | Type | Description | Required |
|---|---|---|---|
| Workfront Domain | string | Your full Workfront domain (e.g., mycompany.my.workfront.com or dmeps.sb01.workfront.com). | True |
| API Key | securestring | The API key. | True |
| Client ID | string | Workfront Client ID. | True |
| Client Secret | securestring | Workfront Client Secret. | True |
| Customer ID | string | Workfront Customer ID. | True |
| Subject User | string | Workfront Subject User. | True |
| RSA Private Key (Base64 JSON) | string | Base64-encoded minified JSON containing RSA private key parameters (modulus, exponent, d, p, q, dp, dq, inverseQ). Generated by the setup script and used to sign Workfront JWT assertions at runtime. Single-line value; do not include line breaks. | True |
Triggers
| When a Workfront event occurs |
Triggers when a CREATE, UPDATE, or DELETE event occurs in Workfront |
When a Workfront event occurs
Triggers when a CREATE, UPDATE, or DELETE event occurs in Workfront
Parameters
| Name | Key | Required | Type | Description |
|---|---|---|---|---|
|
Object Type
|
objCode | True | string |
Workfront object type |
|
Event Type
|
eventType | True | string |
Type of event to trigger on |
|
Field Name
|
fieldName | True | string |
Field name to filter on (e.g., projectID, status, lastUpdatedByID) |
|
Field Value
|
fieldValue | True | string |
Value to compare against |
|
State
|
state | string |
State to check (newState or oldState) |
|
|
Comparison
|
comparison | string |
Comparison operator |
|
|
Filter Connector
|
filterConnector | string |
Logical connector for multiple filters |
Returns
| Name | Path | Type | Description |
|---|---|---|---|
|
eventType
|
eventType | string |
Type of event (CREATE, UPDATE, DELETE) |
|
subscriptionId
|
subscriptionId | string |
ID of the subscription |
|
epochSecond
|
eventTime.epochSecond | integer |
Unix timestamp in seconds |
|
nano
|
eventTime.nano | integer |
Nanosecond precision |
|
newState
|
newState | object |
New state of the object |
|
oldState
|
oldState | object |
Previous state of the object (empty for CREATE events) |
|
customerId
|
customerId | string |
Workfront customer ID |
|
userId
|
userId | string |
ID of the user who triggered the event |
|
subscriptionVersion
|
subscriptionVersion | string |
Version of the subscription (v1 or v2) |
|
eventVersion
|
eventVersion | string |
Version of the event format (v1 or v2) |