folder/create FormID 20509
Create a logical folder structure in an S3 bucket using a zero-byte prefix object.
S3 Folder Model: S3 has no native concept of folders. "Folders" are object key prefixes.
folder/create uploads a zero-byte object with a key ending in / (e.g. reports/2026/). This creates a visible folder placeholder in the AWS console and ensures the prefix exists before bulk uploads begin. The folder path must end with / — a path without a trailing slash creates a regular zero-byte object, not a folder prefix.
When to Use
- Pre-upload structure setup: Create the required directory hierarchy before a bulk upload loop starts writing objects into nested prefixes.
- Tenant folder provisioning: Set up a standardized folder structure (e.g.
documents/,media/,exports/) in a new tenant's bucket during onboarding. - Date-partitioned hierarchy: Create year/month/day prefix placeholders before writing time-series data to ensure consistent folder organization.
- Category organization: Establish organizational prefixes (e.g.
invoices/,contracts/,receipts/) to group uploads by type before ingestion begins.
Configuration
Connection
Credentials and region are not fields on this operation. Wire an S3 Server satellite node into this node's input. The satellite holds the vault credential (
ApiKey type — Username = access key ID, Password = secret key), the target AWS region, and an optional Service URL override for S3-compatible backends. Its values are merged onto this node at execution time and take precedence over anything set locally. See S3 Server (satellite) for the full field reference.
Tenant-prefixed:
folderPath is auto-prepended with tenants/{tenantId}/ before the request is sent to S3. The value you type is what other S3 nodes in this workflow should reuse; the output's effectiveFolderPath field carries the literal path actually written, for use with the AWS console, CLI, or other external tools.
Operation Fields
| Field | Required | Description |
|---|---|---|
bucketName | Required | Name of the S3 bucket where the folder will be created. |
folderPath | Required | Folder path to create. Must end with / (e.g. reports/2026/Q2/). Intermediate segments are automatically treated as nested prefixes. |
Trailing Slash Required: The
folderPath must end with /. A path like reports/2026 (without the trailing slash) creates a zero-byte object named reports/2026, not a folder prefix. Always validate path expressions to ensure the trailing slash is present.
Sample Configuration
// Credentials + region resolved from the connected S3 Server satellite — see s3-server-satellite.html
{
"resource": "folder",
"operation": "create",
"bucketName": "acme-tenant-{{ $node.TenantSetup.output.tenantId }}-storage",
"folderPath": "documents/"
}
Validation Errors
| Error Code | Cause & Resolution |
|---|---|
AccessDenied | The IAM identity lacks s3:PutObject on the target bucket. Update the IAM policy to include write access. |
NoSuchBucket | The specified bucket does not exist. Create it first with bucket/create. |
InvalidFolderPath | The folderPath does not end with /. Ensure all folder paths have a trailing slash before execution. |
Output
Success Port
| Field | Type | Description |
|---|---|---|
status | string | success on successful folder creation. |
errorCode | string | Empty string on success. |
bucketName | string | The bucket where the folder was created. |
folderPath | string | The created folder path (e.g. documents/). |
createdAt | string | ISO 8601 timestamp of folder creation. |
Error Port
On failure, activates with errorCode, errorMessage, and httpStatusCode. Most common failure is AccessDenied due to missing s3:PutObject permission.
Sample Output
{
"status": "success",
"errorCode": "",
"bucketName": "acme-tenant-t1024-storage",
"folderPath": "documents/",
"createdAt": "2026-05-26T09:20:11Z"
}
Expression Reference
| Expression | Result |
|---|---|
{{ $node.CreateFolder.output.folderPath }} | Created folder path — use to construct full object keys for subsequent uploads into this folder. |
{{ $node.CreateFolder.output.bucketName }} | Confirm the target bucket in downstream audit log entries. |
{{ $node.CreateFolder.output.createdAt }} | Creation timestamp — log during tenant provisioning audit. |
Node Policies & GuardRails
| Policy Area | Recommendation |
|---|---|
| Credential Storage | Store credentials in BizFirst Credentials Manager. Never hardcode. |
| IAM Permissions | Grant s3:PutObject scoped to the target bucket ARN. No additional permissions are required to create folder placeholders. |
| Trailing Slash Enforcement | Always validate that folderPath ends with /. Use a Code Execute or Function node to append / if missing before calling this node. |
| Idempotency | Re-creating an existing folder placeholder overwrites the zero-byte object silently — this is safe and idempotent. No special handling required. |
| Nested Paths | To create deep hierarchies (e.g. data/2026/Q2/june/), call folder/create once with the full path — S3 will represent all intermediate segments as prefixes automatically. |
| Folder vs Object Collision | Avoid creating a folder path that conflicts with an existing object key. For example, if reports/2026 (no slash) exists as an object, creating reports/2026/ (with slash) is safe but may cause confusion in the console. |
| Provisioning Order | Create the bucket first with bucket/create, then call folder/create. Attempting to create a folder in a non-existent bucket fails immediately. |
| Audit Logging | Log folderPath and createdAt during tenant provisioning workflows for a complete storage structure audit trail. |
Examples
Example 1: Tenant Onboarding — Standard Folder Structure
After creating a tenant's bucket, provision a standardized folder hierarchy using parallel folder creation steps.
// Parallel Fork → 4 branches:
// Node: CreateDocumentsFolder
{ "bucketName": "acme-tenant-{{ tenantId }}-storage", "folderPath": "documents/" }
// Node: CreateMediaFolder
{ "bucketName": "acme-tenant-{{ tenantId }}-storage", "folderPath": "media/" }
// Node: CreateExportsFolder
{ "bucketName": "acme-tenant-{{ tenantId }}-storage", "folderPath": "exports/" }
// Node: CreateTempFolder
{ "bucketName": "acme-tenant-{{ tenantId }}-storage", "folderPath": "temp/" }
// Parallel Join → Continue onboarding workflow
Example 2: Date-Partitioned Archive Setup
Before writing time-series records to S3, create the current month's folder hierarchy.
// Node: CreateMonthFolder (S3 — folder/create)
{
"bucketName": "acme-time-series-archive",
"folderPath": "data/{{ $now | date: 'YYYY/MM' }}/"
}
// Next: UploadRecords (object/upload loop with keys under this prefix)
Example 3: Compliance Archive Structure
Create quarterly folder placeholders in a compliance archive bucket at the start of each fiscal quarter.
// Node: CreateQ1Folder
{ "bucketName": "acme-compliance-archive", "folderPath": "fy2026/Q1/" }
// Node: CreateQ2Folder
{ "bucketName": "acme-compliance-archive", "folderPath": "fy2026/Q2/" }
// Node: CreateQ3Folder
{ "bucketName": "acme-compliance-archive", "folderPath": "fy2026/Q3/" }
// Node: CreateQ4Folder
{ "bucketName": "acme-compliance-archive", "folderPath": "fy2026/Q4/" }
// Parallel Fork/Join for all four simultaneously