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
| Field | Required | Description |
|---|---|---|
accessKeyId | Required | AWS Access Key ID. Store in BizFirst Credentials Manager. |
secretKey | Required | AWS Secret Access Key. Never log or expose. |
sessionToken | Optional | STS session token for temporary credentials. |
region | Required | AWS region of the target bucket. |
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
{
"connection": {
"accessKeyId": "{{ $credentials.s3_prod.accessKeyId }}",
"secretKey": "{{ $credentials.s3_prod.secretKey }}",
"region": "us-east-1"
},
"operation": {
"resource": "folder",
"action": "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