Workday Bank Feeds
Setting up a Workday Bank Feeds Workflow with Rutter
Introduction
Rutter API enables you to support setting up bank feeds for your customers' Workday Financial Management instances. This allows you to sync bank transaction data into Workday to enable reconciliation for an accountant, which ensures the accuracy and validity of your customers' books.
- Connect to your customer's Workday instance and configure the required permissions in their tenant.
- Discover the bank accounts in Workday that you want to feed transactions into.
- Continuously sync transaction data into the bank accounts to enable reconciliation.
How Workday Bank Feeds differ from Intuit, Sage, and Plaid
Unlike Intuit, Sage, and Plaid Bank Feeds, Workday does not require a separate financial-institution partnership or a dedicated bank feeds connection. Statements are imported through Workday's standard Web Services API using the same connection you use for the rest of Workday. This means there is no Rutter-side account registration step — you point your transactions at bank accounts that already exist in the customer's Workday tenant.
Platform Setup
Data Sync Configuration
Make sure to include these Rutter Objects in your Data Sync Configuration through the Rutter dashboard.
- Bank Feed Account
- Bank Feed Transaction
Connect to Workday
Embed Rutter Link into your application and walk through an end to end business authentication flow in order to create a new Connection. This Connection represents the business's Workday instance and contains an access_token used to read and write data for that instance.
Make your first connection in minutes
Follow our guide to get up and running
Configure the Workday Tenant
Bank feeds require some one-time configuration in the customer's Workday tenant that is performed by their Workday administrator. Without all of these in place, Workday rejects the underlying API calls with an authorization error.
Add the
Banking and SettlementOAuth scope to the API Client used for the connection. Without this scope, the access token is not permitted to call Workday's Cash Management operations, regardless of other permissions.Grant the integration's security group Get + Put on the
Process: Bank Reconciliationdomain (in the Banking and Settlement functional area). This domain governs both bank account discovery and statement imports. After editing permissions, the admin must run Activate Pending Security Policy Changes — domain changes have no effect until activated.Approve the target bank accounts. Every bank account you intend to feed transactions into must be in Approved status in Workday. Workday rejects statement imports for unapproved accounts.
Important Post-Setup Step
Once the customer's Workday administrator has completed the steps above, contact your Rutter Customer Success manager to confirm the bank feed objects are enabled for your organization. You may need to re-authenticate an existing connection for the new scope to take effect.
Implementation Steps
Step 1: Discover Bank Feed Accounts
Workday bank accounts are created and maintained inside Workday, not through Rutter. Instead of creating a Bank Feed Account, use Rutter's GET /bank_feeds/accounts API endpoint to list the bank accounts that already exist in the customer's Workday tenant.
POST /bank_feeds/accounts is not supported for Workday
Because bank accounts live in Workday and statements are imported against existing accounts, the Create a Bank Feed Account endpoint is not available for Workday. Calling it returns ENDPOINT_NOT_AVAILABLE_FOR_PLATFORM. Use GET /bank_feeds/accounts to find the account you want, then reference its Rutter id when syncing transactions.
Each returned account includes a transaction_ready field. For Workday, transaction_ready is true for any account that is open (not closed) in the tenant. Pick the id of the account you want to feed transactions into — you'll pass it as bank_feed_account_id in the next step.
1{
2 "bank_feed_accounts": [
3 {
4 "id": "00000000-0000-0000-0000-000000000000",
5 "account_id": null,
6 "internal_bank_account_id": "BANK_ACCOUNT-6-123",
7 "bank_account_type": "bank",
8 "feed_status": "active",
9 "transaction_ready": true,
10 "bank_account_number": "0674101002388",
11 "routing_number": "021000021",
12 "currency_code": "USD",
13 "name": "Operating Account",
14 "last_synced_at": "2023-01-02T02:34:56.000Z"
15 }
16 ]
17}
Step 2: Sync Transaction Data
Once you've identified the bank feed account, sync transaction data with the POST /bank_feeds/transactions API. We suggest syncing transactions in real time, once they've posted to the account.
Under the hood, Rutter packages the batch into a Workday bank statement import against the account's currency and date range. The transaction_ready status on the account indicates Rutter is able to accept new transactions — for Workday this is true for any open account.
1{
2 "bank_feed_transactions": {
3 "bank_feed_account_id": "00000000-0000-0000-0000-000000000000",
4 "current_balance": 1234.56,
5 "transactions": [
6 {
7 "transaction_id": "ACRAF23DB3C4",
8 "posted_at": "2023-02-02T02:34:56.000Z",
9 "amount": -300,
10 "description": "Office supplies",
11 "transaction_type": "debit",
12 "debit_credit_memo": "DEBIT",
13 "payee": "Office Depot"
14 }
15 ]
16 }
17 }
Workday uses posted_at for transaction dates
For Workday, posted_at controls the date every transaction is imported under, as well as the statement's begin and end dates (derived from the earliest and latest posted_at in the batch). The transaction_date field is not used for Workday and is omitted from the example above — if you send it, it will be ignored.
If the Bank Feed Transaction input is valid and the call succeeds, the statement is imported into Workday. The end user can see the synced transactions on the bank account's reconciliation page in Workday.
If
response_mode=asyncis specified in the request, the response will include a job ID which can be used to check the status of the POST request using Fetch a Job API. If the job completes successfully, your input was valid and the response will show transactions withplatform_ingested: true.
If the job fails, you should retry the POST request after fixing the error described in the job response.
What platform_ingested means for Workday
Workday processes bank statement imports asynchronously on its side. For Workday, platform_ingested: true means Workday accepted and acknowledged the batch — not that every line has finished posting to the ledger. The transactions are searchable in Rutter regardless, so you never lose track of a batch Workday has accepted.
Transaction Syncing Rules
- You must provide at least one transaction per sync request.
- Only posted transactions should be submitted.
- Each transaction must have a unique identifier (
transaction_id). The identifier for a transaction must never change. The same transaction identifier should not occur more than once for a Bank Feed Account. - The
debit_credit_memofield is required. - The transaction currency is determined by the Workday bank account. The account's currency must match the transactions being imported — Workday rejects imports where the currency does not match the configured bank account currency.
current_balance is not applied for Workday
The current_balance field is part of the Bank Feed Transactions request schema, but it is not currently sent to or validated by Workday. Workday's statement import is built from the transaction lines only (opening/closing balance validation is disabled), so any current_balance you provide is ignored for Workday.
Idempotency and Retries
Rutter derives a deterministic reference for each batch from the bank feed account, the statement date range, and the set of transaction_ids. If you retry the exact same batch, Workday recognizes it as a duplicate and treats the retry as an idempotent success rather than creating a duplicate statement. To import a corrected or different batch for the same account and date, change the set of transactions so a new reference is generated.
Reconciliation with Workday
Your user will now be able to see the transactions you have synced within Workday and perform reconciliation against them. In Workday, they can review imported statements and reconcile them against the bank account's ledger activity using the standard bank reconciliation workflow.
Current Limitations
The initial Workday Bank Feeds integration has a few limitations worth noting:
- Acknowledgement, not terminal status: as described above,
platform_ingestedreflects Workday acknowledging the batch, not the final posting status of each line. - No per-transaction duplicate flags: Workday's import response reports at the batch level, so individual transactions are not flagged as duplicates in the response.
- One statement per batch: each sync request is imported as a single Workday statement spanning the earliest to latest
posted_atin the batch. - Balance summaries: opening/closing balance validation is not applied, and
current_balanceis not sent to Workday. The statement is built from the transaction lines only.
If your use case requires any of these, reach out to your Rutter Customer Success manager.