Internal Systems

The operating system behind CrysoLabs: one admin for clients, contracts, money and marketing

We run CrysoLabs on software we built ourselves: contracts with frozen pricing and locked exchange rates, multi-currency finance, a marketing control room, a synced inbox, and a control plane for every client project we operate.

CrysoLabs Team
· 6 min read
Share
The CrysoLabs homepage: Premium digital products, built with care.

We build internal systems, so we run on one

Most agencies run on a patchwork: a spreadsheet for quotes, a document template for contracts, an accounting tool, an inbox, a chat app, a marketing plugin and a lot of memory.

We build internal systems for other companies, so we decided to run CrysoLabs on one. The CrysoLabs website and its admin panel are a single platform that handles the whole life of a client relationship, from the first inquiry to the software we keep running for them after launch.

This is a tour of what it does, and the design decisions we would recommend to any company building its own.

From inquiry to contract

Work starts on the public site. Project inquiry and lead forms collect what the client needs and how urgent it is, and every submission lands in the admin rather than someone's inbox. Meetings are scheduled and tracked in the same place.

When a project is agreed, it becomes a contract. A contract holds the scope, the selected services, the timeline, the number of included revisions, and the payment plan with its advance and remaining balance.

The money side of a CrysoLabs engagement: transparent scope, milestone billing and no lock-ins

Pricing that stays honest

Contracts can be priced two ways:

  • From the catalog: a pricing plan plus selected services, calculated automatically.
  • Negotiated: a custom price for work that doesn't fit the catalog.

Discounts work in both directions. The team can enter a percentage and see the resulting price, or enter the price agreed and see the percentage it represents. Switching between the two keeps the numbers in sync.

The public pricing page, driven by plans managed in the admin and shown in the visitor's currency

The most important decision is what happens next: the pricing is frozen into the contract when it is created. The plan, services, currency, pricing mode and advance percentage are saved as a snapshot. If the public pricing changes next month, existing contracts still show exactly what the client agreed to.

Exchange rates locked at signing

CrysoLabs works with clients in several currencies. Each contract records its currency, the exchange rate at the time it was created, where that rate came from, and when it was locked. Exchange rates update automatically on weekdays, but a signed contract never moves with them.

Receipts clients can open

Every contract can produce a shareable receipt link. It is read-only and safe to forward, and a client who hasn't created an account yet can use it to set one up. Clients upload proof of payment against the contract, and the team reviews it in the admin.

Delivery in the same system

Once work starts, the contract is where delivery is tracked: progress updates, tasks and comments, revisions used against the number included, adjustments, and client feedback at the end.

Because delivery and money live in the same record, questions like "how many revisions are left?" or "what is still owed?" have one answer, not three.

Money, in more than one currency

The finance section records income and expenses against contracts, with templates for recurring costs. Currency definitions and rates are managed in one place, and financial changes are written to a dedicated audit trail.

It is not trying to replace an accountant. It answers the operational questions quickly: what came in, what went out, and what is outstanding.

A marketing control room

The public website is managed from the admin, not in code. The marketing section controls:

  • announcement bars across the top of the site
  • pop-ups, with frequency limits and close behaviour
  • calls to action and offers
  • events
  • lead forms, by type and urgency
  • personalised placements, which show different content in different zones of a page
  • interaction tracking, so the team can see what visitors actually engage with

Launching a campaign is a settings change, not a deploy.

The newest addition, now rolling out, syncs CrysoLabs' YouTube and Facebook posts every three hours into a homepage section and a dedicated social page. From the admin, the team can see each connection's status and follower count, run a sync on demand, review the sync history, and choose which posts to publish, hide or feature.

One inbox

Client email is synced into the admin, so conversations are handled in the same place as the work. The team can add internal notes to a thread without forwarding it around. Notifications cover the events that need attention.

A control plane for client projects

The part we are proudest of is the one clients never see directly.

Many of the products we build keep running after launch, and we help operate them. Each one is registered in the admin as a managed project, with an installation for each environment, such as production and staging. Every installation records what it can do, which roles it supports and which feature flags it allows.

That registry lets us operate every project from one place:

  • API keys are stored only as hashes, with a short visible prefix to identify them. Each key has scopes and an optional expiry, and can overlap with its replacement for a set period, so keys can be rotated without downtime. Its last use is recorded against a hashed network address.
  • Rate limits are applied per key.
  • Feature flags can be switched per project and installation.
  • Notices, such as maintenance windows, can be targeted at specific installations, with a severity, where they appear and how they can be dismissed.
  • Metric snapshots record how each installation is used over time.
  • Sync logs and an audit log record every exchange with every installation.

We made one rule early: don't duplicate state that lives somewhere else. Uptime is owned by an independent status service. The admin stores only the key that links a project to it, so there is never a second, stale version of whether a system is up.

A daily job applies retention rules to this operational data, so the control plane keeps what it needs and nothing more.

What we would recommend

If you are planning your own internal platform, these are the decisions that paid off for us:

  • Freeze what was agreed. Prices, rates and terms are snapshotted at the moment of agreement.
  • Store money precisely. Amounts are stored in the smallest currency unit, never as floating-point numbers.
  • Put the money next to the work. Contracts, delivery and payments live in one record.
  • Make marketing a setting. The people running campaigns shouldn't need a developer to launch one.
  • Hash every secret. API keys and network addresses are stored as hashes, and keys rotate without downtime.
  • Don't copy state. Link to the system that owns it instead.
  • Audit anything involving money or access.

Why this matters for our clients

This platform is where we test our own ideas first. The contract snapshots, the pricing logic, the marketing tools and the project control plane all started as solutions to our own problems before they shaped the systems we build for clients.

If your company is running on spreadsheets, inboxes and memory, you don't need all of this at once. Start with the workflow that costs you the most time, build it properly, and let the rest grow around it. That is how ours started.

CrysoLabs Team

The CrysoLabs editorial desk - shipping notes from the build floor.

Keep reading