Skip to content

How to Migrate Re:amaze to Gorgias: The Complete Technical Guide

Complete technical guide to migrating from Re:amaze to Gorgias: API rate limits, field mapping, the sent_datetime trap, and step-by-step migration architecture.

Roopi Roopi · · 22 min read
How to Migrate Re:amaze to Gorgias: The Complete Technical Guide
TALK TO AN ENGINEER

Planning a migration?

Get a free 30-min call with our engineers. We'll review your setup and map out a custom migration plan — no obligation.

Schedule a free call
  • 1,500+ migrations completed
  • Zero downtime guaranteed
  • Transparent, fixed pricing
  • Project success responsibility
  • Post-migration support included

How to Migrate Re:amaze to Gorgias: The Complete Technical Guide

Info

TL;DR: Re:amaze to Gorgias Migration

A Re:amaze to Gorgias migration is a medium-complexity, API-to-API project. Realistic timeline: 5 to 14 days for a typical dataset of 10,000 to 100,000 conversations. The single biggest risk is the sent_datetime trap — omitting this field when creating messages via the Gorgias API causes Gorgias to treat every imported historical message as new outbound mail and send it to your customers. Re:amaze's five conversation statuses collapse to Gorgias's two API statuses (open and closed). Satisfaction ratings, FAQ articles, response templates, and workflows cannot be migrated via the Gorgias API and must be rebuilt manually. Teams with fewer than 5,000 conversations and no complex custom data can self-serve with a careful API script. Anything larger, with multi-channel threads or multi-brand setups, benefits from a managed migration service.

What Is a Re:amaze to Gorgias Migration?

A Re:amaze to Gorgias migration is the process of extracting conversations, messages, contacts, tags, custom data attributes, and staff records from Re:amaze's REST API and loading them into Gorgias as tickets, messages, customers, tags, ticket fields, and users.

This is not a lift-and-shift. Re:amaze is conversation-led and brand-scoped. Gorgias expects a customer, a ticket that must start with a message, and then follow-up messages. The data models overlap but enforce different relationship rules, and the workflow layer — automations, templates, routing — does not transfer at all.

Why e-commerce teams move from Re:amaze to Gorgias

Teams switch for structural, platform-specific reasons. If you are evaluating Gorgias from scratch, see our Gorgias deep dive.

  • Deeper Shopify integration. Gorgias surfaces live order data, refund actions, and shipping status directly inside the ticket sidebar. Agents can process returns, duplicate orders, and award loyalty points without switching tabs. Re:amaze connects to Shopify but does not offer in-ticket transactional order actions at the same depth.
  • Ticket-based pricing. Gorgias charges by billable ticket volume (only tickets where an agent or automation sends a response count as billable), not by seat count. For teams with many agents but moderate ticket volume, this can reduce costs. Note: imported closed tickets do not count as billable tickets since no new agent response is generated.
  • AI Agent capabilities. Gorgias's AI Agent auto-resolves repetitive tickets using store data, order history, and shipping information. It operates as a fully autonomous resolution loop tied to e-commerce context — handling order status inquiries, cancellation requests, and return initiation without human intervention.

Architectural differences that make this migration non-trivial

Status model mismatch. Re:amaze uses five or more conversation states: Open (0), Responded (1), Done (2), On-Hold (3), Spam (4), and in some configurations Archived and AI-agent states. Gorgias supports only two ticket statuses via the API: open and closed. Every non-Open conversation must be mapped to closed. If you need to preserve the original Re:amaze status for reporting, store it in a tag like reamaze_status:responded.

Message dependency. Re:amaze uses a loose Conversation model where messages attach to a thread. Gorgias uses a strict Ticket model — a ticket cannot exist without an initial message. You cannot create an empty ticket shell and populate it later. Your migration script must include the first message in the ticket creation payload.

Conversation vs. Ticket identity. Re:amaze identifies conversations by a unique slug string. Gorgias uses an auto-incrementing integer ticket_id. You need a lookup table mapping Re:amaze slugs to Gorgias ticket IDs to rebuild relationships. Use the Re:amaze slug as the Gorgias external_id for traceability.

Custom data storage limits. Re:amaze stores arbitrary key-value custom data attributes on both conversations and contacts via a flexible data hash with no documented field count limits. Gorgias limits you to 25 active ticket fields and only 4 active customer fields, with text limited to 2,000 characters per field. Any Re:amaze account with more than 4 customer data attributes requires flattening excess fields into tags, the Gorgias meta object, or the customer data object.

Multi-brand structure. Re:amaze supports multiple brands per account, each with its own channels and conversation queues. Gorgias is single-brand per account. Multi-brand Re:amaze setups need separate Gorgias accounts or consolidation with tag-based routing and team segmentation. Separate accounts preserve clean separation but require agents to switch between instances.

Object and Field Mapping: Re:amaze to Gorgias

Re:amaze Object Gorgias Object Notes / Caveats
Conversation Ticket Slug-to-ID mapping required. Status collapses from 5+ states to 2. Use slug as external_id.
Message (visibility: 0) Message (public) Must set sent_datetime to prevent re-sending. Load oldest to newest.
Message (visibility: 1) Message (channel: internal-note) Internal notes carry over cleanly.
Contact Customer Re:amaze contacts are account-level, not brand-level. Dedupe before load. Email is the primary identifier; phone numbers must be E.164 formatted (e.g., +14155551234).
Contact Identities Customer channels Re:amaze identities span email, Twitter, Facebook, Instagram, and mobile. See social channel notes below.
Staff User User Gorgias users must exist before ticket assignment. Create or invite first.
Brand N/A (account-scoped) Gorgias is single-brand per account. Map to tags, teams, or separate accounts.
Channel / Category Integration / Channel type Map Re:amaze channel values to Gorgias channel strings: email, chat, phone, sms, api.
Tag Tag Direct 1:1 mapping. Tags are created on-the-fly in Gorgias when included in ticket creation.
Custom Data (conversation) Ticket Field or meta Max 25 active ticket fields. Overflow goes to meta JSON.
Custom Data (contact) Customer Field Max 4 active customer fields. Text capped at 2,000 characters.
FAQ Article N/A Gorgias Help Center articles must be recreated manually or via separate import.
Satisfaction Rating N/A Historical CSAT scores cannot be imported via the Gorgias API. Baseline resets at go-live.
Response Template Macro No API import path for full macro behavior. Text can be imported via Gorgias macro CSV (fields: name, body_text, tags, id). Actions, variables, and attachments must be rebuilt manually.
Workflow / Automation Rule No export from Re:amaze. Gorgias Rules are event-driven and must be rebuilt from scratch.

Social channel migration specifics

Re:amaze stores Facebook Messenger, Instagram DM, and Twitter DM conversations with platform-specific metadata (page IDs, user handles, thread references). These conversations can be imported into Gorgias as tickets, but with significant limitations:

  • Historical social conversations import as text transcripts only. The original platform threading context (Facebook page ID, Instagram business account link) is not preserved.
  • Future social messages require reconnecting each social account natively in Gorgias via OAuth. Gorgias integrates directly with Facebook Messenger and Instagram DM; Twitter/X integration availability depends on your Gorgias plan.
  • Recommended approach: Import historical social conversations with channel: "api" and a tag like original_channel:facebook. This preserves the transcript without creating false channel associations.

Voice and phone channel migration

Re:amaze supports voice conversations. Call recordings are stored as URLs within the conversation data. Gorgias does not natively import call recordings into its phone integration. For voice conversations:

  • Import the text transcript or call notes as a ticket message with channel: "phone".
  • Host call recording files externally (S3, Google Cloud Storage, or your existing telephony provider's storage) and append the recording URL to the message body.
  • Verify that recording URLs will remain accessible long-term — Re:amaze-hosted recording URLs may expire after account deactivation.
Warning

CSAT history does not migrate. Historical customer satisfaction ratings cannot be imported into Gorgias via the API. Export your Re:amaze CSAT data to CSV for historical reporting and communicate this baseline reset to CS leadership before cutover. Plan to re-establish CSAT benchmarks over the first 30 days in Gorgias.

The API Bottleneck: Rate Limits on Both Sides

Both platforms enforce rate limits that directly control migration throughput.

Re:amaze API limits. The Re:amaze API is rate-limited per minute per API token. The exact numeric limit is not publicly documented in their API reference, but exceeding it returns HTTP 429 Too Many Requests with no Retry-After header — implement a fixed 60-second backoff on 429 responses. Re:amaze uses page-based pagination with a default page_size of 30 (maximum varies by endpoint). API requests are scoped by Brand, so multi-brand accounts require separate extraction passes per brand. Authentication uses HTTP Basic Auth with the user's email as the username and the API token as the password. (Re:amaze API documentation)

Two easy-to-miss extraction traps: GET /conversations excludes archived conversations unless you set filter=all, and GET /messages returns results sorted by created_at descending — you must reverse the order before loading into Gorgias.

Gorgias API limits. Gorgias uses a leaky bucket algorithm. API key integrations allow 40 requests per 20-second window (sustained 2 requests/second). OAuth2 apps allow 80 requests per 20-second window (sustained 4 requests/second). The limit is per account, not per key — every active integration on the account shares the same budget. Exceeding the limit returns a 429 error with a Retry-After header in seconds. (developers.gorgias.com)

Build your migration script to read the Retry-After header on every 429 response and implement exponential backoff. Pause all other Gorgias integrations (Shopify event sync, chat widget, email forwarding) during the import window to avoid sharing the rate limit budget.

Throughput math

Throughput is message-driven, not ticket-driven. Using an API key at 40 requests per 20 seconds (2 requests/second sustained), and assuming each ticket creation consumes 1 request plus 1 request per additional message beyond the first:

  • A 10,000-conversation dataset with an average of 4 messages per conversation requires roughly 40,000 API calls on the Gorgias side (10K ticket creates + 30K additional messages). At 2 requests/second, that is approximately 5.5 hours of continuous import time, excluding retries, customer upserts, and custom field writes.
  • Switching to OAuth2 (4 requests/second) cuts that to roughly 2.8 hours.
  • A 100,000-conversation dataset at the same ratio needs about 55 hours (roughly 2.3 days) of API key runtime.
  • Add approximately 20% overhead for customer upserts, custom field writes, attachment handling, and retry loops.

If your conversations average more messages — common in e-commerce support where order troubleshooting threads run 8 to 12 messages — the total climbs proportionally. A 50,000-conversation dataset averaging 8 messages per conversation requires ~400,000 API calls and roughly 55 hours at OAuth2 rates.

Migration Approaches: Which Path Fits Your Team?

Approach How It Works Best For Complexity Risk Level
CSV export + manual import Export contacts as CSV from Re:amaze. No native conversation CSV export exists. Contact-only moves under 1,000 records Low Medium (no conversation history)
Third-party tool (Help Desk Migration) Automated wizard connecting Re:amaze and Gorgias via their APIs. Runs a demo migration on a sample before full run. Mid-size teams wanting a GUI-based approach, standard email-heavy setups Medium Medium (limited control over edge cases, attachment handling varies)
Custom API script (DIY) Extract from Re:amaze REST API, transform, load via Gorgias REST API Teams with a dedicated developer and under 50K conversations High High (sent_datetime, rate limits, retries, race conditions)
Managed migration service Dedicated engineers handle extraction, transformation, loading, and validation Enterprise datasets, multi-brand, zero-downtime requirements Low (for you) Low

Gorgias does not offer a built-in import wizard for Re:amaze. The Gorgias native importer supports Zendesk only. The most documented third-party option is Help Desk Migration, which Gorgias references in its help center. For a comparison of automated tools vs. managed services, see our ClonePartner vs Help Desk Migration breakdown.

Small teams (under 5,000 conversations): A custom API script works if you have a developer who can handle the sent_datetime requirement, rate limit throttling, and status mapping. Budget 40 to 80 hours of engineering time including testing and validation.

Mid-size teams (5,000 to 50,000 conversations): A third-party tool or managed service is appropriate. DIY at this scale typically requires handling pagination edge cases, customer deduplication across brands, and multi-day import runs with checkpointing to resume after failures.

Enterprise (over 50,000 conversations): Use a managed service. The engineering time to handle multi-brand extraction, attachment hosting, rate limit orchestration, delta syncs, and GDPR-compliant data handling almost always exceeds the cost of outsourcing. If your migration has already failed or stalled, our rescue guide covers recovery patterns.

Step-by-Step Migration Architecture

The order of operations matters. Loading tickets before customers exist in Gorgias causes orphaned records. Loading messages without sent_datetime sends live email to your customers.

Phase 1: Pre-create destination objects

  1. Create Gorgias users. Map each Re:amaze staff member to a Gorgias user via POST /api/users with email, name, and role. Users must exist before tickets can be assigned to them. Store the mapping of Re:amaze staff IDs to Gorgias user IDs.
  2. Define ticket fields and customer fields. Set up your field schema in Gorgias before import. Remember: 25 active ticket fields max, 4 active customer fields max. Audit your Re:amaze custom data attributes and decide which fields to keep, which to flatten into tags, and which to store in the meta object.
  3. Create tags, teams, and macros. Pre-create any structural objects your data depends on.
  4. Pause automations and integrations. Disable Gorgias Rules that trigger on ticket creation to prevent auto-replies and auto-tagging on imported historical data. Pause Shopify event sync and email forwarding to maximize your rate limit budget for the import.

Phase 2: Extract from Re:amaze

# Extract conversations from Re:amaze (paginated, with retry logic)
import requests
import time
import json
 
BRAND = "yourbrand"
AUTH = ("you@example.com", "your-api-token")
HEADERS = {"Accept": "application/json"}
 
def extract_conversations():
    page = 1
    all_conversations = []
    while True:
        # filter=all includes archived conversations — omitting this silently drops history
        url = f"https://{BRAND}.reamaze.io/api/v1/conversations?page={page}&page_size=50&filter=all"
        resp = requests.get(url, auth=AUTH, headers=HEADERS)
        if resp.status_code == 429:
            time.sleep(60)  # Re:amaze does not return Retry-After; fixed backoff
            continue
        if resp.status_code != 200:
            raise Exception(f"Re:amaze API error {resp.status_code}: {resp.text}")
        data = resp.json()
        convos = data.get("conversations", [])
        if not convos:
            break
        all_conversations.extend(convos)
        # Checkpoint progress for resumability on large extractions
        with open(f"checkpoint_page_{page}.json", "w") as f:
            json.dump(convos, f)
        page += 1
    return all_conversations
 
def extract_messages(conversation_slug):
    """Retrieve full message thread for a conversation, including internal notes."""
    url = f"https://{BRAND}.reamaze.io/api/v1/conversations/{conversation_slug}"
    resp = requests.get(url, auth=AUTH, headers=HEADERS)
    if resp.status_code == 429:
        time.sleep(60)
        return extract_messages(conversation_slug)
    messages = resp.json().get("message", [])
    # CRITICAL: Re:amaze returns messages in descending order — reverse to ascending
    messages.reverse()
    return messages

For each conversation, issue a separate GET /api/v1/conversations/{slug} call to retrieve the full message thread including internal notes.

Critical extraction details:

  • Re:amaze returns messages sorted by created_at descending. Reverse the order to ascending before loading into Gorgias.
  • GET /conversations excludes archived conversations unless you set filter=all. Omitting this parameter silently drops historical data.
  • Re:amaze attachments are returned as URLs within the message object. Test whether these URLs remain accessible after account deactivation — if not, download and re-host attachments during extraction.

Phase 3: Upsert customers

Re:amaze contacts are account-level, not brand-scoped. Identities can span email, mobile, and social handles. Deduplicate contacts by email address before ticket loading to prevent split customer history in Gorgias.

When upserting customers via POST /api/customers or PUT /api/customers/{id}:

  • Use email as the primary lookup key.
  • Format phone numbers in E.164 format (e.g., +14155551234).
  • Handle 301 Customer was merged redirect responses — follow the redirect to the canonical customer ID and update your mapping table. Failing to handle this causes duplicate customer records and breaks ticket-to-customer associations.

Phase 4: Transform and map

  • Map Re:amaze status integers to Gorgias open or closed. Only status 0 (Open) maps to open. Statuses 1 (Responded), 2 (Done), 3 (On-Hold), and 4 (Spam) all become closed. Store the original numeric status as a tag (e.g., reamaze_status:3) if you need it for reporting.
  • Convert Re:amaze visibility: 1 messages to Gorgias channel: "internal-note".
  • Map Re:amaze category.channel values to Gorgias channel strings (email, chat, phone, sms). If no clean match exists, use api — but be aware of the auto-reply trap (see Edge Cases below).
  • Flatten excess custom data attributes into tags or the ticket meta field. The meta field accepts arbitrary JSON but is not searchable in the Gorgias UI.
  • Truncate subjects to 998 characters (Gorgias API limit).
  • Strip or re-host inline images in message bodies that exceed 1 MB total body size.

Phase 5: Load tickets with first message

Create each ticket via POST /api/tickets with the first message included in the payload. A ticket cannot exist without an initial message.

# Create a ticket with its first message in Gorgias
import requests
import time
 
GORGIAS_DOMAIN = "yourstore"
GORGIAS_AUTH = ("you@example.com", "your-api-key")
 
def create_ticket_with_retry(conversation, messages, max_retries=5):
    first_msg = messages[0]  # Already sorted oldest-first
    
    # Determine sender: customer or agent
    is_agent = first_msg.get("user", {}).get("staff", False)
    
    payload = {
        "customer": {"email": conversation["author"]["email"]},
        "channel": "email",
        "via": "api",
        "status": "closed" if conversation.get("status", 0) != 0 else "open",
        "external_id": f"reamaze_{conversation['slug']}",
        "tags": [{"name": t} for t in conversation.get("tag_list", [])],
        "messages": [{
            "channel": "email",
            "via": "api",
            "from_agent": is_agent,
            "sender": {"email": first_msg["user"]["email"]},
            "body_text": first_msg.get("body", ""),
            "body_html": first_msg.get("body_html", f"<p>{first_msg.get('body', '')}</p>"),
            "sent_datetime": first_msg["created_at"],  # CRITICAL — omitting sends live email
            "created_datetime": first_msg["created_at"]
        }]
    }
    
    for attempt in range(max_retries):
        resp = requests.post(
            f"https://{GORGIAS_DOMAIN}.gorgias.com/api/tickets",
            json=payload, auth=GORGIAS_AUTH
        )
        if resp.status_code == 429:
            retry_after = int(resp.headers.get("Retry-After", 10))
            time.sleep(retry_after)
            continue
        if resp.status_code == 400:
            # Log payload for debugging — common causes: oversized body, invalid email
            raise Exception(f"400 error: {resp.text} | Slug: {conversation['slug']}")
        return resp.json().get("id")
    
    raise Exception(f"Max retries exceeded for conversation {conversation['slug']}")
Danger

Never omit sent_datetime. Any message created via the Gorgias API without sent_datetime is treated as a new outbound message. Gorgias will asynchronously send it to the customer via the configured channel. This is the single most common cause of migration disasters. Always set sent_datetime to the original Re:amaze created_at timestamp for every imported message — on both the initial message and all subsequent appended messages. (developers.gorgias.com)

Phase 6: Append remaining messages

After the ticket is created and you have the Gorgias ticket_id, load subsequent messages using POST /api/tickets/{ticket_id}/messages. Set from_agent: true for staff replies and from_agent: false for customer messages. Always include sent_datetime. For internal notes, set channel: "internal-note".

Important: Load messages sequentially in chronological order. Parallel/async message loading can cause race conditions where messages attach to the wrong ticket or arrive out of order. If you must parallelize, parallelize across tickets (each ticket's messages loaded sequentially), not within a single ticket's message thread.

Phase 7: Backfill custom fields

Update ticket custom fields via PUT /api/tickets/{ticket_id}/custom-fields. Be careful: this endpoint uses replace-all semantics. Any field missing from the payload is deleted. Always send the complete set of field values in each update.

# Example: always send ALL fields, not just the ones you're updating
custom_fields_payload = [
    {"id": 123, "value": "order_issue"},    # field you're setting
    {"id": 124, "value": "high"},            # field that already exists — must include
    {"id": 125, "value": "reamaze_migrated"} # field that already exists — must include
]

Phase 8: Handle attachments

Re:amaze stores attachments as URLs within message objects. Migration requires:

  1. Download each attachment from the Re:amaze URL during extraction.
  2. Re-host on durable external storage (S3, Google Cloud Storage, or similar). Re:amaze-hosted URLs may become inaccessible after account deactivation.
  3. Include attachment URLs in the Gorgias message payload using the attachments array with url, name, and content_type fields.
  4. Verify that total message body size (HTML body + inline images) does not exceed 1 MB. For messages exceeding this limit, strip inline images and replace with links to externally hosted versions.

Phase 9: Delta sync and cutover

Run a final delta pass after the historical load to capture any conversations created in Re:amaze during the migration window. Filter by created_at greater than your extraction timestamp. Then:

  1. Point support email forwarding to Gorgias.
  2. Activate the Gorgias chat widget.
  3. Reconnect social channel integrations (Facebook, Instagram) natively in Gorgias.
  4. Deactivate Re:amaze chat widget and email forwarding.
  5. Re-enable Gorgias Rules.
  6. Confirm Shopify integration is live and order data appears in the ticket sidebar.
  7. Keep Re:amaze in read-only mode for 30 days as a rollback safety net.

GDPR and Data Residency Considerations

Migrating customer PII (emails, phone numbers, conversation content, order details) between platforms requires attention to data protection requirements:

  • Data processing agreements. Ensure your DPAs with both Re:amaze and Gorgias cover data transfer between processors. Gorgias stores data in AWS US regions by default; verify this aligns with your data residency requirements.
  • Right to erasure. If customers have submitted GDPR deletion requests in Re:amaze, verify that their data is excluded from extraction before loading into Gorgias.
  • Transit encryption. Both Re:amaze and Gorgias APIs use HTTPS/TLS. If you stage extracted data on disk during transformation, encrypt at rest.
  • Retention limits. Document your data retention policy in Gorgias. Imported historical conversations should follow the same retention schedule as natively created tickets.

How Long Does a Re:amaze to Gorgias Migration Take?

Phase Duration Dependencies
Discovery and field mapping 1 to 2 days Access to both platforms, stakeholder sign-off on field schema, custom data audit
Script development or tool configuration 2 to 4 days API credentials, test environment, attachment hosting setup
Test migration and validation 1 to 2 days Sample dataset (recommend 500+ conversations), QA resources
Production migration 1 to 3 days Volume, rate limits, attachment count
Delta sync and go-live 1 day Coordinated cutover window, agent training complete
Total 5 to 14 days

Big-bang cutovers fit only small single-brand setups under 5,000 conversations. Most teams should load history in the background while Re:amaze stays live, then switch routing after a final delta sync. If brands operate independently, a phased cutover by brand is safer than a single weekend cutover.

Go-live criteria:

  • All conversations reconciled by count (zero discrepancy, accounting for intentional exclusions).
  • Sample of 50 to 100 tickets verified field-by-field across all channels.
  • No 429 errors in the final batch.
  • All Gorgias users active and able to log in.
  • Shopify integration confirmed live with order data visible in sidebar.
  • No imported messages sent to customers (verified via Gorgias activity log).
  • Agent training complete — at minimum, macros, ticket assignment, and Shopify sidebar actions.

Rollback plan: Keep Re:amaze active in read-only mode for 30 days post-migration. If Gorgias data is found to be incomplete or corrupt, Re:amaze remains the system of record while issues are resolved. For a botched Gorgias import requiring cleanup, use DELETE /api/tickets/{id} to remove incorrectly created tickets — note that Gorgias does not offer a bulk delete API endpoint, so cleanup of large volumes requires scripted sequential deletion subject to the same rate limits.

What Do Customers Notice During Migration?

Customers should notice nothing if the migration is executed correctly. The work happens in the background while your team continues using Re:amaze. The cutover itself takes minutes: point your support email forwarding to Gorgias, activate the Gorgias chat widget, and deactivate Re:amaze.

Conversation history is preserved as closed tickets in Gorgias. When a returning customer opens a new ticket, agents see their full history in the customer sidebar. This continuity preserves context for agents handling repeat issues.

What changes for agents: The Gorgias macro system, Shopify sidebar, and routing model are structurally different from Re:amaze. Key differences agents will encounter:

  • Ticket assignment replaces Re:amaze's conversation claiming model.
  • Gorgias macros support variables ({{ticket.customer.name}}) but action configuration differs from Re:amaze templates.
  • The two-status model (open/closed) replaces Re:amaze's multi-status workflow — agents accustomed to "On-Hold" or "Responded" states need new habits.

Schedule training sessions during the test migration phase so agents are comfortable before cutover.

What is lost: Historical CSAT scores do not migrate. Live chat widget history from Re:amaze does not carry over as interactive chat — it imports as static transcript text in a closed ticket. Inform CS leadership about these baseline resets before cutover.

What Data Cannot Be Migrated from Re:amaze to Gorgias?

Data Type Migration Status Workaround
Satisfaction ratings Not importable via API Export to CSV from Re:amaze before deactivation
FAQ / Knowledge Base articles Not importable via ticket API Recreate manually in Gorgias Help Center or use a separate content migration script
Workflows and automations No Re:amaze export; Gorgias Rules are structurally different Document Re:amaze workflow logic and rebuild as Gorgias Rules from scratch
Response templates (full behavior) Text only; actions do not transfer Import text via Gorgias macro CSV (name, body_text, tags, id). Rebuild actions manually.
Multi-brand structure Gorgias is single-brand per account Use multiple Gorgias accounts or consolidate with tag-based routing and team segmentation
Status granularity 5+ statuses collapse to 2 Preserve original status as a tag (e.g., reamaze_status:on-hold)
Chat widget conversation continuity Imports as static text, not interactive chat Agents see transcript in ticket history but cannot continue the original chat thread
Call recordings No native import into Gorgias phone integration Host recordings externally and link URLs in ticket messages

Edge Cases and Known Pitfalls

The sent_datetime disaster. If your migration script does not set sent_datetime on every imported message, Gorgias treats it as new outbound mail and sends it asynchronously. This applies to both the initial message in ticket creation and all subsequently appended messages. This is the single most common cause of migration disasters and the one that causes real customer trust damage. Always set sent_datetime to the original Re:amaze created_at timestamp. Validate this in your test migration by checking the Gorgias activity log for any outbound send events on imported tickets.

The API channel trap. If a ticket is imported into Gorgias with the channel set to api, two things break: (1) Gorgias auto-reply rules will not trigger for those tickets, and (2) keyword-based rules require stripped_text (not body_text) to inspect the message body when the channel is api. You must explicitly set the channel to email, chat, or the correct source channel in your payload to ensure routing rules function correctly. For more on Gorgias routing behavior, see How to Migrate from Freshdesk to Gorgias.

Message body size limit. Gorgias rejects message bodies exceeding 1 MB with HTTP 400. Long email threads with embedded images (common in e-commerce support with product screenshots) must be trimmed or have images hosted externally and linked. For oversized attachments, host them on an external service (S3, etc.) and append a downloadable link to the message body.

Custom field replace-all semantics. PUT /api/tickets/{ticket_id}/custom-fields replaces the entire field set. Any field missing from the payload is deleted. Always send the complete set of field values in each update. This is especially dangerous when updating fields incrementally across multiple script passes.

Archived conversation exclusion. Re:amaze's GET /conversations endpoint excludes archived conversations by default. Use filter=all to include them, or you will silently lose historical data. There is no warning or error — the API simply returns fewer results.

Subject length cap. Gorgias caps ticket subjects at 998 characters. Truncate during transformation to avoid API rejections. Re:amaze does not enforce the same limit, so long subjects from email threads are common.

Customer merge responses. Handle 301 Customer was merged redirect responses on Gorgias customer retrieval or updates. Follow the redirect to get the canonical customer ID and update your slug-to-ID mapping table. Failure to handle this causes duplicate customer records and orphaned tickets.

Race conditions in async loading. If you parallelize message loading within a single ticket, messages can arrive out of order or attach to the wrong ticket due to timing issues. Always load a single ticket's messages sequentially. Parallelize across tickets, not within them.

Gorgias sandbox limitations. Gorgias does not offer a dedicated sandbox or staging environment. Test migrations must run against a real Gorgias account. Options: (1) create a separate test Gorgias account (requires a separate subscription), (2) run a test import of 100 to 500 conversations into your production account and delete them afterward, or (3) use a trial Gorgias account for testing (7-day trial available). Delete test data before production import to avoid confusion.

Validation and Testing

Post-migration validation ensures data integrity. Do not rely solely on script success logs — a 200 response does not guarantee correct data.

  1. Record count reconciliation. Compare total conversations extracted from Re:amaze against total tickets created in Gorgias. Tolerance: zero discrepancy. Account for any intentional exclusions (e.g., spam conversations). Separately reconcile customer counts.
  2. Field-level spot checks. Sample 50 tickets at random across all channels (email, chat, social, phone). Verify subject, tags, status, message count, customer email, channel type, and timestamps match source data.
  3. Thread integrity. Sample at least one long thread (10+ messages) from each major channel. Verify chronological order of messages is correct and no messages are missing or duplicated.
  4. Internal note preservation. Confirm that Re:amaze internal notes (visibility: 1) appear as internal notes in Gorgias, not as customer-facing messages. Check at least 10 tickets with internal notes.
  5. Attachment verification. For a sample of 20 tickets with attachments, confirm files are accessible and downloadable in Gorgias. Verify image attachments render correctly inline.
  6. No outbound sends. Check the Gorgias activity log to confirm no imported messages were sent to customers. This is the most important validation check. Search for any "email sent" events on tickets with external_id containing reamaze_.
  7. Search verification. Search by subject, email, phone, and external_id inside Gorgias to confirm records are discoverable.
  8. Custom field verification. Verify that ticket fields and customer fields contain correct values and that no data was truncated at the 2,000-character limit.
  9. Shopify integration test. Open a ticket for a known customer with recent orders. Confirm order data appears in the Gorgias sidebar.

For a full post-migration testing framework, see our Help Desk Data Migration QA Checklist.

Build In-House or Use a Managed Service?

Build in-house when: Your dataset is under 5,000 conversations, you have no multi-brand or multi-channel complexity, your conversations are predominantly email, and you have a developer who can dedicate 2 to 3 weeks to the project including testing and validation.

Use a managed service when: You have over 10,000 conversations, need zero-downtime cutover with delta sync, have multi-brand Re:amaze accounts, have significant social or voice channel history, or cannot afford a failed migration that sends historical messages to live customers.

The hidden cost of DIY is not the initial script. It is the re-migration after discovering that 3,000 tickets were sent as live emails because sent_datetime was null on one code path. It is the 40 hours debugging why 8% of messages landed on the wrong ticket because of a race condition in the async loader. It is the customer trust damage from a "we're re-sending old conversations" incident that no apology email can fully repair.

The break point is complexity, not just volume — Re:amaze contacts are account-level, message origins span email, chat, SMS, voice, and social, and Gorgias has hard field limits (25 ticket fields, 4 customer fields) and strict rate limits (40 requests per 20 seconds shared across all integrations). A 20,000-conversation move can be straightforward or painful depending on the channel mix, attachment volume, and custom data complexity.

ClonePartner has completed over 1,500 helpdesk migrations, including Re:amaze and Gorgias projects involving multi-brand consolidation and real-time delta syncs. Our engineers handle sent_datetime enforcement, rate limit orchestration, attachment re-hosting, and post-migration validation as a managed, zero-downtime service.

Frequently Asked Questions

How long does a Re:amaze to Gorgias migration take?
A typical Re:amaze to Gorgias migration takes 5 to 14 days end to end, depending on conversation volume and data complexity. The actual data transfer for 10,000 conversations takes roughly 3 to 6 hours at Gorgias's API key rate limit of 40 requests per 20-second window. Script development, testing, and validation account for the rest of the timeline.
Will Gorgias resend imported messages to my customers?
Yes, if your migration script does not set the sent_datetime field on every imported message. When sent_datetime is empty, Gorgias treats the message as new outbound mail and sends it asynchronously. Always set sent_datetime to the original Re:amaze created_at timestamp.
What data cannot be migrated from Re:amaze to Gorgias?
Historical CSAT ratings, FAQ articles, response template actions, and workflow automations cannot be imported into Gorgias via the API. These must be rebuilt manually. Conversation history, messages, contacts, tags, and custom data attributes can all be preserved.
What are the Gorgias API rate limits for migration?
Gorgias enforces a leaky bucket rate limit of 40 requests per 20-second window for API key integrations and 80 requests per 20-second window for OAuth2 apps. The limit is per account, meaning all integrations share the same budget. Exceeding the limit returns a 429 error with a Retry-After header.
Is there a native Re:amaze to Gorgias migration tool?
Gorgias does not offer a built-in import wizard for Re:amaze. The Gorgias native importer supports Zendesk only. Re:amaze to Gorgias migrations must use both platforms' REST APIs or a third-party migration service like Help Desk Migration.

More from our Blog

Mastering Gorgias: The 2026 Technical Guide to Turning Customer Support into a Profit Engine
Gorgias

Mastering Gorgias: The 2026 Technical Guide to Turning Customer Support into a Profit Engine

This blog is a comprehensive 2026 technical guide to the Gorgias helpdesk , detailing how e-commerce brands can transform customer support into a profit engine. It provides an expert-driven walkthrough of the complete Gorgias setup , advanced automations , and AI features . The guide also emphasizes the critical role of expert help desk migration to preserve historical data and maximize the platform's potential .

Raaj Raaj · · 9 min read