For galleries, dealers and art spaces
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

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.
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.
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
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.
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.
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.
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.

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.
Six works · 4 recipients · closes in 9 days
Works ranked by attention, not timed — the order is the finding.
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.
A published room can still be shut. The schedule is what creates the urgency the whole format runs on.
A second factor on top of the link itself, for the rooms where the link alone is not enough.
Shown, on request, or hidden — set for the room or for a single work, without ever editing inventory.
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.
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.
Link scanners and mail previewers are filtered out, so a security appliance never arrives looking like an interested collector.
What is actually measured
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_CLOSEAnd the link itself
Fetching a room is unauthenticated by design — the link is the way in, and the passcode is the second factor when one is set.
Deliberately indistinguishable, because knowing a gallery is preparing something is itself information a forwarded link should not leak.
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.
Attention is measured by a page that is actually on screen, not by a tab left open over lunch.
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.
The tail beyond that is dropped rather than trusted.
A reload continues the same sitting instead of starting a second one, so one collector reading one room stays one visit.
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.
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
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.

The desk
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.

How it compares
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.
| Capability | GalleryCamp | Artlogic | ArtCloud | Arternal | ArtBase | Artwork Arch. | Masterpiece |
|---|---|---|---|---|---|---|---|
| The object — inventory depth | |||||||
| Artwork records, images, multiple locations | ● | ● | ● | ● | ● | ● | ● |
| Editions and prints as structured recordsEach impression is its own record — numbered, AP, PP, HC. | ● | ● | ● | ● | ● | ● | ● |
| Provenance and ownership chainA dated chain of ownership you can reorder. | ● | ● | ◐ | ● | ● | ● | ◐ |
| Condition reportsRated inspections with photographs, added rather than edited, so the record is evidence of a day. | ● | ● | ◐ | ● | ● | ◐ | ● |
| Framing, dimension variants, display notesDimensions are one text field. No structured variants yet. | ◐ | ● | ● | ◐ | ● | ◐ | ● |
| Appraisals, valuations, insurance schedulesNot built yet. | ○ | ◐ | ◐ | ◐ | ● | ● | ◐ |
| QR and barcode labels, wall tagsNot built yet. | ○ | ● | ◐ | ● | ● | ● | ● |
| Moving the work — consignment and logistics | |||||||
| Consignments in and outAgreements, per-work lines, partial returns. | ● | ● | ● | ● | ● | ◐ | ● |
| Loans and outbound trackingThe loan type drives the work's status on the way out and back. | ● | ● | ◐ | ● | ● | ◐ | ◐ |
| Artist splits, commissions, payoutsA five-level rate ladder, statements that freeze their arithmetic, and a payment record. | ● | ● | ● | ● | ◐ | ◐ | ● |
| Shipping, crating, customs paperworkShipping is a single amount on the order. No crating or customs documents. | ○ | ● | ◐ | ◐ | ● | ○ | ◐ |
| Art fair mode — fair lists, on-site salesNot built yet, though a fair microsite can be run as its own site. | ○ | ● | ◐ | ● | ● | ○ | ◐ |
| The desk — collectors and sales | |||||||
| Collector records with purchase historyOrders, inquiries, rooms and notes on the record. Lifetime value counts paid orders only. | ● | ● | ● | ● | ● | ◐ | ● |
| Interests, categories, related contactsTags and free-text notes, not a structured interest model. | ◐ | ● | ● | ● | ● | ○ | ◐ |
| Inquiry deskEvery inquiry carries its room, its recipient, and whether price was disclosed. | ● | ● | ● | ● | ● | ◐ | ◐ |
| Sales pipeline, offers, deal stagesSix stages, offers with expiry, holds. Accepting an offer raises the order. | ● | ● | ● | ● | ● | ○ | ◐ |
| Two-way email sync, sending as the dealerNot built yet. The app sends transactional mail from its own address, not from yours. | ○ | ● | ● | ● | ◐ | ○ | ○ |
| Email marketing campaignsNot built yet. | ○ | ● | ● | ● | ◐ | ○ | ● |
| Presentation — rooms, shows, web | |||||||
| Online viewing rooms | ● | ● | ● | ● | ◐ | ◐ | ○ |
| Per-artwork engagement telemetryDwell and zoom per recipient, machine traffic filtered out, plus reads from your public sites attributed to the site that served them. | ● | ◐ | ◐ | ● | ○ | ○ | ○ |
| Per-recipient links, passcode, open and close schedule | ● | ● | ◐ | ● | ○ | ◐ | ○ |
| Tearsheets, price lists, certificates, wall labelsPrint-ready, saved as PDF by the browser. Internal prices never print unless you ask for them. | ● | ● | ● | ● | ● | ● | ● |
| Exhibitions, events, RSVP | ● | ● | ◐ | ◐ | ◐ | ○ | ◐ |
| Public website with custom domainSeveral sites per gallery, each with its own branding and selection of works. Custom domains are stored and validated, but nothing routes by them yet. | ◐ | ● | ● | ● | ◐ | ◐ | ● |
| Blog and editorial publishing | ● | ● | ● | ◐ | ○ | ○ | ◐ |
| Money | |||||||
| InvoicingRendered from the order itself, so there is only ever one set of totals. Sending one emails the collector a pay link. | ● | ● | ● | ● | ● | ● | ● |
| Collector payments — card, ACH, instalmentsStripe Connect on the order, so funds settle to the gallery. Cash, cheque and wire are recorded alongside the card. | ● | ● | ● | ● | ◐ | ○ | ● |
| Multi-currency with conversionCurrency is stored per record. No conversion or roll-up. | ◐ | ● | ● | ● | ● | ◐ | ◐ |
| Sales tax, VAT, margin schemeOne flat tax amount per document. No rate tables, VAT or margin scheme. | ○ | ● | ● | ● | ◐ | ○ | ◐ |
| Accounting sync — QuickBooks, XeroNot built yet. | ○ | ◐ | ● | ● | ◐ | ○ | ◐ |
| The system | |||||||
| Reporting and analyticsSales, inventory and engagement, including reads from the public sites. | ● | ● | ● | ● | ● | ● | ● |
| iOS or iPad app for fairs and studio visitsNot built. The web app is responsive, which covers some of it. | ○ | ● | ◐ | ● | ● | ◐ | ◐ |
| Public REST API with scoped keysSelf-serve keys your team creates and revokes, with the reference published on this site. | ● | ◐ | ◐ | ◐ | ◐ | ○ | ○ |
| Roles, permissions, audit logEntity-level audit that keeps actor names after staff leave. | ● | ● | ● | ◐ | ◐ | ◐ | ◐ |
| CSV import and guided migrationPlus a demo gallery — artists, works, collectors, events, posts — you can import as-is. | ● | ● | ● | ● | ● | ● | ● |
| AI cataloguing, search, recommendationsNot built yet. | ○ | ◐ | ● | ● | ○ | ○ | ○ |
The object — inventory depth
Each impression is its own record — numbered, AP, PP, HC.
A dated chain of ownership you can reorder.
Rated inspections with photographs, added rather than edited, so the record is evidence of a day.
Dimensions are one text field. No structured variants yet.
Not built yet.
Not built yet.
Moving the work — consignment and logistics
Agreements, per-work lines, partial returns.
The loan type drives the work's status on the way out and back.
A five-level rate ladder, statements that freeze their arithmetic, and a payment record.
Shipping is a single amount on the order. No crating or customs documents.
Not built yet, though a fair microsite can be run as its own site.
The desk — collectors and sales
Orders, inquiries, rooms and notes on the record. Lifetime value counts paid orders only.
Tags and free-text notes, not a structured interest model.
Every inquiry carries its room, its recipient, and whether price was disclosed.
Six stages, offers with expiry, holds. Accepting an offer raises the order.
Not built yet. The app sends transactional mail from its own address, not from yours.
Not built yet.
Presentation — rooms, shows, web
Dwell and zoom per recipient, machine traffic filtered out, plus reads from your public sites attributed to the site that served them.
Print-ready, saved as PDF by the browser. Internal prices never print unless you ask for them.
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.
Money
Rendered from the order itself, so there is only ever one set of totals. Sending one emails the collector a pay link.
Stripe Connect on the order, so funds settle to the gallery. Cash, cheque and wire are recorded alongside the card.
Currency is stored per record. No conversion or roll-up.
One flat tax amount per document. No rate tables, VAT or margin scheme.
Not built yet.
The system
Sales, inventory and engagement, including reads from the public sites.
Not built. The web app is responsive, which covers some of it.
Self-serve keys your team creates and revokes, with the reference published on this site.
Entity-level audit that keeps actor names after staff leave.
Plus a demo gallery — artists, works, collectors, events, posts — you can import as-is.
Not built yet.
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.comThe API
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.
// 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);
}// 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}/artworksThe available works, filtered, searched, sorted and paginated/artworks/{id}One work, with its images/artworks/{id}/inquiriesAn inquiry from your site, landing on the desk attached to the work/artistsThe artists carrying the programme/exhibitionsShows, past and current/eventsOpenings and events/events/{id}/rsvpsAn RSVP, from your own page/blogEditorial, if you publish it hereInternal 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.
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.
Any origin may call them from a browser, because there is nothing on the other side worth stealing a cookie for.
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
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.
For independent dealers and small galleries building a focused digital archive.
Up to 500 artworks
For active galleries managing artists, collectors, exhibitions, inquiries, and sales in one place.
Up to 5,000 artworks
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
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.
Fine print
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.
Not built yet.
Not built yet.
Shipping is a single amount on the order. No crating or customs documents.
Not built yet, though a fair microsite can be run as its own site.
Not built yet. The app sends transactional mail from its own address, not from yours.
Not built yet.
One flat tax amount per document. No rate tables, VAT or margin scheme.
Not built yet.
Not built. The web app is responsive, which covers some of it.
Not built yet.
Dimensions are one text field. No structured variants yet.
Tags and free-text notes, not a structured interest model.
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.
Currency is stored per record. No conversion or roll-up.
Start with the demo gallery already loaded, so there is something to click on before there is anything to type.