What MyCRM does, said plainly.
Everything on this page is in the shipped binary. Anything we have not built is on the honest limits list, not hidden here in different words. This page says what each thing is; Help says how to use it, button by button.
Know the customer
Contact 360
One page per person: their company, entitlements, activations, tickets, deals, tasks, notes, activities, consent records, feature requests, every known identity, and the timeline. It is one API call, so it arrives as one page instead of eight tabs.
An append-only timeline
Every fact is an event with a dedupe key — purchase.initial, activation.created, ticket.message.in, web.pageview, deal.stage_changed, lead.captured. A connector that re-runs writes nothing twice. Filter by type or type prefix and page backwards through the history.
Identity graph
Email is the identity key. Machine ids, Stripe customer ids and other identifiers attach to the same contact, so an anonymous desktop trial joins up with the purchase that follows it. Duplicates merge into one record, timeline included.
Aggregates that compute themselves
Products owned, first and last seen, next expiry, total spent, open tickets, lifecycle stage and a health score — all derived from the events, not typed in by a person who will forget.
Companies
Contacts roll up to a company with its own timeline, deals and entitlements, so “who else is at this account” is one click rather than a search.
Work the day
Saved views and segments
Save a filter, a sort and a column set as a shared or a private view. Eighteen ship with the product — new leads this week, trials that never purchased, renewals due in 60 days, my open pipeline, overdue tasks, detractors to call. Edit a shipped view and your edit survives the next upgrade.
Deal pipeline
A board by stage with a count and a total per column. Drag a card to move it; a drag based on a stale copy of the record is refused with a conflict rather than quietly overwriting a colleague. Marking a deal won requires an amount.
Task inbox
Overdue, today, this week, unassigned. Complete, reopen, snooze (five times at most, so nothing snoozes forever) and quick-add. The completion timestamp is written by the server and cannot be edited through the record.
Renewal playbooks
Four plays: open the renewal deal before an entitlement expires, close it when the matching entitlement arrives, follow up a failed payment, and win back a lapsed customer. Each previews the exact records it would touch, is capped per run, and ships switched off.
One idea of ownership
Every record has exactly one owner. @me resolves per caller, in ad-hoc filters and inside shared views alike. Reassign up to 200 records in a call; every change lands on the timeline.
Get data in, and get it back out
Hosted lead forms
A form is a record: its public slug, its fields, the origins allowed to post to it, the consent wording, the rate limit, and who gets notified. Post to /f/<slug> from any of your sites. Adding a form needs no deploy. The form on this site is one of them.
Connectors
A connector declares its streams and syncs each from a persisted cursor on a schedule, with one leader elected so two servers never double-sync. Shipping today: the iOwn commerce backend (ten streams), Stripe read-only, and SendGrid delivery events.
CSV import
Map columns to fields, dry-run, download the errors as a CSV that reopens cleanly in Excel, then commit. A commit that does not match the dry-run it was previewed from is refused. An import can be undone.
CSV export
Any object, any filter, straight to CSV — and the file round-trips back through the importer, which is the only real test of an export.
Shape it, and build on it
Objects and fields are metadata
The standard objects — contact, company, product, deal, subscription, entitlement, activation, ticket, activity, task, note, consent, form, feedback, suppression and feature request — are themselves seed metadata, defined through the same paths your own objects use. Custom objects are not a bolt-on; they are the mechanism.
Sixteen field types
Text, long text, number, currency, bool, date, datetime, picklist, multi-picklist, lookup, email, phone, URL, JSON, tags and formula. Required, unique and indexed flags; the index is created for you on both database engines.
Formula fields
A small sandboxed expression language over the record's own fields, evaluated when the record is read. No arbitrary code executes inside your database.
REST API
/api/v1 covers metadata, records, structured queries, timelines, related records, contacts and the 360, events, views, pipeline, inbox, tasks, imports, forms and connectors. JSON in, JSON out, documented endpoint by endpoint.
Scoped API keys
Keys carry read, write or admin scope and are the same credential the UI uses. There is no second-class public API tier and no feature that is only reachable by clicking.
Sign in, and run it
Magic-link sign-in
No passwords, so there are none to leak, reset or reuse. You get a signed link by email and exchange it for a session. Link requests are rate-limited, and the response is the same whether or not the address exists.
TOTP second factor
Optional per user, turned on from your own profile screen with any authenticator app.
Sealed connector secrets
API keys you give to connectors are encrypted with a master key kept outside the database, and are masked in every API response and on every screen. See Security.
One binary, two databases
A single Go binary with the web UI embedded. SQLite by default — one file, nothing to install — or PostgreSQL when you outgrow it. Same schema, same test suite, both dialects.
Deploy in an afternoon
An install script, a systemd unit and a Caddy snippet ship with the source. Self-hosting walks through it.
Ask before you assume.
If the thing you need is not on this page, it is either on the not-built list or we have not thought of it. Both are worth a message.