The GalleryCamp mark: a banana taped to a wall

For galleries, dealers and art spaces

Send the room. Find out what held them.

GalleryCamp is the whole back office — inventory, artists, collectors, consignments, orders, invoices — organised around the one thing a PDF price list can never do. Every collector gets their own way in, and the room reports back.

14-day free trial · cancel anytime

gallerycamp.com/dashboard
The GalleryCamp dashboard: recent collector inquiries, inventory by status, and the artists carrying the programme.
A real screen, not a rendering — and the gallery in it is the demo gallery GalleryCamp ships with, so Sofia Calder, Mina Kim and every figure on the page are invented. You can import that same gallery into a new account and have something to click on before you have typed anything in.

Artwork-first, not product-first.

An artwork is not a SKU with a photograph attached. Editions are individual records, provenance is a dated chain you can reorder, and a condition report is added rather than edited — so the record stays evidence of a day rather than a field somebody overwrote.

One link per person.

A viewing room is not a URL you send to forty people. Each recipient gets their own, with a private note only they see, which is the whole reason anything that happens afterwards can be attributed to anyone.

The gaps are published.

There is a comparison table further down with 36 capabilities and six rivals on it, and 10 of the rows are ones GalleryCamp loses outright. It is the product's own table, printed here unedited.

Viewing rooms

The room comes back with something.

A price list leaves the building and nothing returns. A room built for one person returns three things a gallery can act on the same week: that it was opened, how long they stayed, and — ranked rather than timed — which works held them.

  1. 01Curate

    Build the room

    Pull works straight from the archive, or start from an exhibition already installed. Set the order, open with a statement in your own voice, and write a caption that belongs to this presentation only — “the one I held back in Basel” is true of a room, not of the work.

  2. 02Send

    One link per person

    Every collector, advisor and curator gets their own way in, with a private note at the top that no other recipient sees. Add a passcode when the work warrants it, set when the room opens and closes, and check your own work through a preview link that leaves no trace.

  3. 03Read

    See what the room did

    Who opened it, how long they stayed, and which works held them — ranked rather than timed, because an order survives the noise in a way a stopwatch never does. Inquiries arrive already attached to the person, the room and the exact work.

gallerycamp.com/dashboard/rooms
A private viewing room being built: six works in order, with price visibility set per work.
Building it. The order here is the order the collector sees, and the introduction is written once for the room rather than borrowed from any artwork record.

And then reading it.

The panel on the right is drawn rather than screenshotted — click a recipient — and it is looking at the same six works as the window above it. The figures are invented. The shape is not: per-work attention is only ever a rank and a share, never a stopwatch reading, because an order survives the noise in a way seconds-per-work does not. The one clock on screen is the length of the whole sitting, which is the only duration a room can honestly report.

The fourth recipient has not opened it, and she is in the list anyway. A readout that quietly drops the collectors who never turned up is a highlight reel, and the silence is often the more useful of the two readings.

Works on Paper

Six works · 4 recipients · closes in 9 days

Activity
11m 40s across 3 visitsOpened 2 days ago, 9:14pm

Works ranked by attention, not timed — the order is the finding.

  1. 1Theo Mercer,Small Afterimage No. 4zoomedinquired
  2. 2Theo Mercer,Afterimage Fieldzoomed
  3. 3Noor Haddad,Night Bloom
  4. 4Amara Okafor,Inheritance Study III
  5. 5Clara Bell,Still Life with Green Vessel
  6. 6Jun Park,Grid Variation No. 7

The inquiry arrived on the desk already attached to Mina Kim, to this room, and to that exact work — with whether the price had been shown recorded alongside it.

Opens and closes

A published room can still be shut. The schedule is what creates the urgency the whole format runs on.

Optional passcode

A second factor on top of the link itself, for the rooms where the link alone is not enough.

Price, per room

Shown, on request, or hidden — set for the room or for a single work, without ever editing inventory.

A preview that stays quiet

Check your own room through a preview link that records no opens and no figures. Reading your own room should not look like a collector reading it.

The telescope is optional

Opens are always recorded — a gallery has to know its mail arrived. Per-artwork attention is a switch, off whenever you or your jurisdiction would rather it were.

Machines do not count

Link scanners and mail previewers are filtered out, so a security appliance never arrives looking like an interested collector.

What is actually measured

A number nobody can check is worse than none.

Engagement figures are the easiest thing in this category to quietly inflate, so here is the whole mechanism. The room sends 11 kinds of event and no twelfth one kept quiet, and every rule below exists to stop something that is not attention being counted as attention.

ROOM_OPENARTWORK_VIEWARTWORK_ZOOMDETAIL_VIEWVIDEO_PLAYPDF_DOWNLOADFAVORITEINQUIRYSHAREHEARTBEATROOM_CLOSE

And the link itself

The token is the credential

Fetching a room is unauthenticated by design — the link is the way in, and the passcode is the second factor when one is set.

A room that has not opened looks like a room that does not exist

Deliberately indistinguishable, because knowing a gallery is preparing something is itself information a forwarded link should not leak.

Fetching a room records nothing

The open arrives separately, from the page, as an event. That is exactly what keeps a corporate mail scanner pulling every link in an inbound message from reading as a collector opening it.

A heartbeat every ten seconds, while the tab is visible

Attention is measured by a page that is actually on screen, not by a tab left open over lunch.

No single event may claim more than sixty seconds

Past a minute it is either a forged payload or a laptop that went to sleep. Neither is attention, and attention is the only thing the number is used for.

At most a hundred events in one beacon

The tail beyond that is dropped rather than trusted.

A session key, held in sessionStorage

A reload continues the same sitting instead of starting a second one, so one collector reading one room stays one visit.

Telemetry never breaks the page

The ingest runs beside the thing the visitor came for, and a failure is logged and swallowed. Losing a row is always better than breaking the room that produced it.

A collector who blocks beacons simply produces no rows

Some of them do. The room renders identically and the gallery reads “opened, no detail” — a supported outcome rather than a failure, and a good deal more honest than a number invented to fill the column.

The archive

Every record as considered as the wall it came off.

The object is the centre of the system rather than a row in a generic inventory. What a gallery actually needs to hold about a work — editions, provenance, condition, location, who has it and on what terms — is structured, not squeezed into a notes field.

gallerycamp.com/dashboard/artworks/…
An artwork record in GalleryCamp, with its images, details and history.
  • Unlimited images and artwork documentation
  • Availability, location, acquisition and consignment status
  • Edition, series, category, medium and dimension fields
  • Internal notes, public descriptions and private pricing
  • A dated provenance chain you can reorder
  • Condition reports added rather than edited, so the record is evidence of a day

The desk

Inquiry to invoice, without leaving.

An invoice is rendered from the order itself, so there is only ever one set of totals to be wrong. Sending one emails the collector a pay link; the money settles to the gallery through Stripe Connect rather than to anybody in between, and a wire or a cheque is recorded next to the card instead of living in someone's inbox.

  • Collector profiles with acquisition and interest history
  • Inquiries from the website, a viewing room, or direct contact
  • Six pipeline stages, offers with an expiry, and holds
  • Orders and invoices rendered from one set of totals
  • Card, ACH and instalments through Stripe Connect, settling to the gallery
  • Cash, cheque and wire recorded alongside the card
  • A five-level artist rate ladder, with statements that freeze their arithmetic
  • Entity-level audit that keeps actor names after staff leave
gallerycamp.com/dashboard/reports/sales
Sales reporting in GalleryCamp.

How it compares

The honest version of the comparison table.

36 capabilities against the six platforms a gallery is most likely to be choosing between. 22 of them are shipped here, 4 are partial, and 10 are not built at all — the filter above the table will take you straight to those. This is GalleryCamp's own matrix, reproduced without edits, and its column is scored from what actually ships rather than from anybody's roadmap.

ShippedPartialNot built

The object — inventory depth

Artwork records, images, multiple locations
ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Editions and prints as structured records

Each impression is its own record — numbered, AP, PP, HC.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Provenance and ownership chain

A dated chain of ownership you can reorder.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Condition reports

Rated inspections with photographs, added rather than edited, so the record is evidence of a day.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Framing, dimension variants, display notes

Dimensions are one text field. No structured variants yet.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Appraisals, valuations, insurance schedules

Not built yet.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
QR and barcode labels, wall tags

Not built yet.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece

Moving the work — consignment and logistics

Consignments in and out

Agreements, per-work lines, partial returns.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Loans and outbound tracking

The loan type drives the work's status on the way out and back.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Artist splits, commissions, payouts

A five-level rate ladder, statements that freeze their arithmetic, and a payment record.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Shipping, crating, customs paperwork

Shipping is a single amount on the order. No crating or customs documents.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Art fair mode — fair lists, on-site sales

Not built yet, though a fair microsite can be run as its own site.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece

The desk — collectors and sales

Collector records with purchase history

Orders, inquiries, rooms and notes on the record. Lifetime value counts paid orders only.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Interests, categories, related contacts

Tags and free-text notes, not a structured interest model.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Inquiry desk

Every inquiry carries its room, its recipient, and whether price was disclosed.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Sales pipeline, offers, deal stages

Six stages, offers with expiry, holds. Accepting an offer raises the order.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Two-way email sync, sending as the dealer

Not built yet. The app sends transactional mail from its own address, not from yours.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Email marketing campaigns

Not built yet.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece

Presentation — rooms, shows, web

Online viewing rooms
ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Per-artwork engagement telemetry

Dwell and zoom per recipient, machine traffic filtered out, plus reads from your public sites attributed to the site that served them.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Per-recipient links, passcode, open and close schedule
ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Tearsheets, price lists, certificates, wall labels

Print-ready, saved as PDF by the browser. Internal prices never print unless you ask for them.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Exhibitions, events, RSVP
ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Public website with custom domain

Several sites per gallery, each with its own branding and selection of works. Custom domains are stored and validated, but nothing routes by them yet.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Blog and editorial publishing
ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece

Money

Invoicing

Rendered from the order itself, so there is only ever one set of totals. Sending one emails the collector a pay link.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Collector payments — card, ACH, instalments

Stripe Connect on the order, so funds settle to the gallery. Cash, cheque and wire are recorded alongside the card.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Multi-currency with conversion

Currency is stored per record. No conversion or roll-up.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Sales tax, VAT, margin scheme

One flat tax amount per document. No rate tables, VAT or margin scheme.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Accounting sync — QuickBooks, Xero

Not built yet.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece

The system

Reporting and analytics

Sales, inventory and engagement, including reads from the public sites.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
iOS or iPad app for fairs and studio visits

Not built. The web app is responsive, which covers some of it.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Public REST API with scoped keys

Self-serve keys your team creates and revokes, with the reference published on this site.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
Roles, permissions, audit log

Entity-level audit that keeps actor names after staff leave.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
CSV import and guided migration

Plus a demo gallery — artists, works, collectors, events, posts — you can import as-is.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece
AI cataloguing, search, recommendations

Not built yet.

ArtlogicArtCloudArternalArtBaseArtwork Arch.Masterpiece

Scored August 2026 from each vendor's own published documentation and pricing. A competitor that has shipped something since is a row that is wrong until somebody updates it, which is why the date is on the page rather than in a comment. Read from: Artlogic — gallery management · Artlogic — pricing · ArtCloud — pricing and plan features · Arternal — product · Arternal — payments · ArtBase — reviews and features · Artwork Archive — for organizations · Masterpiece Manager — inventory.

The table on gallerycamp.com

The API

You should not keep the inventory twice.

The site your designer built stays current on its own: a read-only feed of the work you have marked public, and a route that puts every inquiry it captures back on the desk here, attached to the exact piece. The dashboard's own endpoints are documented too, behind organisation-scoped keys your team creates and revokes — and there is an llms.txt if the thing reading it is not a person.

site/artworks.js
// The feed your own site renders from. No key on it, because everything
// behind it is already marked public — this is a separate surface, not the
// dashboard's with a filter bolted on.
const res = await fetch(
  "https://gallerycamp.com/api/public/galleries/harlan-fine/artworks" +
    "?status=available&limit=24&page=1",
);

const { success, data, meta } = await res.json();
// meta → { total: 61, page: 1, limit: 24, total_pages: 3 }

for (const work of data) {
  render(work);
}
site/inquiry.js
// And the way back in. This lands on the desk in GalleryCamp already
// attached to the work it was sent from.
await fetch(
  `https://gallerycamp.com/api/public/galleries/harlan-fine` +
    `/artworks/${artwork_id}/inquiries`,
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      first_name: form.first_name,
      last_name: form.last_name,
      email: form.email,
      phone: form.phone,
      message: form.message,
      source: "website",
    }),
  },
);

The public surface

https://gallerycamp.com/api/public/galleries/{site}
GET/artworksThe available works, filtered, searched, sorted and paginated
GET/artworks/{id}One work, with its images
POST/artworks/{id}/inquiriesAn inquiry from your site, landing on the desk attached to the work
GET/artistsThe artists carrying the programme
GET/exhibitionsShows, past and current
GET/eventsOpenings and events
POST/events/{id}/rsvpsAn RSVP, from your own page
GET/blogEditorial, if you publish it here
Only what you marked public leaves the building

Internal pricing, private notes and collector records are not reachable from these routes at all — it is a separate surface, not the dashboard's with a filter on it.

Cached for a minute, and stale-while-revalidate

These routes render server-side on every visit to your site. Without a cache one opening night points a few thousand visitors straight at the database; a minute of staleness is invisible on a page about paintings.

Credentials are deliberately not allowed

Any origin may call them from a browser, because there is nothing on the other side worth stealing a cookie for.

The dashboard's own routes are documented too

Organisation-scoped keys, prefixed gc_, created and revoked by your own team — for the endpoints the app itself runs on rather than the ones above.

Price

Three tiers, priced by how much you hold.

Not per seat — the whole gallery is on it either way, because a system the registrar is locked out of is not a system of record. The only line that moves is how many works the archive holds.

Studio

$29/ month

For independent dealers and small galleries building a focused digital archive.

Up to 500 artworks

Gallery

Most galleries
$129/ month

For active galleries managing artists, collectors, exhibitions, inquiries, and sales in one place.

Up to 5,000 artworks

Program

$359/ month

For established programs with deep inventory, multiple shows, art fairs, and a larger collector base.

Up to 50,000 artworks

14-day free trial · cancel anytime. Above 50,000 works it is a conversation rather than a tier. These three come from src/lib/plans.ts — the file the application charges against, not a restatement of it — so a price here that the invoice does not agree with would be a bug rather than marketing. Full pricing.

Moving in

Migrations are where this goes wrong.

Almost every bad experience of gallery software starts on day one, with a blank account and a folder of spreadsheets nobody wants to open. So this part is done with you rather than handed to you as an importer and a tutorial.

Send the exports, the half-finished inventories and the workbook the last director kept. The import files get shaped and checked before anything loads, which is the step that decides whether your first day is a working archive or a mess you have to undo.

  • We shape and check your import files with you before anything loads
  • Artists, artworks, images and references matched and preserved
  • Existing notes carried across with the works they belong to
  • Locations, statuses and pricing configured around your workflow

Fine print

What it will not do.

Every one of these is a row in the table above, pulled straight out of it rather than written separately — so this list cannot get shorter than the table without the table getting shorter too. If one of them is how your gallery runs, you should know now.

Appraisals, valuations, insurance schedules

Not built yet.

QR and barcode labels, wall tags

Not built yet.

Shipping, crating, customs paperwork

Shipping is a single amount on the order. No crating or customs documents.

Art fair mode — fair lists, on-site sales

Not built yet, though a fair microsite can be run as its own site.

Two-way email sync, sending as the dealer

Not built yet. The app sends transactional mail from its own address, not from yours.

Email marketing campaigns

Not built yet.

Sales tax, VAT, margin scheme

One flat tax amount per document. No rate tables, VAT or margin scheme.

Accounting sync — QuickBooks, Xero

Not built yet.

iOS or iPad app for fairs and studio visits

Not built. The web app is responsive, which covers some of it.

AI cataloguing, search, recommendations

Not built yet.

And 4 that are there, but only partly.

Framing, dimension variants, display notes

Dimensions are one text field. No structured variants yet.

Interests, categories, related contacts

Tags and free-text notes, not a structured interest model.

Public website with custom domain

Several sites per gallery, each with its own branding and selection of works. Custom domains are stored and validated, but nothing routes by them yet.

Multi-currency with conversion

Currency is stored per record. No conversion or roll-up.

Give the programme the system it deserves.

Start with the demo gallery already loaded, so there is something to click on before there is anything to type.

14-day free trial · cancel anytimeDocsAPI reference