Resolv
The complete helpdesk & ticketing platform — Zendesk-class capability at an accessible price.
Resolv is a complete helpdesk for a business that answers its own customers. Email and customer-portal requests land in a split-view inbox that keeps the queue, conversation and customer context together; agents route work through teams, track response and resolution targets against business hours, use saved replies and automations, and publish knowledge-base articles customers can search before writing in. The product also includes satisfaction surveys and reports, a public API for connecting other software, and workflow endpoints that create, close and assign tickets in one call.
Every conversation lands in one queue — already threaded.
The expensive part of support is not that requests arrive in several places. It is that nobody can answer “what is outstanding right now?” without asking three people. Work sits in a shared mailbox one person is watching, a form nobody checks on Fridays, and somebody's DMs. Two things follow, and both get worse with every hire: a customer chases an answer that was already sent, and the team finds out about the angry ones last. What that costs is not measured in tickets, it is measured in the customers who stop writing in and leave instead.
- Email channel (inbound + outbound threading)
- Customer portal channel
- Agent split-view inbox
- Ticket lifecycle management
- Collision detection
Targets that respect your working hours, and rules that act without you.
A promise about response time is only as real as the thing watching it. Most teams make one — on a pricing page, in a contract, or out loud on a sales call — and then discover they broke it when the customer tells them. The queue itself has the same problem: it only moves while someone is looking at it, so the backlog is built on Friday evening and paid for on Monday morning. Both are the same gap, between what you said you would do and a mechanism that makes it happen when nobody is in the room.
- SLA policies
- Advanced automations (form rule builder)
- Teams / groups
- Email notifications
Your customers should never meet the tool.
After the sale, support is often the only place a customer keeps meeting your company — and it is the surface most likely to look like it belongs to somebody else. That is a strange thing to outsource: the moment a customer is already unhappy is the moment they are reading whose product this is. It gets harder if you serve more than one brand, where the usual answer is one installation per brand, a team split across tools, and no way to see the whole workload at once.
- Branded customer portal
- Multi-brand portals
- Knowledge base
- CSAT surveys (1–5)
One call does the whole sequence — and an agent can make it.
A helpdesk that other software cannot reach becomes a place people copy things into. Somebody re-types a failure your product already detected. Somebody exports a CSV every month because the numbers live in a tool the rest of the business cannot query. Somebody reads a ticket in one window and updates a record in another. None of it is hard work and all of it is a person doing what a call should have done — which is also, exactly, the part an AI agent could take over if it were allowed to reach the product at all.
- Connect API
- API access
- AI assist
The part that usually goes wrong is threading. A reply lands as a new ticket, the agent answers the wrong thread, and the customer receives three disconnected emails about one problem. Resolv matches an inbound reply to the conversation it belongs to instead of opening a duplicate, and sends its own replies with the headers that make a mail client stack them together. The customer sees one conversation. Nobody had to think about it.
Inbound mail arrives on a webhook and outbound goes through Resend, so email intake and notifications both depend on that being configured. The portal and the widget keep taking tickets regardless.
They sign in with a link sent to their email. No password to invent, no password to forget, no password for you to reset at 9am on a Monday. It is the single change that removes the most support work from a support product, which is the sort of thing worth doing on purpose.
Customers are data subjects scoped to your organization, not agent seats. They never touch the agent application, never see another customer's ticket, and never count toward the plan's agent limit.
Articles live in categories and sections — enough structure for a few hundred pieces without becoming a filing project — and each one is either public or internal. Public articles are what customers search and what the widget suggests mid-question. Internal ones are for your own team: the escalation path, the refund rule, the thing everybody has to look up and nobody remembers. Same editor, same search, different audience.
Search ranks by relevance rather than listing everything containing the word. Each article carries a helpful / not-helpful control, so you find out which answers actually work instead of guessing. And articles are versioned, so an edit is recoverable.
One corpus feeds three places: the agent's sidebar suggestions, the portal's search and the widget's in-typing hints. There is no separate help site to keep in sync.
Logo, colours and the portal address are configuration. One brand on the included tiers; running several distinct brands over one team and one queue is a Pro capability.
Scores roll up three ways — by agent, by team, and over time. A single rating is noise and everyone knows it. A trend for one agent, read next to their volume and their resolution time, is a coaching conversation with evidence in it. That is the difference between a metric you act on and a number you put in a slide.
Surveys can be turned off entirely if you would rather not ask.
Six states carry it from arrival to close, alongside priority, type, tags, an assignee and a team. The distinction between pending and on hold is not bookkeeping — pending means waiting on the customer and it pauses the response clock, on hold means waiting on something else. A team is never judged on the days it spent waiting for an answer it had already asked for.
Three panes: the queue on the left, the conversation in the middle, and everything known about the customer on the right — their history, and the articles that might answer them. One screen, no tab-switching, no going back to a list and losing your place. The list keeps its position while you work through it, which sounds small until you have scrolled back to row forty for the ninth time.
They fill in what changes — the customer's name, the ticket number — and they can do things when applied: set a status, assign to someone, add a tag. "Thanks, escalating this to billing" becomes one click instead of writing a sentence, changing a dropdown, picking a person and adding a label.
Macros can be personal or shared with the team, which is how one agent's good answer becomes everyone's.
Views can be personal or shared, so a team lead can decide what the team looks at when they start the day and everybody is looking at the same thing. Ownership is checked when one is deleted — a shared view cannot be removed by someone who does not own it.
Merging folds the duplicate into the original with the whole conversation intact and in order — and it either completes entirely or does not happen at all. There is no state where half a conversation has moved and the agent is looking at a ticket with a hole in it.
Collision detection is the fix, and it is quietly one of the most valuable things in a shared inbox: each agent sees who else has the ticket open, and sees when the other is typing. Live, no refresh, no thinking about it.
An administrator defines those fields once in settings. They appear on the ticket form, they are stored with the ticket, and they can be filtered on in views and reports like anything else. Adding one is a configuration change, not a deployment.
Two decisions about it are worth knowing before you buy.
It runs on your own provider key. Your key, your visible usage, your control over the spend. Nothing is resold to you at a markup, and you can see exactly what the AI costs you.
It is priced inside the seat, not per resolution. The industry is moving toward charging per ticket the AI touches, and the predictable result is a team that hesitates before using the tool bought to make them faster. A fixed seat price removes that hesitation, which is the whole point of having it.
You receive this. It ships behind a feature flag and sits on the Pro tier as configured, so it is revenue you can reserve for your own paying customers.
Customers hear when their ticket is received, when someone replies and when it is resolved. Agents hear when a ticket is assigned to them, when a target is about to be missed, when they are mentioned in an internal note, and when something escalates to them.
Every tier has these. They answer "how are we doing".
Teams do two jobs, and both matter more than they sound.
Team creation and membership changes are checked server-side, not just hidden in the interface.
Resolv runs a real one. You set first-response and resolution targets per priority; every ticket carries a live countdown an agent can see; the system warns before a target is missed and escalates when one is. And the clock respects a business-hours calendar — timezone and holidays included — so a ticket that arrives at six on Friday evening is not quietly burning through its target all weekend. It also pauses while you are legitimately waiting on the customer.
That is the difference between a target a team can actually meet and a number that exists to be missed. Breach detection runs on a schedule, so a cron caller is a real requirement: without one the countdown still displays and nothing ever escalates.
Two kinds, and the second is the one people forget. Event rules fire on something that happened: a ticket was created, assigned, or breached its target. Time rules fire on something that has not happened — a ticket has been pending for more than a day, so send a reminder. Most tickets that die quietly die that second way.
Rules are built in a form rather than dragged around a canvas, and the trade is deliberate: you give up arranging boxes with a mouse and you get a rule that is readable at a glance and still understandable to whoever inherits it in six months. Actions are the same ones an agent has by hand — set a status, assign, tag, notify, reply.
SLA compliance as a percentage rather than a feeling. Satisfaction as a trend line instead of a snapshot. A peak-hours heatmap showing when your queue actually arrives — which is usually the single most actionable chart in a support operation, because it turns "we're always behind" into "we're understaffed on Tuesday mornings". An agent leaderboard, and CSV export for anyone who wants the raw numbers in their own spreadsheet.
That split — everyone gets the scoreboard, the analytical layer is the upgrade — is the honest place to draw the line.
You receive this. It ships behind a feature flag and sits on the Pro tier as configured, so it is revenue you can reserve for your own paying customers.
Keys are managed in-app and rate-limited like every other route in the product.
You receive this. It ships behind a feature flag and sits on the Pro tier as configured, so it is revenue you can reserve for your own paying customers.
An agency supporting three clients, or a company with two product lines that shouldn't look like one — each gets its own branded portal, its own address and its own look, while the agents work a single queue and never switch tools. The alternative is running three installations and reconciling them by hand.
You receive this. It ships behind a feature flag and sits on the Pro tier as configured, so it is revenue you can reserve for your own paying customers.
Creating a ticket properly means validating the input, writing the record, recording an audit entry and dispatching the events that trigger everything downstream. Through an ordinary REST API that is the caller's job to sequence correctly, and the caller usually gets it slightly wrong. Connect verbs — create, close and assign — do the whole sequence in one call, with a declared step plan and a single audit row.
The same verbs are published as tools an AI agent can call directly through a machine-readable manifest. So an assistant elsewhere in your business can file and route support work without a person copying it between two screens, and without you writing an integration to make that possible.
You receive this. It ships behind a feature flag and sits on the Pro (opt-in per org) tier as configured, so it is revenue you can reserve for your own paying customers.
The platform underneath the product — counted in this product's own source, not claimed from a template. Where a row carries a list, open it to read the names behind the number.
Hover a table to isolate what it touches; click one to read its relationships. The big nodes are what everything else hangs off. organizations is referenced by 59 tables because every single record in this product belongs to an organization, and that is what makes tenant isolation a property of the database rather than something the application has to remember on every query.
all 69 tables, as text
active_boosts · admin_notifications · announcement_dismissals · announcements · api_key_logs · api_keys · audit_logs · automation_log · automation_rules · automation_templates · business_hours · business_hours_holidays · credit_balances · credit_transactions · csat_responses · csat_surveys · currencies · data_exports · data_imports · email_channels · faq_categories · faq_items · feature_flags · inbound_webhooks · kb_article_versions · kb_articles · kb_categories · kb_feedback · kb_sections · languages · macros · notification_log · notification_rules · notifications · organization_limit_overrides · organizations · plans · platform_secrets · platform_settings · portal_brands · product_purchases · products · provider_prices · push_devices · report_templates · roles · scheduled_tasks · sla_policies · sla_policy_rules · subscriptions · tags · team_members · teams · theme_page_sections · theme_section_library · theme_sections · ticket_custom_field_values · ticket_custom_fields · ticket_guest_tokens · ticket_messages · ticket_tags · ticket_views · tickets · translations · user_sessions · users · webhook_logs · webhooks · widget_configs
The chassis, and anything particular to this product. 3 required, 4 optional.
Next.js 16 · React 19 · TypeScript strict. No platform lock-in.
Postgres with row-level security. 27 tables across 56 migrations, applied by the shipped scripts.
Inbound and outbound. Without it the portal and widget still take tickets; email intake and notifications do not run.
Rate limiting on every route, and specifically the public ticket, portal and widget endpoints.
Holds the shared secret and hits the breach sweep. Without it targets display but breaches are not detected or escalated.
AI assist is inert without it. Nothing else changes.
Error monitoring. Omit it and the application runs unchanged.
Already built — plug and play
Every provider integration in this list ships wired into the product. You bring your own keys, connect them in the admin, and go live — there is no integration code to write. Nothing is resold through us: the ongoing cost is whatever these providers charge you. Capabilities marked plan-gated elsewhere on this page unlock by plan, not by extra code.
What exactly do I receive after purchase?
The complete source repository behind the live demo — 123,715 lines across the application and its database, 69 tables defined by 58 migrations that the shipped scripts apply for you, plus the seed data, the demo accounts and the setup documentation. Not a subset and not a scaffold: the same code that runs the demo you just used.
Is the live demo the same product whose source I receive?
Yes. The Resolv demo runs the delivered release (v1.0.0), and the build figures on this page are measured from that same source — not from a showcase build kept separately.
Can I test every account role before buying?
Yes — all 5 of them: Customer, Agent, Team lead, Business owner, Platform admin. Each one is seeded in the live demo and reachable from the role board above, so you can inspect the product from the customer's side, the agent's side and the administrator's side before you decide.
Is this a complete product or a starter template?
Complete. 87 page modules and 304 HTTP operations, with authentication, roles, billing, an administration panel, background jobs and seeded demo data all wired and running. A template gives you the shape of an application; this is one you can deploy and start operating.
Can I rebrand and modify it?
Yes, without asking. The name, identity, copy, styling and code are yours to change. Rebranding and operating it as your own service is exactly what the licence is for.
What does the licence allow?
A perpetual, worldwide, non-exclusive, non-transferable licence to the product you bought and to every update released for it. The Standard licence covers one business — yours. If you deploy for clients, the Client licence covers up to five. You can modify it, rebrand it, deploy it and charge your own customers.
Can I resell the source code?
No. Reselling, redistributing, sublicensing or giving away the source itself is not permitted under either licence. You build and deliver products with it — the code stays with you.
What services and ongoing costs are required?
You bring your own accounts, so we never mark anything up and there is no ongoing cost to us beyond the purchase. Required: Node host, Supabase, Resend, Upstash Redis, A cron caller. Optional: OpenRouter key, Sentry. The table above says exactly what stops working without each one; most have usable free tiers at low volume.
How difficult is deployment?
Two ways, and most buyers use the first. The installer in your saascode dashboard walks it: you create free accounts at Vercel and Supabase, connect them, and it provisions the database, applies 58 migrations, seeds the data, deploys and verifies the result — you watch the steps go green. Or take the source and do it yourself with the shipped scripts and docs, which is the same sequence run by hand.
What updates and support are included?
Updates to that product for as long as we maintain it — no renewal fee and no expiry date on your access. Support covers download problems, defects in the code as shipped, questions about what the product does and how it is structured, and licence questions. It does not cover debugging your own modifications, building features for you, or setting up your hosting and third-party accounts.
Why does a complete codebase cost $139?
Because it was built once and is distributed many times. SaaSCode builds each product and ships the same finished release through the catalog, so the price reflects repeatable distribution — not a reduced codebase, an unfinished template, or what the same work would cost commissioned.
Do I need to be a developer?
No, for the normal path. You create free accounts at Vercel and Supabase, connect them to the installer in your saascode dashboard, and it does the deployment for you — provision, migrate, seed, deploy, verify. What it asks of you is creating two accounts and copying a token, not writing code. If you would rather deploy it yourself, or host it somewhere else, the full source and the scripts are yours to do that with. Running the product day to day needs no technical skill at all: that happens through its own interface, which is what the demo shows.
