Fluent Commerce Connector
Description
Fluent Commerce is an order management system for tracking customers, orders and inventory.
This component allows creating customers and products, looking up a customer by email address, retrieving the authenticated user, and sending custom GraphQL queries and mutations. A polling trigger reports new and updated orders on a schedule.
API Documentation
This component was built using the Fluent Commerce GraphQL API.
Fluent Commerce offers a GraphQL-based API. This provides flexibility and control over what data is sent to Fluent, and what data is requested back.
While this component offers some actions that wrap common GraphQL queries and mutations, there are many more queries and mutations for which there aren't dedicated actions. To run a query or mutation that is not represented by an action, use the Generic GraphQL Request action.
Connections
Fluent Commerce OAuth 2.0 Password Grant
key: fluent-password-grantFluent uses OAuth 2.0 password grant type for authentication. Authenticating with Fluent requires a Client ID and Client Secret from Fluent, and end users must enter their username and password.
Prerequisites
- A Fluent Commerce retailer account with a username and password
- The Fluent API host URL for the retailer
- An OAuth 2.0 Client ID and Client Secret issued by Fluent
Setup Steps
- Contact Fluent support to request an OAuth 2.0 Client ID and Client Secret for the retailer.
- Gather the Fluent API host URL, the retailer username, and the retailer password.
Configure the Connection
Create a connection of type Fluent Commerce OAuth 2.0 Password Grant and enter the following:
- Fluent Host: Enter the retailer's Fluent API endpoint, for example
https://REPLACE-ME.api.fluentretail.com. - Retailer Username: Enter the retailer's username.
- Retailer Password: Enter the retailer's password.
- OAuth 2.0 Client ID: Enter the client ID obtained from Fluent support.
- OAuth 2.0 Client Secret: Enter the client secret obtained from Fluent support.
| Input | Notes | Example |
|---|---|---|
| OAuth 2.0 Client ID | A client ID obtained from Fluent support | |
| OAuth 2.0 Client Secret | A client secret obtained from Fluent support | |
| Fluent Host | The retailer's Fluent API endpoint | https://REPLACE-ME.api.fluentretail.com |
| Retailer Password | The retailer's password | |
| Retailer Username | The retailer's username | john_doe |
Triggers
New and Updated Records
Retrieves existing and ongoing orders from Fluent Commerce. Load history once, check for changes on a schedule, or both. | key: pollChangesTrigger
| Input | Notes | Example |
|---|---|---|
| Connection | The Fluent Commerce connection to use. | |
| Look-back Date | The date the initial sync starts from, in YYYY-MM-DD format. Cannot be a future date. Leave empty to start from the first recurrence with no backfill. When set, the initial sync seeds each record modified on or after this date once, ignoring the field and visibility filters. | 2026-01-01 |
| Retailer ID | Optional Fluent retailer ID to scope the polling query. When omitted, the connection's default tenant scope applies. | 34 |
| Show New Records | When enabled, orders whose | true |
| Show Updated Records | When enabled, orders whose | true |
This trigger polls Fluent Commerce for new and updated orders on a scheduled basis.
How It Works
- The trigger runs on the configured schedule.
- It queries Fluent for orders whose
updatedOnfalls between the last recurrence and the current time. When Retailer ID is set, only that retailer's orders are returned. Otherwise the connection's default tenant scope applies. - Each returned order is classified as created when its
createdOnis after the last recurrence, and otherwise as updated. - Outside an initial sync, Show New Records and Show Updated Records each gate one of the two arrays. Turning either off leaves that array empty.
- Once the whole window has been read, the trigger stores the window's upper bound as its position for the next recurrence.
Both bounds of the window are inclusive, so an order updated exactly on a boundary can be returned by two consecutive recurrences.
Initial Sync
An initial sync seeds a complete starting state rather than a change feed, so inputs that narrow which changes are reported would leave gaps in it: Show New Records and Show Updated Records are ignored while it runs. It begins on the first recurrence when a Look-back Date (YYYY-MM-DD, not a future date) is set, and returns every order updated on or after that date. Left empty, there is no initial sync and the first recurrence starts from the time it runs.
The upper bound of the sync window is fixed when the sync begins, so orders updated mid-drain are picked up by the first scheduled recurrence after the sync completes. The trigger stores that bound as its position once the window is fully read, and the first incremental recurrence resumes from exactly there. Nothing in the payload marks the handoff. With batching off, the sync reads up to 20 pages of 50 orders per recurrence and resumes the same window on the next recurrence until it is drained. With batching on, the sync is drained within one recurrence.
Retailer ID still applies throughout the sync.
Batching
Batching is enabled per flow on this trigger: each changed record is dispatched as its own execution, or grouped by the configured batch size. Batch size and batch concurrency can both be overridden per instance. Raising concurrency increases the request volume sent to Fluent Commerce.
To turn it on, select the flow's trigger, open the Flow control tab, and switch on Enable Batching. Under Batch Size, keep Trigger default or choose Custom batch size. Batch Concurrency is optional; leave it blank for no batch-level limit.
With batching on, the trigger reads one page of 50 orders per round and the platform continues from the returned cursor, so a window larger than one page is drained within the same recurrence. With batching off, a window larger than 20 pages is resumed one recurrence at a time.
With batching off, a downstream step reads body.data.created and body.data.updated. With batching on, those fields do not exist: each execution receives one { "changeType": ..., "record": ... } item, or an array of them when the batch size is greater than 1. Any step reading the older shape must be updated before batching is enabled, or it breaks the moment the switch is flipped. Because batching is enabled per flow, that change is scoped to the flow rather than to the component or to other flows using the same trigger.
Returned Data
With batching off, the trigger returns an object with two arrays: created for new orders and updated for modified orders. Fields shown are representative. The full response object includes additional properties.
Example Response
{
"data": {
"created": [
{
"id": "ORD-1042",
"ref": "WEB-000142",
"type": "STANDARD",
"status": "CREATED",
"createdOn": "2026-05-26T14:30:00.000Z",
"updatedOn": "2026-05-26T14:30:00.000Z"
}
],
"updated": [
{
"id": "ORD-980",
"ref": "WEB-000087",
"type": "STANDARD",
"status": "FULFILLED",
"createdOn": "2026-04-12T09:00:00.000Z",
"updatedOn": "2026-05-26T15:45:00.000Z"
}
]
}
}
With batching on, each execution receives one order tagged with how it changed, or an array of such items when the batch size is greater than 1. The created and updated arrays are not part of this shape.
Batched Item
{
"changeType": "created",
"record": {
"id": "ORD-1042",
"ref": "WEB-000142",
"type": "STANDARD",
"status": "CREATED",
"createdOn": "2026-05-26T14:30:00.000Z",
"updatedOn": "2026-05-26T14:30:00.000Z"
}
}
Example Payload for New and Updated Records⤓
Actions
Create Customer
Create a new customer | key: createCustomer
| Input | Notes | Example |
|---|---|---|
| Attributes | Custom attributes to apply to the customer. Each key becomes the attribute name, and each value is stored as a STRING attribute. | |
| Connection | The Fluent Commerce connection to use. | |
| Country | The customer's country | Australia |
| Customer Email | The email address of the customer | test@example.com |
| First Name | The first name of the customer (required) | John |
| Last Name | The last name of the customer | Doe |
| Phone Number | The customer's phone number | +61412345678 |
| Promotion Opt In | When true, the customer is opted in to receive promotional communications. | false |
| Retailer ID | The ID of the retailer (a number) | 34 |
| Time Zone | The customer's time zone | UTC+5 |
Example Payload for Create Customer⤓
Create Product
Create a new standard product | key: createProduct
| Input | Notes | Example |
|---|---|---|
| Connection | The Fluent Commerce connection to use. | |
| Global Trade Item Number (GTIN) | The global trade number of the product | 012345678905 |
| Price Currency | Type of currency the price is in (USD, YEN, GBP, etc) | USD |
| Price Value | The price of the product (must be a floating-point number) | 1300 |
| Product Catalogue Ref (ID) | The reference ID (ref) of an existing product catalog | FCRG:PC:MASTER |
| Product Name | The name of the product (not required to be unique) | Widget |
| Product Ref ID | The reference ID (ref) of the new product (must be unique) | TESTPRD |
| Product Summary / Description | A short description of the product, stored as the product's summary. | Widgets: the new whatsits |
| Product Type | The type of the product | STANDARD |
Example Payload for Create Product⤓
Generic GraphQL Request
Issue any GraphQL query or mutation with variables | key: genericRequest
| Input | Notes | Example |
|---|---|---|
| Connection | The Fluent Commerce connection to use. | |
| Query or Mutation | The GraphQL query or mutation to send to the Fluent Commerce API. | |
| Variables | Key-value pairs passed to the query as GraphQL variables. | |
| Variables Object | A JSON object of GraphQL variables, for values that are not strings. Merged with Variables; on a shared key, this value wins. |
Example Payload for Generic GraphQL Request⤓
Get Current User
Get information about the currently authenticated user | key: getCurrentUser
| Input | Notes | Example |
|---|---|---|
| Connection | The Fluent Commerce connection to use. |
Example Payload for Get Current User⤓
Get Customer by Email
Find a customer by their email address | key: getCustomerByEmailAddress
| Input | Notes | Example |
|---|---|---|
| Connection | The Fluent Commerce connection to use. | |
| Customer Email Address | The customer's email address | test@example.com |
Example Payload for Get Customer by Email⤓
Changelog
2026-11-03
Published the component as an npm package, so code-native integrations can install it and call its actions, triggers and data sources from code with TypeScript types
2026-10-22
- Fixed the New and Updated Records trigger skipping previously created orders that were modified since the last recurrence
- Fixed Debug Mode printing the connection's password, client secret and access token to the execution logs while authenticating with Fluent Commerce
- Fixed the Attributes input on the Create Customer action so configured attributes are sent to Fluent Commerce instead of being silently dropped
- Updated Create Customer to omit Last Name, Phone Number, Country, and Time Zone when left empty instead of sending them to Fluent Commerce as empty text
- Updated the Fluent Commerce OAuth 2.0 Password Grant connection to report a clear error when Fluent Commerce returns no access token
- Updated Debug Mode to log each GraphQL request's query and variables for the actions
- Added inline action calling support to the Get Current User, Get Customer by Email, Create Customer, and Create Product actions for improved example output during configuration
- Added output schemas to the Get Current User, Get Customer by Email, Create Customer, and Create Product actions for improved field mapping during configuration
2026-10-21
- Added opt-in batching to the New and Updated Records trigger, dispatching each changed record individually or in configured batches so large backlogs drain in one recurrence; enabling it changes the shape a downstream step receives
- Added an optional Look-back Date input for performing an initial sync of records. The initial sync backfills every record modified on or after the specified date, beginning on the first recurrence and seeding each record once while ignoring the visibility filters. Leave it empty to start from the first recurrence with no backfill
2026-05-28
Added New and Updated Records polling trigger that monitors orders for changes, branching newly created orders to created and previously existing orders to updated, with an optional Retailer ID input to scope the query in multi-tenant environments
2026-04-30
Updated spectral version
2026-04-07
Added global debug support across all actions for improved troubleshooting