Portal Community
  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

Configuration

Connection

FieldRequiredDescription
accessKeyIdRequiredAWS Access Key ID. Store in BizFirst Credentials Manager.
secretKeyRequiredAWS Secret Access Key. Never log or expose.
sessionTokenOptionalSTS session token for temporary credentials.
regionRequiredAWS region of the target bucket.

Operation Fields

FieldRequiredDescription
bucketNameRequiredName of the S3 bucket where the folder will be created.
folderPathRequiredFolder 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 CodeCause & Resolution
AccessDeniedThe IAM identity lacks s3:PutObject on the target bucket. Update the IAM policy to include write access.
NoSuchBucketThe specified bucket does not exist. Create it first with bucket/create.
InvalidFolderPathThe folderPath does not end with /. Ensure all folder paths have a trailing slash before execution.

Output

Success Port

FieldTypeDescription
statusstringsuccess on successful folder creation.
errorCodestringEmpty string on success.
bucketNamestringThe bucket where the folder was created.
folderPathstringThe created folder path (e.g. documents/).
createdAtstringISO 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

ExpressionResult
{{ $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 AreaRecommendation
Credential StorageStore credentials in BizFirst Credentials Manager. Never hardcode.
IAM PermissionsGrant s3:PutObject scoped to the target bucket ARN. No additional permissions are required to create folder placeholders.
Trailing Slash EnforcementAlways validate that folderPath ends with /. Use a Code Execute or Function node to append / if missing before calling this node.
IdempotencyRe-creating an existing folder placeholder overwrites the zero-byte object silently — this is safe and idempotent. No special handling required.
Nested PathsTo 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 CollisionAvoid 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 OrderCreate the bucket first with bucket/create, then call folder/create. Attempting to create a folder in a non-existent bucket fails immediately.
Audit LoggingLog 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