saascode
Resolv

Resolv

The complete helpdesk & ticketing platform — Zendesk-class capability at an accessible price.

inside the product
01· see it in action
02· Landing
03· Pricing
04· Customer portal
05· Agent inbox
06· Tickets
07· Knowledge base
overview

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.

Resolv in depth

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
complete feature inventory
Email channel (inbound + outbound threading)Most support arrives by email, and most support tools make that fact awkward. This one does not: you point a support address at Resolv and email simply becomes tickets, with nothing for the customer to learn and nothing for them to sign up to.

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.

Customer portal channelSome customers would rather see their tickets than search their inbox for them. The portal is that: a place they can submit a request, watch it move, and read the reply — without asking anyone where it stands.

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.

Knowledge baseThe knowledge base is the only part of a helpdesk that makes the work smaller instead of better organised. Every question it answers is a ticket that never gets written.

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.

Branded customer portalA customer arriving at your support portal should see your company, not a support tool with your name typed into the corner.

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.

CSAT surveys (1–5)When a ticket closes, the customer can be asked how it went on a scale of one to five. That part is ordinary. What makes it useful is where the scores go.

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.

Ticket lifecycle managementA ticket always has one honest answer to "where is this?": waiting on us, waiting on them, or done.

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.

Agent split-view inboxThis is the screen an agent lives in, and it is deliberately not a dashboard. Nobody's job is to look at charts about tickets; their job is to answer them.

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.

Macros & canned responsesEvery support team answers the same twenty questions forever. Macros are those answers, kept.

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.

Saved ticket viewsA view is a question you ask the queue often enough that it deserves a name: my open tickets, unassigned, high priority, past its response target.

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.

Ticket merge (atomic)Customers write twice. They reply to an old thread, they use a different address, they forget they already asked.

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 detectionTwo agents open the same ticket. Both start writing. The customer gets two different answers to the same question, ten seconds apart, from a company that supposedly has one position on 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.

Custom fieldsEvery business asks something a generic helpdesk has never heard of — an order number, a plan, a serial, a region, a contract reference.

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.

AI assistFour things, all inside the inbox where the work is: it finds the article that answers the ticket, summarises a long thread so whoever picks it up does not read forty messages first, drafts a reply, and sorts incoming tickets into the right category.

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.

Email notificationsNobody should have to sit watching a queue to find out something needs them.

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.

Basic reportsThe numbers a support lead is asked for every month: how many tickets came in, how long they took to resolve, how each agent is doing, and how satisfied customers were — all filterable by date range.

Every tier has these. They answer "how are we doing".

Teams / groupsThey route work — a ticket can go to a person or to a team, so "someone in billing" is a real destination instead of a guess about who is free right now. And they scope reporting, so a team lead sees their own team's queue and their own team's numbers rather than a company-wide average that tells them nothing about their five people.

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.

SLA policiesA response-time target that ignores your working hours is not a target, it is a way of making everyone look bad on Monday.

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.

Advanced automations (form rule builder)Automations are what keep a queue moving when nobody is watching it — evenings, weekends, the week someone is on holiday.

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.

Advanced reportingThe next question is "why, and what should we change", and that needs a different kind of number.

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.

API accessA public REST API authenticated with a key you generate, for the things a support tool should not be the only place to do: pulling tickets into a warehouse, creating them from your own product when something fails, syncing status back into an internal dashboard.

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.

Multi-brand portalsOne installation, several brands, one team behind all of them.

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.

Connect APIThe difference between an API and a workflow endpoint is how many round trips it takes to do something real.

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.

what's included

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.

AlipayCoinbasedLocalFlutterwaveKakaoPayKomojuLemon SqueezyMercado PagoMollieNOWPaymentsOpnPaddlePagSeguroPayPalPaystackRazorpayStripeWeChat Pay
AlipayAppleBitbucketDiscordFacebookFigmaGitHubGitLabGoogleKakaoKeycloakLINELinkedInMicrosoft AzureNaverNotionQQSlackSnapchatSpotifyTwitchVKWeChatWeiboWorkOSXYandexZoom
the schema and build
87page modules
304http operations
69tables
58migrations
123,715lines of source
6roles
measured 2026-08-31release v1.0.0 · built 2026-07-12
69 tables · 115 relationships
organizations59 refsusers26 refstickets5 refsteams3 refsactive_boostsadmin_notificationsannouncement_dismissalsannouncementsapi_key_logsapi_keysaudit_logsauthautomation_logautomation_rulesautomation_templatesbusiness_hoursbusiness_hours_holidayscredit_balancescredit_transactionscsat_responsescsat_surveyscurrenciesdata_exportsdata_importsemail_channelsfaq_categoriesfaq_itemsfeature_flagsinbound_webhookskb_article_versionskb_articleskb_categorieskb_feedbackkb_sectionslanguagesmacrosnotification_lognotification_rulesnotificationsorganization_limit_overridesplansplatform_secretsplatform_settingsportal_brandsproduct_purchasesproductsprovider_pricespush_devicesreport_templatesrolesscheduled_taskssla_policiessla_policy_rulessubscriptionstagsteam_memberstheme_page_sectionstheme_section_librarytheme_sectionsticket_custom_field_valuesticket_custom_fieldsticket_guest_tokensticket_messagesticket_tagsticket_viewstranslationsuser_sessionswebhook_logswebhookswidget_configs

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

what you need to run Resolv

The chassis, and anything particular to this product. 3 required, 4 optional.

Node hostrequired

Next.js 16 · React 19 · TypeScript strict. No platform lock-in.

Supabaserequired

Postgres with row-level security. 27 tables across 56 migrations, applied by the shipped scripts.

Resendrequired for email

Inbound and outbound. Without it the portal and widget still take tickets; email intake and notifications do not run.

Upstash Redisrequired

Rate limiting on every route, and specifically the public ticket, portal and widget endpoints.

A cron callerrequired for SLA

Holds the shared secret and hits the breach sweep. Without it targets display but breaches are not detected or escalated.

OpenRouter keyoptional

AI assist is inert without it. Nothing else changes.

Sentryoptional

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.

questions worth answering
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.