Catalyst Project Basics — Reference
Project Constraints (Know Before Creating)
- First project must be created from the console —
catalyst initcan create subsequent projects from the CLI, but the very first one must be done at https://console.catalyst.zoho.com. - Project name rules — alphanumeric, underscores (
_), and hyphens (-) only. No spaces or special characters. - 50-project limit per account — contact support@zohocatalyst.com to request an increase.
- Console URL differs by data center:
- US and others:
https://console.catalyst.zoho.com/baas/index - EU:
https://console.catalyst.zoho.eu/baas/index - IN:
https://console.catalyst.zoho.in/baas/index
- US and others:
"Start Exploring" Requirement
Before any service can be deployed to Production, a user must click "Start Exploring" for that service in the Catalyst console. This is a one-time activation per service per project — without it, deploying that service to Production is blocked. This applies to all services: Slate, Functions, AppSail, Data Store, etc.
Project Directory Structure
When catalyst init is run, a standard project layout is created:
my-catalyst-project/
├── catalyst.json # Auto-generated project config — NEVER create manually
├── .catalystrc # Auto-generated project identity — NEVER create manually
├── functions/ # All server-side functions
│ └── function_name/
│ ├── index.js # Entry point (Node.js)
│ ├── catalyst-config.json # Function-specific config
│ ├── package.json
│ └── node_modules/
├── my-slate-app/ # Slate frontend (PREFERRED for new projects)
│ └── catalyst-config.json
├── client/ # ⚠️ LEGACY — use Slate instead
└── appsail/ # AppSail services (optional)
├── app.js
├── catalyst-config.json
└── package.jsonKey rules:
- The
functions/directory name is fixed and cannot be renamed. - Each function must be in its own subdirectory under
functions/. - For frontends, always use Slate — do NOT select "Client" during
catalyst init, it is legacy. catalyst.jsonand.catalystrcare auto-generated — NEVER create them manually.
catalyst.json
Holds deployment configuration. Auto-generated by the CLI.
{
"functions": {
"targets": ["myFunction1", "myFunction2"],
"ignore": [],
"source": "functions"
},
"appsail": {
"targets": ["my-appsail-service"],
"source": "appsail"
},
"slate": [
{ "name": "my-frontend", "source": "/absolute/path/to/client" }
]
}- The
functionsblock must includetargets,ignore, andsourceor CLI errors. - Slate
sourcemust be an absolute path.
.catalystrc — Project Identity File
{
"project_id": "YOUR_PROJECT_ID",
"project_domain": "your-app-YOUR_ENV_ID.development",
"env_id": "YOUR_ENV_ID",
"timezone": "Asia/Kolkata"
}Contains project_id, env_id, project_domain, and timezone. If missing, catalyst deploy fails.
catalyst-config.json for Functions
{
"deployment": {
"name": "my_function",
"type": "advancedio",
"stack": "node20",
"env_variables": {}
},
"execution": {
"main": "index.js"
}
}Valid type values (use exactly as shown — do not change this after function creation):
| Function Type | type value |
|---|---|
| Basic I/O | basicio |
| Advanced I/O | advancedio |
| Cron | cron |
| Job | job |
| Event | event |
| Integration | integration |
| Browser Logic | browserlogic |
browserlogic— NOTbrowselogic.
Valid stack values: node24 (recommended), node22, node20, node18, node16, node14, node12, java25, java21, java17, java11, java8, python_3_13, python_3_12, python_3_11, python_3_10
Environments
Catalyst has two environments:
- Development (sandbox): CLI deploys go here. Free to use within limits. Used for testing.
- Production: Requires billing setup. Serves live traffic. Deployed from the console, not CLI.
Application URL Format
| Environment | URL Pattern | Example |
|---|---|---|
| Development | https://{project-domain}.development.catalystserverless.com |
https://shipmenttracking-57673975.development.catalystserverless.com |
| Production | https://{project-domain}.catalystserverless.com |
https://shipmenttracking-57673975.catalystserverless.com |
The project domain is auto-generated when you first host a web client.
Dev-to-Prod promotion checklist
- Verify in Development — all functions, AppSail, and frontend working correctly.
- Set up billing — Catalyst Console → Settings → Billing.
- Deploy to Production — Console → Deploy → select Production environment.
- Update environment variables — Production uses separate env vars.
- Reconfigure social login — OAuth redirect URLs must point to the Production domain.
- Map custom domain — Console → Domain Mapping → add your production domain.
- Test the full flow — auth, data, file uploads, email — all on the Production URL.
- Monitor — enable APM and Application Alerts for Production.
Catalyst IDs Quick Reference
| ID | What | Where to Find | Format |
|---|---|---|---|
| Project ID | Project identifier | Settings → General; .catalystrc; catalyst projects:list |
Numeric string |
| API Key | API Gateway auth key | Settings → Environments → General tab | String (common in Dev across all projects; unique per project in Prod) |
| Table ID | Data Store table | Cloud Scale → Data Store → click table | Numeric |
| ROWID | Data Store row | Auto-assigned; returned in queries | BigInt |
| Segment ID | Cache segment | Cloud Scale → Cache → segment list | Numeric |
| Function ID | Serverless function | Serverless → Functions → function details | Numeric |
| Circuit ID | Circuits workflow | Serverless → Circuits → circuit details | Numeric |
| Pool ID | Job Scheduling pool | Job Scheduling → pool details | Numeric |
| Bot ID | ConvoKraft bot | ConvoKraft → bot details | String |
| ZUID | Zoho user (per-app) | Auth API responses; Authentication → Users | Numeric string |
| User ID | Catalyst-only user | Auth API responses; Authentication → Users | Numeric |
| Org ID / ZAAID | Organization | Auth API responses; Authentication → Users | Numeric string |
| Bucket Name | Stratus bucket | Cloud Scale → Stratus | String |
| Collection Name | NoSQL collection | Cloud Scale → NoSQL | String |
Table / Column IDs
// Access by name (case-sensitive — must match console exactly)
const table = catalystApp.datastore().table('Employees');
// Access by ID (from Console → Data Store → click table)
const table = catalystApp.datastore().table(1510000000110121);Segment ID (Cache)
// Segment ID from Console → Cache → segment list
const segment = catalystApp.cache().segment(SEGMENT_ID);Pool ID (Job Scheduling)
// Pool ID from Console → Job Scheduling → pool details
// ⚠️ There is NO .pool(POOL_ID) accessor in the Node SDK. Pools are read-only:
const pool = await catalystApp.jobScheduling().getJobpool(POOL_ID);
// Jobs/crons take the pool by name or id INSIDE their payload:
// jobScheduling().job().submitJob({ ..., jobpool_id: POOL_ID })Catalyst Organizations
Catalyst supports multiple organizations per account under the same email address.
Key concepts
- Org owner: Created the org. Can add collaborators (admins or project members), grant permissions per org or per project.
- Collaborator types:
Admin(org-wide access) orProject Member(scoped to specific projects). Permissions are based on the assigned profile. - Org ID: Auto-generated unique ID for each org. Part of the console URL:
https://console.catalyst.zoho.com/baas/{OrgID}/index - Default org: The org Catalyst assigns you to at signup. Can be changed to any other org you own.
Default organization behavior — critical for MCP and API usage
The default org affects everything:
- CLI login — always logs into the default org unless you switch explicitly.
- Every API call — executed against a project in the default org unless you pass the
CATALYST-ORG: {org_id}header explicitly. - MCP tools —
CatalystbyZoho_*calls target the default org; always callList_All_Organizationsfirst to confirm the correct org, then pass its ID in subsequent calls.
Cannot delete the default org. Set a different org as default before attempting to delete.
Accessing the multi-org organization
Console → profile icon (top-left) → Organizations dropdown → Manage Organizations
The organization view shows each org's unique ID and console URL.
Switching organizations via CLI
catalyst whoami # shows current logged-in user
catalyst switch:org # interactive org selector (arrow-key menu)IaC Export / Import
Catalyst supports project export and import (Infrastructure as Code) for migrating between data centers, duplicating projects, or sharing project templates.
What is exported
- ✅ Component configurations (Data Store schema, Cache segments, Circuits, Security Rules, API Gateway routes, email templates, user profiles, etc.)
- ✅ Function and client code
- ❌ Data is NOT exported — no DataStore rows, no file contents, no user list records
How to export
Console → Settings → General → Export Project → downloads a ZIP file in Catalyst IaC format.
Also available via CLI:
catalyst project:export # export to local directory
catalyst project:export --zip # generate import-ready ZIPHow to import
Console → index page → Import Project → upload the ZIP → new project is created.
Also available via CLI:
catalyst project:import --file ./my-project.zipCommon use cases
| Use case | How |
|---|---|
| Move project to a different DC (e.g., US → EU) | Export → log into EU console → Import |
| Duplicate a project for a new client | Export → Import as new project in same or different org |
| Test a GitHub-hosted project | Clone repo → generate ZIP → import and test |
| CI/CD project templating | Script catalyst project:export + catalyst project:import |
Common Errors
| Error | Cause | Fix |
|---|---|---|
catalyst init fails with "project already exists" |
Re-running init in a directory that already has catalyst.json |
Delete catalyst.json and .catalystrc and re-run, or use catalyst init in a fresh directory |
No project found when running catalyst deploy |
Working directory has no catalyst.json |
Run catalyst init first, or cd to the correct project root |
Environment not switching after catalyst env:switch |
Session-level env cached | Run catalyst login again after switching environments |
Permission denied on deploy |
API key lacks deploy permissions for this project | Confirm the key has Developer or higher role in Console → Project Settings |