All articles

Your first Centazio integration: from AppSheet to ClickUp

Here is a common first integration request. Field staff record jobs in an AppSheet app while the project team plans work in ClickUp. Someone then spends part of each week copying records from one to the other. Both tools do their own jobs well enough. The trouble is the manual copy between them, which is slow and goes out of date as soon as anyone edits a record on one side.

We built Centazio for this kind of work and released it as open source. It is an MIT-licensed data integration, workflow and master data platform for .NET, and PicNet has maintained it since March 2025 (awesome-dotnet-core PR #965). This post belongs to our Centazio in Practice series. It follows the getting-started guide in the Centazio readme step by step and explains what each generated piece is for. Where the readme leaves something unspecified, we tell you that and don’t guess.

Before you start

The CLI ships as a .NET global tool, so you need the .NET SDK installed. The readme lists the .NET version that the current release targets. We haven’t repeated it here because it will change between releases.

You will also need API credentials for both systems: a ClickUp API token, plus access to the AppSheet app’s API. Have them ready for the secrets step.

Install the CLI

The readme installs the Centazio CLI with one command:

dotnet tool install --prerelease --global Centazio.Cli

--global puts the centazio command on your path so you can run it from any folder. --prerelease lets dotnet tool pick preview builds as well as stable ones. A stable 0.2.0 release is also on NuGet (PR #965). If your organisation only allows stable packages on developer machines, check with whoever owns that policy before you run the command as written.

Keep secrets in dev.env, outside the repo

The readme puts credentials in a dev.env file that sits outside the repository folder. Git can’t commit a file that isn’t inside the repo, so you can’t push it by accident. That matters because a ClickUp token committed to Git stays in the history of every clone, and the only fix is to rotate the token.

For the exact variable names and the location where Centazio looks for the file, use the readme. We haven’t guessed either one here.

On anything other than a developer laptop, use a proper secrets store. The Centazio source includes an AWS Secrets Manager loader (AwsSecretsLoader), which suits deployments on AWS.

Generate the solution

centazio gen sln

This command creates a .NET solution with the scaffolding an integration needs. The readme names the parts below, and you can open the generated solution to see where each one sits.

  • CoreEntityTypes holds the definitions of your core entities. These are shared shapes, such as a task, that don’t belong to either system. AppSheet data and ClickUp data each map onto them. Because each system maps to the core model, you never write a direct AppSheet-to-ClickUp mapping. A third system added later maps to the same core entities and leaves the existing mappings alone.
  • The SQLite Core Storage repository is where promoted core entities are stored. SQLite keeps everything in one file on disk, so you can run the whole integration locally without a database server.
  • Settings and Secrets keep ordinary configuration apart from credentials. In development, Secrets loads from your dev.env. With the two separated, you can commit and review settings in pull requests while credentials stay out of source control.

Add the ClickUp read function

centazio gen func -type read -system ClickUp

We’ve used the readme’s command exactly as written, so the walkthrough starts on the ClickUp side. The generated function is a scaffold. You fill in the ClickUp API call that fetches records, and the function stages the raw results for the next step.

A read function does that one job and no more. It doesn’t transform anything, and it never calls AppSheet. If ClickUp’s API is slow or returns errors, this is the only function affected.

Add the promote and write functions

The readme then adds the matching promote and write functions with the same centazio gen func generator. We’ve reproduced only the read command in this post, so take the exact arguments for the other two from the readme.

The promote function turns staged records into core entities in Core Storage, using the types in CoreEntityTypes. This is the place to check the data and decide what to accept. For example, a ClickUp task with no due date might be fine inside ClickUp but no use to a field team. Promote is where you reject that record or give it a default.

The write function takes core entities and sends them to the target system’s API. Everything it sees has already been promoted, so it never deals with raw API output from the other system.

Why each step is its own function

Splitting the pipeline into read, promote and write means more files. The reason for the split is how it handles failure. When one script reads, transforms and writes in a single pass, a failure halfway through leaves you unsure what made it across. With separate functions, each step starts from data the previous step has already saved. Say AppSheet’s API rejects a write. The read and promote results are still in storage, and the write can retry later without calling ClickUp again.

You can also test each piece on its own. A unit test can give a promote function a staged record with no network connection. You can run a read function against ClickUp and nothing gets written to the other system. When a sync goes wrong in production, the failing function tells you where to look.

Limitations and costs

  • SQLite Core Storage is fine for development and small single-instance setups. Running several instances, or needing a managed database with backups, is a decision to make before production. The getting-started steps covered here don’t deal with it, so check the repository documentation for other storage options.
  • Centazio is a .NET framework, so you need someone who can write and maintain C#. For a one-off sync of a few fields, a no-code connector may cost less overall.
  • The project is young. The stable 0.2.0 release was published in October 2026. Pin your package versions and read the changes before you upgrade.
  • Core Storage holds copies of your records. If your ClickUp tasks or AppSheet rows contain personal information, the SQLite file carries the same Privacy Act 1988 obligations as the source systems. Keep it off unencrypted laptops and out of shared folders.

By the end of the readme you have a solution on your own machine that reads from ClickUp, promotes records into a local SQLite store and writes them out through a separate function. Each of those steps can fail and retry without affecting the others.

PicNet builds production AI systems and integrations for Australian organisations. Talk to us about what a first project could look like.

All articles