Announcing two new features: Object storage & long-running Jobs 🚀

Hello folks! :wave:

We’re excited to introduce two powerful additions to the Freshworks Developer Platform that open up new possibilities for building more scalable, secure, and cost-effective apps: Object Storage and Long-running Jobs. :tada:

1. Object Storage :card_index_dividers:

With Object Storage, you can now store and retrieve files like images, documents, and JSON blobs directly from your app — no need for third-party services or custom backend infrastructure.

Use Cases

  • Store customer-uploaded profile images or documents.
  • Save JSON blobs from APIs or user interactions.
  • Attach supporting documents to tickets, deals, or custom objects.
  • Temporarily cache files with auto-expiry to reduce storage usage.

Why use it?

Security: Files are stored within the Freshworks ecosystem — no external transfer or risk.

Cost Efficiency: Eliminate paid cloud storage services or self-hosted file servers.

Reliability: Built-in support for file lifecycle management (auto-delete with expiry).

Be sure to stop your subscription for the image storage services or the server that you spin up to store files that you never used again.

2. Jobs :stopwatch:

Say hello to Jobs, our new capability that allows you to run serverless functions asynchronously for longer durations. Perfect for time-consuming tasks such as bulk data imports or interacting with slow APIs, helping you bypass the time limits of standard serverless functions.

Use Cases

  • Importing/exporting large datasets from CRMs or external tools.
  • Periodically syncing data from slow third-party APIs.
  • Performing batch operations across multiple tickets, contacts, or records.

Why use it?

Scalability: Offload time-consuming operations to background jobs.

Reliability: Jobs run independently of the user interface, reducing timeout errors.

Security: Handled within Freshworks’ execution layer, avoiding external job queues and dedicated authentication mechanisms.

Beware, it comes with concurrency limits. Jobs can’t run forever like Forrest Gump.

Getting Started :checkered_flag:

To start using these features, update to the latest FDK (v9.4.0).

Both capabilities are available right away — check out the docs and sample app to get going quickly.

Resources

Object Storage: Documentation, Sample app
Jobs: Documentation, Sample app

Note: Currently, these two features are not available for Freshdesk. They are supported across other Freshworks products, and we’re actively working on bringing Freshdesk support soon. Stay tuned!

As always, we’d love to hear your feedback. Let us know how you’re using these features or share your use cases in the comments below :point_down:

Happy Coding!

1 Like

This sounds super exciting. Can’t wait to make use of these services to unlock new possibilities with apps on the Freshworks Marketplace. I’m specifically interested in the object storage service that will enable apps to store and display images.

2 Likes

This is such a solid update — can’t wait to try it out!

In the past, we’ve seen many customers drop projects simply because they couldn’t afford a middleware service, which was required even for something as basic as hosting a single file.

These features look like real game changers! I believe they’ll help eliminate those blockers and encourage both developers and customers to take on more projects, despite previous limitations.

Kudos, team!

2 Likes

@arunrajkumar235 @Bene_Immanuel Thank you for your first look feedback!

These features come from repeated feedback from the community members including you folks. Hope it unlocks new opportunities and unblock some bottlenecks.

Keep using these features in your new projects and let us know your feedback to improve the platform.

2 Likes

Hi, nice work!
However, I’m a bit confused about the server-side part.

When looking at the sample in the documentation, I noticed that the fs module is being used in server.js to write to the sandbox.
As far as I remember, using the fs module isn’t allowed—at least not in serverless apps. When I try to get the sample code to work, I get the error:
“fs is not in manifest”, which I believe is the root of the problem.
So, how should I write to the sandbox from the server-side in a compliant way?

Best
Lars
from the doc:

// Create file content
const csvData = [
  ['id', 'name', 'status'],
  ['1', 'Router A', 'Active'],
  ['2', 'Router B', 'Inactive'],
  ['3', 'Router C', 'Active']
].map(row => row.join(',')).join('\n');

// Get Serverless app sandbox path
const sandboxPath = $files.getSandboxedPath();

// Write the file into the path
fs.writeFileSync(`${sandboxPath}/sample.csv`, csvData);

// Upload the file from the sandbox path
$files.upload({
  "file": `${sandboxPath}/sample.csv`,
  "description": "kyc approve document",
  "expires_at": "2019-01-29T13:07:32+05:30",
  "tag": "First-quarter"
 });

I took another approach and skipped fs, and used fs-extra instead. This worked fine and validates ok.

server.js:
const fs = require(‘fs-extra’);
exports = {
onTicketCreateHandler: async function() {
try {
// 1. Create CSV-stuff
const csvData = [
[‘id’, ‘name’, ‘status’],
[‘1’, ‘Router A’, ‘Active’],
[‘2’, ‘Router B’, ‘Inactive’],
[‘3’, ‘Router C’, ‘Active’]
].map(row => row.join(‘,’)).join(‘\n’);

  // 2. write to sandbox
  const sandboxPath = $files.getSandboxedPath();
  const filePath = `${sandboxPath}/sample.csv`;
  console.log("SandboxPath:", sandboxPath);

  await fs.outputFile(filePath, csvData);

  // 3.upload file
  const result = await $files.upload({
    file: filePath,
    description: "CSV export"
  });

  console.log("Upload result:", result);
} catch (error) {
  console.error("Error in handler:", error.message);
}

}
};

manifest.json :
{
“platform-version”: “3.0”,
“modules”: {
“common”: {
“events”: {}
},
“service_ticket”: {
“events”: {
“onTicketCreate”: {
“handler”: “onTicketCreateHandler”
}
}
}
},
“engines”: {
“node”: “18.19.1”,
“fdk”: “9.4.2”
},
“dependencies”: {
“fs-extra”: “11.3.0”
},
“permissions”: {
“files”: {
“upload”: true
}
},
“app”: {
“tracking_id”: “xo3iyfyehr2zw2q0qaum”
}
}