Creating Functions
Base44 functions are serverless backend functions. They are defined locally in your project and deployed to the Base44 backend.Function Directory
All function definitions must be placed in thebase44/functions/ folder in your project. The simplest function is a folder with an entry.ts or entry.js file inside it.
Example structure:
How to Create a Function
- Create a new directory in
base44/functions/with your function name (use kebab-case) - Create
entry.ts(orentry.js) in that directory - Deploy the function using the CLI
Function Discovery
The CLI discovers functions fromentry.ts or entry.js files. A folder that contains one of those files is a function:
Rules:
entry.tsorentry.jsmust be inside a named subfolder, not directly inbase44/functions/- all
*.js,*.ts,*.json, and*.jsoncfiles under the function folder are included when deploying - function paths with a dot in any path segment are ignored
Entry Point File
Functions export a default request handler. Use thenpm: prefix to import npm packages.
Request Object
The function receives a standardRequest object:
req.json()- Parse JSON bodyreq.text()- Get raw text bodyreq.headers- Access request headersreq.method- HTTP method
Response Object
Return usingResponse.json() for JSON responses:
Complete Example
Directory Structure
entry.ts
Using Service Role Access
For admin-level operations, useasServiceRole:
Using Secrets
Read secrets configured in the app dashboard withsecrets.get() from the base44:runtime module. BASE44_APP_ID is pre-populated; set everything else in app settings → environment variables.
Post-Response Work
For work that should finish after the response is sent (analytics pings, non-critical logging), pass the promise towaitUntil() from base44:runtime. The response returns immediately and the function stays alive until the promise settles.
Naming Conventions
- Directory name: Use kebab-case (e.g.,
process-order,send-notification) - Function name: Comes from the directory path under
base44/functions/- Valid:
process-order,orders/process,send_notification,myFunction - Invalid:
process.order,send.notification.v2
- Valid:
- Entry file: Use
entry.tsorentry.js
Deploying Functions
After creating your function, deploy it to Base44:Notes
- Use
npm:prefix for npm packages (e.g.,npm:@base44/sdk), always with a pinned version - Use
createClientFromRequest(req)to get a client that inherits the caller’s auth context - Configure secrets via app dashboard for API keys, and read them with
secrets.get()frombase44:runtime - Crypto is the async Web Crypto API — for Stripe webhooks use
await stripe.webhooks.constructEventAsync(...); the synchronousconstructEvent()throws “SubtleCryptoProvider cannot be used in a synchronous context” - Make sure to handle errors gracefully and return appropriate HTTP status codes
Multi-File Functions
A function is not limited toentry.ts. Any .js, .ts, .json, or .jsonc file in the function’s folder is uploaded on deploy and can be imported from entry.ts with a relative path.
- Import files in the same folder with
./, including the extension (e.g../validate.ts). - The entire function folder ships on every deploy; anything the entry does not import is dropped from the bundle, so extra files are harmless.
Sharing Code Between Functions
To share code across functions, put it inbase44/shared/ — the one directory outside a function folder that the CLI uploads. Its full contents are bundled with every function.
- Shared code must live in
base44/shared/. Files elsewhere outside the function folder are not uploaded. - A relative import can reach a sibling (
./util.ts) orbase44/shared/(../../shared/util.ts) — but nothing further out. An import that escapesbase44/(e.g.../../../src/utils.ts) fails at deploy time; move the file intobase44/shared/instead. - For external packages use
npm:specifiers, not relative paths.