Migration guides.
Field-mapping guides for moving Zentoko data into the most common destinations. The export ZIP is structured JSON. These are recipes for translating that JSON into the import format each tool expects.
Don't see your destination tool? Email info@zentoko.com and we'll add a guide within 48 hours.
Blog posts
Each post has title, slug, content (markdown), contentHtml, featuredImage URL, tags, publishedAt, status, and SEO metadata. The content field is canonical markdown, which most destinations accept that directly.
- Settings → Labs → Import content (Ghost JSON format).
- Run the conversion script in our reference repo (or write a 30-line Node script): map title → title, slug → slug, content → mobiledoc, featuredImage → feature_image, tags → tags[].
- Status: Zentoko's PUBLISHED maps to Ghost's published, DRAFT to draft.
- Tools → Import → install "WP All Import" plugin.
- Map content → post_content (use the markdown plugin, or convert to HTML using contentHtml field instead).
- Map featuredImage → _thumbnail_id (WP All Import handles URL-to-attachment conversion).
- No bulk import. Use the API (substack.com/api/v1/posts) or paste each post manually.
- For each post: copy contentHtml into the Substack rich-text editor (it preserves formatting).
- Project → CMS → Import items via CSV.
- Flatten the JSON: one row per blog post, columns title / slug / content / featuredImage / publishedAt.
Contact form submissions
Threaded inbox of every contact-form submission. Each row has name, email, organization, message, status (NEW/READ/RESPONDED/SPAM/ARCHIVED), sourceUrl, createdAt.
- Contacts → Import → File from computer.
- Map email → Email, name → First name + Last name (split on space), organization → Company.
- Custom property: import status as a HubSpot enumeration field for follow-up filtering.
- Tools → Import data → Person + organization.
- Map email → Email, name → Name, organization → Org name.
- Each submission can become a Person + linked Activity (the message body). Use Pipedrive's Activity import in the same flow.
- Filter records.contactSubmissions to status='NEW' or 'READ' (the not-yet-responded ones).
- For each, send yourself an email with the body inline. The Reply-To is already correct in the JSON.
Generated images, videos, music beds
Every S3-hosted asset the brand owns, with a 7-day signed URL pointing directly at the file. After 7 days, request a fresh export to re-sign.
- Bash: jq -r '.assetManifest[] | .url' brand-export.json | xargs -n 1 -P 4 wget -q
- PowerShell: Get-Content brand-export.json | ConvertFrom-Json | Select -Expand assetManifest | ForEach-Object { Invoke-WebRequest $_.url -OutFile (Split-Path $_.s3Key -Leaf) }
- Both download in parallel. Plan for the total size first. Character-pose poses + music beds + media assets can total 1-10 GB for an active brand.
- Treat the manifest as an aws-cli sync source: download to local, then re-upload with `aws s3 cp --recursive` to your destination bucket.
- Preserve the relative path structure for clean URLs in your new tool.
- If your destination tool can ingest URLs directly, paste them in. The 7-day window is enough for a one-shot import.
Brand DNA (voice, pillars, audience)
The strategic foundation Zentoko built for you. JSON shape is documented in the export's README.md.
- Paste the markdown rendering of brand.dna (use the README.md generated as part of the export).
- Most teams turn this into a shared Brand Bible page after migration.
- JSON.stringify(brand.dna) makes a solid system-prompt prefix for ChatGPT / Claude / Gemini.
- Paste at the top of every conversation about the brand to maintain voice consistency.
Stuck?
Email info@zentoko.com with a screenshot of your destination tool's import dialog and a paste of the JSON section you're trying to map. We'll respond with a working translation script within 24 hours, and we'll add it to this page so the next person doesn't have to ask.
← Back to offboarding policy
Social posts (queued + published)
Every Post row Zentoko ever generated for the brand: caption, mediaUrls, scheduledAt, publishedAt, platform (via PostPlatform child rows). Useful for archive, less useful for re-import (each platform's API differs).