A CRM built entirely inside Gmail: pipelines appear as a view over your inbox, so a deal is a set of threads rather than a record in another application.
Build me a CRM inside my inbox that replaces Streak — and know why this is ALMOST. The idea is **pipelines drawn over the inbox itself**: a thread is a deal, and the stages sit above your mail rather than in another application. Reproducing it means a browser extension injected into a mail interface that changes without warning, and that maintenance is the recurring cost. The mail sync is the valuable half and it is buildable; the injection is the fragile half. STACK - Node 20+ with Fastify, server-rendered HTML with a little vanilla JS - SQLite through better-sqlite3, WAL mode, with FTS5 - A browser extension, Manifest V3, injecting the pipeline view - Caddy in front THE DATA MODEL - pipelines: id, name, stages_json, fields_json - boxes: id, pipeline_id, stage, title, value_cents, currency, owner_id, notes_md, custom_json, created_at, closed_at, outcome — a box is the deal, and it is attached to threads rather than replacing them - box_threads: box_id, thread_id, external_id, linked_at, is_primary - stage_history: id, box_id, from_stage, to_stage, at, actor_id — append-only, and where every honest number comes from - contacts: id, email, name, company, last_contacted_at - messages: id, thread_id, message_id, direction, from_address, to_json, subject, snippet, occurred_at — mirrored, never the body - tasks, reminders, snippets — the small features that get used constantly - The thread identifier from the mail provider is the join. It is stable, and matching on subject would not be THE MAIL SIDE, WHICH IS THE VALUABLE HALF - Read-only sync over the provider's API, incremental with a cursor, idempotent by message id - Store the address, direction, subject, timestamp and a short snippet. Never the body. Say so in the README — that restraint is what makes somebody willing to connect their work mailbox - A box's last activity, response time and days quiet all derive from these rows, so nobody ever updates a record - Attaching a thread to a box is one action, and afterwards everything in that thread follows automatically - When a message could belong to two open boxes, file it against the contact and ask. Never guess, because a message on the wrong deal is worse than one on none THE EXTENSION, WHICH IS THE FRAGILE HALF - A sidebar on an open thread showing its box, the stage, the value, the notes and the tasks — and a control to change the stage without leaving the message - A pipeline view: the boxes as a board, reachable from inside the mail interface - Write it as one small adapter with a saved page fixture and a test. The host interface will change, and a failing test is better than a mystery - Per-host permission, a token to your own server, and nothing sent anywhere else - Say in the README that maintaining this is the ongoing cost of the whole approach THE SMALL FEATURES THAT MAKE IT USED - **Snippets**: canned replies inserted with a shortcut and variable substitution. Used more than anything else in the product - **Send later**: a message scheduled from the extension and sent by a worker through the provider, once, idempotently - **Follow-up reminders**: remind me if nobody replies to this thread in four days, computed from the mirrored messages rather than from a timer - **Thread splitting and merging**, because a long conversation eventually contains two subjects - Mail merge is where this category gets people into trouble. If you build it, cap the volume hard, require a stop-on-reply, and put a one-click unsubscribe in every message REPORTING - Conversion between stages and time in each stage, from stage_history - Boxes with no activity for longer than a threshold, ranked — that list is the actual pipeline problem - Required outcome and reason on a closed box, because losing without a recorded reason teaches nothing - Everything computed at query time OPERATIONS - .env: DATABASE_PATH, BASE_URL, SESSION_SECRET, ENCRYPTION_KEY, HASH_SALT, provider credentials - Migrations on boot, each once; credentials encrypted at rest - Nightly backup off the machine, restore script - Health endpoint reporting mail sync age WHAT MATTERS MOST Thread-level linking and stage history. The first is what keeps the record current with no effort; the second is the only thing that will ever tell you something you did not already know.
What you lose
- A pipeline rendered inside Gmail, which needs deep integration with an interface Google keeps changing
- Mail merge, tracking and snippets in the same place you write
- Threads as the unit of work, so nothing needs to be copied into a record
If you would rather not build
- A Google Sheet driven by Apps Script
- Twenty, if you would rather leave the inbox
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $59/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Why this verdict
our own opinion · changed only by a person
58/100
Verdict kinda at 58. Using labels as stages is a genuinely good shortcut; the add-on and Gmail quotas are what makes it a weekend rather than an evening.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Streak
answered from the record above
Is Streak free?
No — the plan we track is $59 a month. Pro at $59 per user per month billed monthly, $49 annually; a free tier covers personal use.
Can you replace Streak by building your own?
ALMOST. A weekend of work, and real gaps remain. Replacement score 58 out of 100, build time a weekend. Read what you lose before you decide.
How much does Streak cost?
$59 a month on Pro — $708 a year. Recorded 10 Aug 2026.
What do you lose by replacing Streak?
A pipeline rendered inside Gmail, which needs deep integration with an interface Google keeps changing; Mail merge, tracking and snippets in the same place you write; Threads as the unit of work, so nothing needs to be copied into a record. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Streak?
Yes: EspoCRM, Monica. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

