DEV Community

Ujjwal Dubey
Ujjwal Dubey

Posted on

Export Before You Commit: Checking a SaaS Chatbot's Data Portability During the Trial

If a small business might move from a packaged chatbot to a custom setup later, the most useful thing a developer can do during the free trial is test the export. It takes an hour, and it decides whether "start packaged, move later" is a safe plan or a trap.

It is a practical way of choosing custom AI or a SaaS chatbot by data export.

What to export during the trial

Create a few test conversations that look like real ones: a question, a handoff to a human, a tag added by staff, a note, an attachment. Then export everything the admin panel allows: conversations, contacts, tags and custom fields.

A quick checker

import csv, json, sys
from pathlib import Path

REQUIRED_CONV = {"contact_id", "channel", "timestamp", "direction", "text"}
REQUIRED_CONTACT = {"contact_id", "phone"}

def columns(path):
    p = Path(path)
    if p.suffix == ".json":
        rows = json.loads(p.read_text())
        return set(rows[0].keys()), rows
    with p.open(newline="") as f:
        rows = list(csv.DictReader(f))
    return set(rows[0].keys()), rows

conv_cols, convs = columns(sys.argv[1])
cont_cols, contacts = columns(sys.argv[2])

print("conversation columns missing:", REQUIRED_CONV - conv_cols or "none")
print("contact columns missing:", REQUIRED_CONTACT - cont_cols or "none")
print("has tags:", any("tag" in c.lower() for c in cont_cols))
print("has notes:", any("note" in c.lower() for c in conv_cols | cont_cols))

ids = {r["contact_id"] for r in contacts if r.get("contact_id")}
orphans = [r for r in convs if r.get("contact_id") not in ids]
print("conversations without a matching contact:", len(orphans))
Enter fullscreen mode Exit fullscreen mode

Run it as python check_export.py conversations.csv contacts.csv.

What you are looking for

  • A stable contact ID you can join on. Without it, conversations and contacts cannot be matched, and the history is much less useful.
  • Direction and timestamps, so you can rebuild threads in order.
  • Staff notes and tags. These usually hold the business knowledge, such as "VIP", "custom order", "complained last time".
  • Handoff markers. Can you tell which messages the bot sent and which a human sent?
  • Attachments, or at least stable links to them.

Why it matters

If the export is clean, choosing a packaged platform is low risk: start packaged, learn what customers ask, move later with your history intact. If it is not clean, factor that in now. Either pick a different tool, or schedule a monthly export from day one so you are never more than a month behind.

Put the result in a short note for the owner: "export works", or "export is missing X, here is the workaround". It is a small task that saves a painful migration later.

Disclosure: I run NxFlowAI, an AI automation agency. Portability is one of the checks in our first audit, which takes 72 hours for one workflow.

Top comments (0)