diff --git a/docker/formbricks.sh b/docker/formbricks.sh index b49d99b8d3..f9cdf989b8 100755 --- a/docker/formbricks.sh +++ b/docker/formbricks.sh @@ -340,9 +340,11 @@ EOT sed -i "s|# S3_BUCKET_NAME:|S3_BUCKET_NAME: \"$ext_s3_bucket\"|" docker-compose.yml if [[ -n $ext_s3_endpoint ]]; then sed -i "s|# S3_ENDPOINT_URL:|S3_ENDPOINT_URL: \"$ext_s3_endpoint\"|" docker-compose.yml - sed -i "s|S3_FORCE_PATH_STYLE: 0|S3_FORCE_PATH_STYLE: 1|" docker-compose.yml + # Ensure S3_FORCE_PATH_STYLE is enabled for S3-compatible endpoints (match commented or uncommented) + sed -i 's|#\? *S3_FORCE_PATH_STYLE:.*|S3_FORCE_PATH_STYLE: 1|' docker-compose.yml else - sed -i "s|S3_FORCE_PATH_STYLE: 0|# S3_FORCE_PATH_STYLE:|" docker-compose.yml + # Comment out S3_FORCE_PATH_STYLE for native AWS S3 (match commented or uncommented) + sed -i 's|#\? *S3_FORCE_PATH_STYLE:.*|# S3_FORCE_PATH_STYLE:|' docker-compose.yml fi echo "🚗 External S3 configuration updated successfully!" elif [[ $minio_storage == "y" ]]; then @@ -356,7 +358,8 @@ EOT else sed -i "s|# S3_ENDPOINT_URL:|S3_ENDPOINT_URL: \"http://$files_domain\"|" docker-compose.yml fi - sed -i "s|S3_FORCE_PATH_STYLE: 0|S3_FORCE_PATH_STYLE: 1|" docker-compose.yml + # Ensure S3_FORCE_PATH_STYLE is enabled for MinIO (match commented or uncommented) + sed -i 's|#\? *S3_FORCE_PATH_STYLE:.*|S3_FORCE_PATH_STYLE: 1|' docker-compose.yml echo "🚗 MinIO S3 configuration updated successfully!" fi @@ -407,7 +410,7 @@ EOT minio: restart: always - image: minio/minio:RELEASE.2025-09-07T16-13-09Z + image: minio/minio@sha256:13582eff79c6605a2d315bdd0e70164142ea7e98fc8411e9e10d089502a6d883 command: server /data environment: MINIO_ROOT_USER: "$minio_root_user" @@ -438,7 +441,7 @@ EOT - "traefik.http.middlewares.minio-ratelimit.ratelimit.average=100" - "traefik.http.middlewares.minio-ratelimit.ratelimit.burst=200" minio-init: - image: minio/mc:latest + image: minio/mc@sha256:95b5f3f7969a5c5a9f3a700ba72d5c84172819e13385aaf916e237cf111ab868 depends_on: minio: condition: service_healthy diff --git a/docs/api-reference/openapi.json b/docs/api-reference/openapi.json index 10a0290902..a7090768f8 100644 --- a/docs/api-reference/openapi.json +++ b/docs/api-reference/openapi.json @@ -5675,7 +5675,7 @@ }, "/api/v1/management/storage": { "post": { - "description": "API endpoint for uploading public files. Uploaded files are public and accessible by anyone. This endpoint requires authentication. It accepts a JSON body with fileName, fileType, environmentId, and optionally allowedFileExtensions to restrict file types. On success, it returns a signed URL for uploading the file to S3 along with a local upload URL.", + "description": "API endpoint for uploading public files. Uploaded files are public and accessible by anyone. This endpoint requires authentication. It accepts a JSON body with fileName, fileType, environmentId, and optionally allowedFileExtensions to restrict file types. On success, it returns a signed URL for uploading the file to S3.", "parameters": [ { "example": "{{apiKey}}", @@ -5732,8 +5732,15 @@ "example": { "data": { "fileUrl": "http://localhost:3000/storage/cm1ubebtj000614kqe4hs3c67/public/profile--fid--abc123.png", - "localUrl": "http://localhost:3000/storage/cm1ubebtj000614kqe4hs3c67/public/profile.png", - "signedUrl": "http://localhost:3000/api/v1/client/cm1ubebtj000614kqe4hs3c67/storage/public", + "presignedFields": { + "Policy": "base64EncodedPolicy", + "X-Amz-Algorithm": "AWS4-HMAC-SHA256", + "X-Amz-Credential": "your-credential", + "X-Amz-Date": "20250312T000000Z", + "X-Amz-Signature": "your-signature", + "key": "uploads/public/profile--fid--abc123.png" + }, + "signedUrl": "https://s3.example.com/your-bucket", "updatedFileName": "profile--fid--abc123.png" } }, @@ -5745,9 +5752,12 @@ "description": "URL where the uploaded file can be accessed.", "type": "string" }, - "localUrl": { - "description": "URL for uploading the file to local storage.", - "type": "string" + "presignedFields": { + "additionalProperties": { + "type": "string" + }, + "description": "Form fields to include in the multipart/form-data POST to S3.", + "type": "object" }, "signedUrl": { "description": "Signed URL for uploading the file to S3.", @@ -5765,7 +5775,7 @@ } } }, - "description": "OK - Returns the signed URL, updated file name, and file URL." + "description": "OK - Returns the signed URL, presigned fields, updated file name, and file URL." }, "400": { "content": { @@ -5829,187 +5839,6 @@ "tags": ["Management API - Storage"] } }, - "/api/v1/management/storage/local": { - "post": { - "description": "Management API endpoint for uploading public files to local storage. This endpoint requires authentication. File metadata is provided via headers (X-File-Type, X-File-Name, X-Environment-ID, X-Signature, X-UUID, X-Timestamp) and the file is provided as a multipart/form-data file field named \"file\". The \"Content-Type\" header must be set to a valid MIME type.", - "parameters": [ - { - "example": "{{apiKey}}", - "in": "header", - "name": "x-api-key", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "MIME type of the file. Must be a valid MIME type.", - "in": "header", - "name": "X-File-Type", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "URI encoded file name.", - "in": "header", - "name": "X-File-Name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "ID of the environment.", - "in": "header", - "name": "X-Environment-ID", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Signature for verifying the request.", - "in": "header", - "name": "X-Signature", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Unique identifier for the signed upload.", - "in": "header", - "name": "X-UUID", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Timestamp used for the signature.", - "in": "header", - "name": "X-Timestamp", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "properties": { - "file": { - "description": "The file to be uploaded as a valid file object (buffer).", - "format": "binary", - "type": "string" - } - }, - "required": ["file"], - "type": "object" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "example": { - "data": { - "message": "File uploaded successfully" - } - }, - "schema": { - "properties": { - "data": { - "properties": { - "message": { - "description": "Success message.", - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - } - } - }, - "description": "OK - File uploaded successfully." - }, - "400": { - "content": { - "application/json": { - "example": { - "error": "fileType is required" - }, - "schema": { - "properties": { - "error": { - "description": "Detailed error message.", - "type": "string" - } - }, - "type": "object" - } - } - }, - "description": "Bad Request - Missing required fields, invalid header values, or file issues." - }, - "401": { - "content": { - "application/json": { - "example": { - "error": "Not authenticated" - }, - "schema": { - "properties": { - "error": { - "description": "Detailed error message.", - "type": "string" - } - }, - "type": "object" - } - } - }, - "description": "Unauthorized - Authentication failed, invalid signature, or user not authorized." - }, - "500": { - "content": { - "application/json": { - "example": { - "error": "File upload failed" - }, - "schema": { - "properties": { - "error": { - "description": "Detailed error message.", - "type": "string" - } - }, - "type": "object" - } - } - }, - "description": "Internal Server Error - File upload failed due to server error." - } - }, - "servers": [ - { - "description": "Formbricks API Server", - "url": "https://app.formbricks.com/api/v1" - } - ], - "summary": "Upload Public File to Local Storage", - "tags": ["Management API - Storage"] - } - }, "/api/v1/management/surveys": { "get": { "description": "Fetches all existing surveys", diff --git a/docs/api-v2-reference/openapi.yml b/docs/api-v2-reference/openapi.yml index a7c8627a06..ed35450d8c 100644 --- a/docs/api-v2-reference/openapi.yml +++ b/docs/api-v2-reference/openapi.yml @@ -3843,6 +3843,7 @@ components: type: string enum: - draft + - scheduled - inProgress - paused - completed diff --git a/docs/docs.json b/docs/docs.json index d6247c01b9..60274bc3fa 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -225,6 +225,7 @@ "self-hosting/configuration/custom-ssl", "self-hosting/configuration/environment-variables", "self-hosting/configuration/smtp", + "self-hosting/configuration/file-uploads", "self-hosting/configuration/domain-configuration", { "group": "Auth & SSO", diff --git a/docs/self-hosting/configuration/file-uploads.mdx b/docs/self-hosting/configuration/file-uploads.mdx new file mode 100644 index 0000000000..7ad4a959f4 --- /dev/null +++ b/docs/self-hosting/configuration/file-uploads.mdx @@ -0,0 +1,316 @@ +--- +title: "File Uploads Configuration" +description: "Configure file storage for survey images, file uploads, and project assets in your self-hosted Formbricks instance" +icon: "upload" +--- + +Formbricks requires S3-compatible storage for file uploads. You can use external cloud storage services or the bundled MinIO option for a self-hosted solution. + +## Why Configure File Uploads? + +Setting up file storage enables important features in Formbricks, including: + +- Adding images to surveys (questions, backgrounds, logos) +- 'File Upload' and 'Picture Selection' question types +- Project logos and branding +- Custom organization logos in emails +- Survey background images from uploads + + + If file uploads are not configured, the above features will be disabled and users won't be able to upload + files or images. + + +## Storage Options + +Formbricks supports S3-compatible storage with two main configurations: + +### 1. External S3-Compatible Storage + +Use cloud storage services for production deployments: + +- **AWS S3** (Amazon Web Services) +- **DigitalOcean Spaces** +- **Backblaze B2** +- **Wasabi** +- **StorJ** +- Any S3-compatible storage service + +### 2. Bundled MinIO Storage (Self-Hosted) + + + **Important**: MinIO requires a dedicated subdomain to function properly. You must configure a subdomain + like `files.yourdomain.com` that points to your server. MinIO will not work without this subdomain setup. + + +MinIO provides a self-hosted S3-compatible storage solution that runs alongside Formbricks. This option: + +- Runs in a Docker container alongside Formbricks +- Provides full S3 API compatibility +- Requires minimal additional configuration + +## Configuration Methods + +### Option 1: One-Click Setup Script + +When using the Formbricks installation script, you'll be prompted to configure file uploads: + +```bash +📁 Do you want to configure file uploads? + If you skip this, the following features will be disabled: + - Adding images to surveys (e.g., in questions or as background) + - 'File Upload' and 'Picture Selection' question types + - Project logos + - Custom organization logo in emails +Configure file uploads now? [Y/n] y +``` + +#### External S3-Compatible Storage + +Choose this option for AWS S3, DigitalOcean Spaces, or other cloud providers: + +```bash +🗄️ Do you want to use an external S3-compatible storage (AWS S3/DO Spaces/etc.)? [y/N] y +🔧 Enter S3 configuration (leave Endpoint empty for AWS S3): + S3 Access Key: your_access_key + S3 Secret Key: your_secret_key + S3 Region (e.g., us-east-1): us-east-1 + S3 Bucket Name: your-bucket-name + S3 Endpoint URL (leave empty if you are using AWS S3): https://your-endpoint.com +``` + +#### Bundled MinIO Storage + +Choose this option for a self-hosted S3-compatible storage that runs alongside Formbricks: + + + **Critical Requirement**: Before proceeding, ensure you have configured a subdomain (e.g., + `files.yourdomain.com`) that points to your server's IP address. MinIO will not function without this + subdomain setup. + + +```bash +🗄️ Do you want to use an external S3-compatible storage (AWS S3/DO Spaces/etc.)? [y/N] n +🔗 Enter the files subdomain for object storage (e.g., files.yourdomain.com): files.yourdomain.com +``` + +The script will automatically: + +- Generate secure MinIO credentials +- Create the storage bucket +- Configure SSL certificates for the files subdomain +- Configure Traefik routing for the subdomain + +### Option 2: Manual Environment Variables + +Add the following environment variables to your `docker-compose.yml` or `.env` file: + +#### For S3-Compatible Storage + +```bash +# S3 Storage Configuration +S3_ACCESS_KEY=your_access_key +S3_SECRET_KEY=your_secret_key +S3_REGION=us-east-1 +S3_BUCKET_NAME=your-bucket-name + +# Optional: For third-party S3-compatible services (leave empty for AWS S3) +S3_ENDPOINT_URL=https://your-endpoint.com + +# Enable path-style URLs for third-party services (1 for enabled, 0 for disabled) +S3_FORCE_PATH_STYLE=1 +``` + +## Provider-Specific Examples + +### AWS S3 + +```bash +S3_ACCESS_KEY=AKIA1234567890EXAMPLE +S3_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY +S3_REGION=us-east-1 +S3_BUCKET_NAME=my-formbricks-uploads +# S3_ENDPOINT_URL is not needed for AWS S3 +# S3_FORCE_PATH_STYLE=0 +``` + +### DigitalOcean Spaces + +```bash +S3_ACCESS_KEY=your_spaces_key +S3_SECRET_KEY=your_spaces_secret +S3_REGION=nyc3 +S3_BUCKET_NAME=my-formbricks-space +S3_ENDPOINT_URL=https://nyc3.digitaloceanspaces.com +S3_FORCE_PATH_STYLE=1 +``` + +### MinIO (Self-Hosted) + +```bash +S3_ACCESS_KEY=minio_access_key +S3_SECRET_KEY=minio_secret_key +S3_REGION=us-east-1 +S3_BUCKET_NAME=formbricks-uploads +S3_ENDPOINT_URL=https://files.yourdomain.com +S3_FORCE_PATH_STYLE=1 +``` + +### Backblaze B2 + +```bash +S3_ACCESS_KEY=your_b2_key_id +S3_SECRET_KEY=your_b2_application_key +S3_REGION=us-west-000 +S3_BUCKET_NAME=my-formbricks-bucket +S3_ENDPOINT_URL=https://s3.us-west-000.backblazeb2.com +S3_FORCE_PATH_STYLE=1 +``` + +## Bundled MinIO Setup + +When using the bundled MinIO option through the setup script, you get: + +### Automatic Configuration + +- **Storage Service**: MinIO running in a Docker container +- **Credentials**: Auto-generated secure access keys +- **Bucket**: Automatically created `formbricks-uploads` bucket +- **SSL**: Automatic certificate generation for the files subdomain + +### Access Information + +After setup, you'll see: + +```bash +🗄️ MinIO Storage Setup Complete: + • S3 API: https://files.yourdomain.com + • Access Key: formbricks-a1b2c3d4 + • Bucket: formbricks-uploads (✅ automatically created) +``` + +### DNS Requirements + + + **Critical for MinIO**: The subdomain configuration is mandatory for MinIO to function. Without proper + subdomain DNS setup, MinIO will fail to work entirely. + + +For the bundled MinIO setup, ensure: + +1. **Main domain**: `yourdomain.com` points to your server IP +2. **Files subdomain**: `files.yourdomain.com` points to your server IP (this is required for MinIO to work) +3. **Firewall**: Ports 80 and 443 are open in your server's firewall +4. **DNS propagation**: Allow time for DNS changes to propagate globally + +## Docker Compose Configuration + +For manual setup, update your `docker-compose.yml`: + +```yaml +services: + formbricks: + image: ghcr.io/formbricks/formbricks:latest + environment: + # ... other environment variables ... + + # S3 Storage Configuration + S3_ACCESS_KEY: your_access_key + S3_SECRET_KEY: your_secret_key + S3_REGION: us-east-1 + S3_BUCKET_NAME: your-bucket-name + S3_ENDPOINT_URL: https://your-endpoint.com # Optional + S3_FORCE_PATH_STYLE: 1 # For third-party services + volumes: + - uploads:/home/nextjs/apps/web/uploads/ # Still needed for temporary files +``` + +## Security Considerations + +### S3 Bucket Permissions + +Configure your S3 bucket with a least-privileged policy: + +1. **Scoped Public Read Access**: Only allow public read access to specific prefixes where needed +2. **Restricted Write Access**: Only your Formbricks instance should be able to upload files +3. **CORS Configuration**: Allow requests from your Formbricks domain + +Example least-privileged S3 bucket policy: + +```json +{ + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Principal": "*", + "Resource": "arn:aws:s3:::your-bucket-name/uploads/public/*", + "Sid": "PublicReadForPublicUploads" + }, + { + "Action": ["s3:PutObject", "s3:PutObjectAcl"], + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam::123456789012:user/formbricks-service" + }, + "Resource": "arn:aws:s3:::your-bucket-name/*", + "Sid": "AllowFormbricksWrite" + } + ], + "Version": "2012-10-17" +} +``` + +### MinIO Security + +When using bundled MinIO: + +- Credentials are auto-generated and secure +- Access is restricted through Traefik proxy +- CORS is automatically configured +- Rate limiting is applied to prevent abuse +- A bucket policy with the least privileges is applied to the bucket + +## Troubleshooting + +### Common Issues + +**Files not uploading:** + +1. Check that S3 credentials are correct +2. Verify bucket exists and is accessible +3. Ensure bucket permissions allow uploads from your server +4. Check network connectivity to S3 endpoint + +**Images not displaying in surveys:** + +1. Verify bucket has public read access +2. Check CORS configuration allows requests from your domain +3. Ensure S3_ENDPOINT_URL is correctly set for third-party services + +**MinIO not starting:** + +1. **Verify subdomain DNS**: Ensure `files.yourdomain.com` points to your server IP (this is the most common issue) +2. **Check DNS propagation**: Use tools like `nslookup` or `dig` to verify DNS resolution +3. **Verify ports**: Ensure ports 80 and 443 are open in your firewall +4. **SSL certificate**: Check that SSL certificate generation completed successfully +5. **Container logs**: Check Docker container logs: `docker compose logs minio` + +### Testing Your Configuration + +To test if file uploads are working: + +1. **Admin Panel**: Try uploading a project logo in the project settings +2. **Survey Editor**: Attempt to add a background image to a survey +3. **Question Types**: Create a 'File Upload' or 'Picture Selection' question +4. **Check Logs**: Monitor container logs for any storage-related errors + +```bash +# Check Formbricks logs +docker compose logs formbricks + +# Check MinIO logs (if using bundled MinIO) +docker compose logs minio +``` + +For additional help, join the conversation on [GitHub Discussions](https://github.com/formbricks/formbricks/discussions). diff --git a/docs/xm-and-surveys/core-features/email-customization.mdx b/docs/xm-and-surveys/core-features/email-customization.mdx index c1b6ab473c..c8ae3b1803 100644 --- a/docs/xm-and-surveys/core-features/email-customization.mdx +++ b/docs/xm-and-surveys/core-features/email-customization.mdx @@ -4,14 +4,16 @@ description: "Branding the emails that are sent to your respondents." icon: "envelope" --- + + **Self-Hosting Requirements**: Uploading custom organization logos for emails requires file upload storage + to be configured. If you're self-hosting Formbricks, make sure to [configure file + uploads](/self-hosting/configuration/file-uploads) before using this feature. + + Email branding is a white-label feature that allows you to customize the email that is sent to your users. You can upload a logo of your company and use it in the email. - - Email branding is part of the Formbricks [Enterprise Edition](/self-hosting/advanced/license). - - - Only the Owner and Managers of the organization can modify the logo. - +Email branding is part of the Formbricks [Enterprise Edition](/self-hosting/advanced/license). +Only the Owner and Managers of the organization can modify the logo. ## How to upload a logo diff --git a/docs/xm-and-surveys/core-features/styling-theme.mdx b/docs/xm-and-surveys/core-features/styling-theme.mdx index 8f0d1be055..12ee42d0d4 100644 --- a/docs/xm-and-surveys/core-features/styling-theme.mdx +++ b/docs/xm-and-surveys/core-features/styling-theme.mdx @@ -1,10 +1,15 @@ --- title: "Styling Theme" -description: - "Keep the survey styling consistent over all surveys with a Styling Theme. Customize the colors, fonts, and other styling options to match your brand's aesthetic." +description: "Keep the survey styling consistent over all surveys with a Styling Theme. Customize the colors, fonts, and other styling options to match your brand's aesthetic." icon: "palette" --- + + **Self-Hosting Requirements**: Uploading custom background images and brand logos requires file upload + storage to be configured. If you're self-hosting Formbricks, make sure to [configure file + uploads](/self-hosting/configuration/file-uploads) before using these features. + + Keep the survey styling consistent over all surveys with a Styling Theme. Customize the colors, fonts, and other styling options to match your brand's aesthetic. ## Configuration @@ -20,7 +25,6 @@ In the left side bar, you find the `Configuration` page. On this page you find t ![Form styling options UI](/images/xm-and-surveys/core-features/styling-theme/form-settings.webp) - - **Brand Color**: Sets the primary color tone of the survey. - **Text Color**: This is a single color scheme that will be used across to display all the text on your survey. Ensures all text is readable against the background. - **Input Color:** Alters the border color of input fields. @@ -63,17 +67,14 @@ Customize your survey with your brand's logo. ![Choose a link survey template](/images/xm-and-surveys/core-features/styling-theme/step-five.webp) - 3. Add a background color: If you’ve uploaded a transparent image and want to add background to it, enable this toggle and select the color of your choice. ![Choose a link survey template](/images/xm-and-surveys/core-features/styling-theme/step-six.webp) - 4. Remember to save your changes! ![Choose a link survey template](/images/xm-and-surveys/core-features/styling-theme/step-seven.webp) - The logo settings apply across all Link Surveys pages. ## Overwrite Styling Theme diff --git a/docs/xm-and-surveys/surveys/general-features/add-image-or-video-question.mdx b/docs/xm-and-surveys/surveys/general-features/add-image-or-video-question.mdx index f68677906e..24cf4c7445 100644 --- a/docs/xm-and-surveys/surveys/general-features/add-image-or-video-question.mdx +++ b/docs/xm-and-surveys/surveys/general-features/add-image-or-video-question.mdx @@ -4,6 +4,12 @@ description: "Enhance your questions by adding images or videos. This makes inst icon: "image" --- + + **Self-Hosting Requirements**: Adding images to questions requires file upload storage to be configured. If + you're self-hosting Formbricks, make sure to [configure file + uploads](/self-hosting/configuration/file-uploads) before using this feature. + + ## How to Add Images Click the icon on the right side of the question to add an image or video: @@ -25,6 +31,6 @@ Toggle to add a video via link: We support YouTube, Vimeo, and Loom URLs. - **YouTube Privacy Mode**: This option reduces tracking by converting YouTube - URLs to no-cookie URLs. It only works with YouTube. + **YouTube Privacy Mode**: This option reduces tracking by converting YouTube URLs to no-cookie URLs. It only + works with YouTube. diff --git a/docs/xm-and-surveys/surveys/link-surveys/link-settings.mdx b/docs/xm-and-surveys/surveys/link-surveys/link-settings.mdx index 5d9b3665d8..7e9d21234e 100644 --- a/docs/xm-and-surveys/surveys/link-surveys/link-settings.mdx +++ b/docs/xm-and-surveys/surveys/link-surveys/link-settings.mdx @@ -4,6 +4,12 @@ description: "Customize link titles, descriptions, and preview images to make yo icon: "gear" --- + + **Self-Hosting Requirements**: Adding a preview image requires file upload storage to be configured. If + you're self-hosting Formbricks, make sure to [configure file + uploads](/self-hosting/configuration/file-uploads) before using this feature. + + ## What are Link Settings? Link Settings allow you to configure the metadata (Open Graph tags) for your survey links, controlling how they appear when shared: @@ -14,7 +20,6 @@ Link Settings allow you to configure the metadata (Open Graph tags) for your sur ![Link Settings](/images/xm-and-surveys/surveys/link-surveys/link-settings/link-settings.webp) - ## Configuring Link Metadata @@ -22,21 +27,22 @@ Link Settings allow you to configure the metadata (Open Graph tags) for your sur Navigate to your survey's Summary page and click the **Share survey** button in the top toolbar. - - In the Share Modal, click on the **Link Settings** tab to access the customization options. - + + In the Share Modal, click on the **Link Settings** tab to access the customization options. + - - Enter a title for your survey link. This will appear as the main headline when your link is shared. - + + Enter a title for your survey link. This will appear as the main headline when your link is shared. + - - Write a brief description for your survey. This will appear as the description of your Survey Link. - + + Write a brief description for your survey. This will appear as the description of your Survey Link. + - - Add a custom image that will display when your link is shared. This makes your survey more visually appealing and can increase engagement. - + + Add a custom image that will display when your link is shared. This makes your survey more visually + appealing and can increase engagement. + Click **Save** to apply your link settings. These changes will take effect immediately for all future link shares. diff --git a/docs/xm-and-surveys/surveys/question-type/file-upload.mdx b/docs/xm-and-surveys/surveys/question-type/file-upload.mdx index 4ac4e7b049..0d890768a0 100644 --- a/docs/xm-and-surveys/surveys/question-type/file-upload.mdx +++ b/docs/xm-and-surveys/surveys/question-type/file-upload.mdx @@ -4,6 +4,12 @@ description: "The File Upload question type allows respondents to upload files r icon: "upload" --- + + **Self-Hosting Requirements**: This question type requires file upload storage to be configured. If you're + self-hosting Formbricks, make sure to [configure file uploads](/self-hosting/configuration/file-uploads) + before using this feature. + +