Skip to content
TutujinAPI

Sales and CRM assistant

Sales work uses three kinds of models together: a mainstream model turns call and meeting transcripts into CRM notes, another mainstream model drafts follow-up emails, and a cheap small model scores leads against written criteria and cleans CRM notes in bulk. Give each sales team its own API key and filter usage by key to see what each team spends. For 3,000 calls, 10,000 new leads and 20,000 old notes a month, at live prices in each model’s cheapest group, model costs are about ¥71.26 a month.

Prices updated Nov 13, 2026, 6:08 PM

Monthly cost estimate

Assumptions: a 30-person sales team with 3,000 calls or meetings a month and transcripts of about 6,000 tokens, so about 7,000 input and 600 output tokens per set of notes; 3,000 follow-up emails at about 1,500 input and 400 output tokens; 10,000 new leads scored at about 800 input and 100 output tokens; 20,000 old notes cleaned overnight at about 600 input and 300 output tokens.

¥71.26per month

  • Call notes¥35.62
  • Follow-up emails¥26.04
  • Lead scoring¥2.4
  • CRM note cleanup¥7.2
See the usage assumed

The business problem

Reps make calls and hold meetings all day, yet the CRM often holds only “talked, will follow up”. The customer’s pain points, budget, decision makers and agreed next step live in people’s heads and chat logs, and a new rep has to ask all over again.

Leads keep growing and who gets called first is a gut call; CRM notes come in every format, so even a simple count by industry, stage or next follow-up date is out of reach.

LLMs are good at doing this writing work first: notes from transcripts, follow-up emails that restate what was agreed, lead scores against written criteria, and old notes reshaped into consistent fields. Reps edit emails before sending, and the sales lead sets the scoring criteria.

Recommended models

Recommended models are picked from the live catalog; prices are each model's cheapest group, updated Nov 13, 2026, 6:08 PM. Click a model to see every group's price.

  • Call notes and note cleanup (mainstream model)

    input ¥1.12 / output ¥6.72 per 1M tokensChina Models group

    Reads call or meeting transcripts and returns fixed fields: summary, pain points, objections, decision makers, next step and date, written straight into the CRM. Long transcripts, short notes, so the input price matters most. See the speech solution for turning recordings into text.

  • Follow-up email drafts (mainstream model)

    input ¥2.8 / output ¥11.2 per 1M tokensChina Models group

    Drafts follow-up emails from the notes and account details, restating the agreed next step. It writes only what the notes contain and never commits the rep to prices or delivery dates. For English emails to overseas customers, test the alternatives on your own samples.

  • Lead scoring and note cleanup (small model)

    input ¥0.2 / output ¥0.8 per 1M tokensStandard group

    Answers each scoring criterion for every new lead, such as budget, whether the contact decides and whether the need fits, while code adds up the fixed points; at night it reshapes old notes into consistent fields. High volume and simple tasks call for a small model with a low price and fast responses.

Reference architecture

  1. 1

    Transcribe and collect

    Turn call recordings into text as in the speech solution, or use transcripts exported from your meeting tool; new leads come from website forms, event lists or CRM exports.

  2. 2

    Write notes back to the CRM

    The mainstream model pulls fixed fields from the transcript, including summary, pain points, objections, decision makers, next step and date, using only what was said, and writes the JSON back to the matching CRM fields.

  3. 3

    Draft follow-up emails

    Draft emails from the notes and account details and save them as drafts for reps to edit and send; prices, discounts and delivery dates are only quoted when the notes state them.

  4. 4

    Score leads against criteria

    The sales lead writes the criteria and points; the small model answers yes, no or unknown for each, and code adds up the points and orders the follow-ups. Rescore when the criteria change.

  5. 5

    Nightly batches

    Run note cleanup and lead scoring as nightly batches with a client-side concurrency limit (say 8); on a 429, wait and retry, and put failures back in the queue for the next night.

  6. 6

    One key per team for costs

    Give each sales team or region its own API key with a quota cap; filter the usage details in the console by key and export CSV to allocate model costs by team.

Cost estimate

Assumptions: a 30-person sales team with 3,000 calls or meetings a month and transcripts of about 6,000 tokens, so about 7,000 input and 600 output tokens per set of notes; 3,000 follow-up emails at about 1,500 input and 400 output tokens; 10,000 new leads scored at about 800 input and 100 output tokens; 20,000 old notes cleaned overnight at about 600 input and 300 output tokens.

ItemModelUsage assumedCost
Call notesqwen3.5-plus3,000 × (7,000 input + 600 output tokens)¥35.62
Follow-up emailsdeepseek-v4.1-flash3,000 × (1,500 input + 400 output tokens)¥26.04
Lead scoringgemini-2.5-flash-lite10,000 × (800 input + 100 output tokens)¥2.4
CRM note cleanupgemini-2.5-flash-lite20,000 × (600 input + 300 output tokens)¥7.2
Total (per month)¥71.26

Calculated from live prices in each model's cheapest group, updated Nov 13, 2026, 6:08 PM.

Model usage only: transcription, the CRM and staff time are not included; see the speech solution for transcription costs. Cleaning old notes is usually a one-off or occasional job, after which only new notes need processing. With one key per team, each team’s actual spend is what the usage details in the console show.

Sample code

One key per team; the mainstream model turns a transcript into CRM fields, the small model answers each scoring criterion while code adds up the points, leads are scored in a thread pool, and follow-up emails are only drafts that reps edit and send.

Sample code (Python, call notes, lead scoring and follow-up emails)
import json
import os
from concurrent.futures import ThreadPoolExecutor
from openai import OpenAI

# One API key per sales team (e.g. TUTUJIN_KEY_EAST): usage details can then be filtered and exported per key.
TEAM = os.environ.get("SALES_TEAM", "EAST")
client = OpenAI(base_url="https://www.tutujin.com/v1", api_key=os.environ["TUTUJIN_KEY_" + TEAM], max_retries=3)

# Set by the sales lead; every lead is scored on the same criteria.
CRITERIA = [
    {"id": "budget", "points": 30, "text": "Mentions a budget or a buying timeline"},
    {"id": "authority", "points": 25, "text": "The contact decides or names who decides"},
    {"id": "need", "points": 30, "text": "Describes a problem our product solves"},
    {"id": "fit", "points": 15, "text": "Company has 50 to 2,000 employees"},
]


def ask(model, system, user, temperature=0):
    resp = client.chat.completions.create(
        model=model,
        messages=[{"role": "system", "content": system}, {"role": "user", "content": user}],
        temperature=temperature,
    )
    return resp.choices[0].message.content


def as_json(raw):
    return json.loads(raw[raw.find("{"): raw.rfind("}") + 1])


def call_notes(transcript):
    return as_json(ask(
        "qwen3.5-plus",
        "Turn the sales call transcript into CRM notes. Use only what was said. Reply with JSON only: "
        '{"summary": "", "pain_points": [], "objections": [], "decision_makers": [], "next_step": "", "next_step_date": "YYYY-MM-DD or empty"}',
        transcript,
    ))


def score_lead(lead):
    answers = as_json(ask(
        "gemini-2.5-flash-lite",
        'For each criterion answer yes, no or unknown, using only the lead data. Reply with JSON only, e.g. {"budget": "unknown"}',
        "Criteria:\n" + json.dumps(CRITERIA) + "\n\nLead:\n" + json.dumps(lead, ensure_ascii=False),
    ))
    return {"id": lead["id"], "score": sum(c["points"] for c in CRITERIA if answers.get(c["id"]) == "yes"), "answers": answers}


def follow_up_draft(notes, contact):
    # saved as a draft: the rep checks and sends it
    return ask(
        "deepseek-v4.1-flash",
        "Write a short follow-up email for the sales rep. Restate the agreed next step and date. "
        "Never promise prices, discounts or delivery dates that are not in the notes.",
        "Contact: " + json.dumps(contact, ensure_ascii=False) + "\nNotes: " + json.dumps(notes, ensure_ascii=False),
        temperature=0.5,
    )


# nightly batch: score yesterday's leads with a few requests in flight at a time
leads = [{"id": 1, "company": "Example Co", "employees": 300, "message": "I run support and we must replace our ticket tool before Q3."}]
with ThreadPoolExecutor(max_workers=8) as pool:
    ranked = sorted(pool.map(score_lead, leads), key=lambda r: r["score"], reverse=True)
print(ranked)

with open("call-0412.txt", encoding="utf-8") as f:
    notes = call_notes(f.read())
print(follow_up_draft(notes, {"name": "Ms. Chen", "company": "Example Co"}))

Try this with one key

Sign up, create an API key in the console, and put your base_url and key into the code above. For company purchasing or invoices, add our WeChat support JsnonoChat.

Tutujin support WeChat QR code
WeChatJsnonoChat

Scan the code or search the WeChat ID to add us

FAQ

What does a sales team spend on LLMs per month?

With notes for 3,000 calls, 3,000 follow-up emails, 10,000 scored leads and 20,000 cleaned notes a month, the cheapest groups come to about ¥71.26 a month. Transcription is not included, and longer transcripts make the notes line more expensive.

How do I track model costs by team?

Create a separate API key for each sales team or region and set a quota cap on it. The usage details in the console can be filtered by key and exported as CSV for allocation by team; if one team runs over, stop only its key and the others keep working.

What should I watch when processing leads in bulk?

Limit concurrency on the client, starting around 8 and adjusting by how often 429 appears; on a 429, wait before retrying and put failures back in the queue. Batch jobs can run at night, and a separate key keeps their usage apart from live traffic.

Can model-written follow-up emails be sent automatically?

Not recommended. The model may get a customer’s name wrong or promise something that was never said. Save emails as drafts for reps to check and send, and tell the model in the system prompt to use only what is in the notes.

How accurate is the lead scoring?

It depends on how specific the criteria are and how complete the lead data is. Having the model answer yes, no or unknown per criterion and letting code add fixed points makes the result easy to review; compare scores with actual deals regularly and adjust the criteria and points.

Transcripts contain customers’ personal data. Can they go to the model?

Requests are forwarded through this service to the model provider for processing. Send only what the notes need, remove phone numbers, ID numbers and similar details, and assess the setup against the personal-data rules that apply to you and your company policies.