Syncific Documentation
The complete guide to syncing creative assets from any source to any CMS, automatically.
Syncific connects your creative tools (Adobe Lightroom & Photoshop, Figma, Canva, Dropbox, Google Drive, OneDrive, Shutterstock) to your CMS platforms (WordPress, Shopify, HubSpot, Contentful, Webflow) through a secure broker architecture.
Key Concepts
- Sources — where your creative assets live (Lightroom, Figma, Canva, etc.)
- Destinations — where you publish them (WordPress, Shopify, HubSpot, etc.)
- Broker — Syncific's patent-pending secure middleware that handles OAuth, encryption, and asset delivery
- Sync — the process of pushing assets from source to destination with optimization
How it Works
- Connect your sources via OAuth (your credentials are encrypted and never stored on your CMS)
- Add your destination CMS platforms
- Browse your source assets, select what to sync
- Syncific compresses (AVIF/WebP), generates alt text, and pushes to all selected destinations
Quick Start
Get syncing in 5 minutes:
1. Sign Up
Go to app.syncific.com and choose a plan. All plans include a 14-day free trial — your card is collected at signup but not charged until the trial ends.
2. Connect a Source
Go to Sources and click Connect on any platform. You'll be redirected to authorize via OAuth. Your credentials are encrypted with AES-256 and stored securely in the Syncific broker — never on your CMS.
3. Add a Destination
Go to Destinations and click Add Destination. Choose your CMS type:
- WordPress — uses Application Passwords (WP 5.6+)
- Shopify — OAuth connection to your store
- HubSpot — OAuth connection to your portal
- Contentful — OAuth connection to your space
- Webflow — OAuth connection to your site
4. Browse & Sync
Go to Browse, select a source tab, choose your assets, select destination(s), and click Sync. Syncific handles compression, alt text, and delivery automatically.
Plans & Pricing
All plans include a 14-day free trial. Cancel anytime before the trial ends.
| Feature | Solo | Agency | Max |
|---|---|---|---|
| Monthly price | $49/mo | $149/mo | $399/mo |
| Annual price | $33/mo | $99/mo | $266/mo |
| Concurrent sessions | 1 | 3 | Unlimited |
| Client workspaces | 1 | 10 | Unlimited |
| Sources | All | All | All |
| Destinations | 3 (+$10/mo each) | 15 (+$10/mo each) | Unlimited |
| Assets/month | Unlimited | Unlimited | Unlimited |
| WebP & AVIF optimization | Yes | Yes | Yes |
| Auto alt text | Yes | Yes | Yes |
| Scheduled sync | Yes | Yes | Yes |
| Groups & governance | — | — | Yes |
| AI scoring + A/B testing | — | Yes | Yes |
| GSC intelligence | — | Yes | Yes |
| Analytics (CSV export) | — | Yes | Yes |
| Claude AI (MCP) | — | Yes | Yes |
| Team roles + permissions | — | — | Yes |
| Priority support | — | — | Yes |
| Dedicated onboarding | — | — | Yes |
Sources Overview
Syncific connects to 7 built-in creative asset sources plus custom API sources and AI generation via OpenRouter. Built-in connections use official OAuth flows. Custom sources use Personal Access Tokens stored in an AES-256 encrypted vault. Your credentials are never stored on your CMS.
Adobe Lightroom & Photoshop
Source
Sync photos directly from Adobe Creative Cloud. One authorization covers both Adobe Lightroom Cloud and Photoshop cloud documents — access all your catalogs, albums, and cloud PSDs.
Setup
- Go to Sources → click Connect on Lightroom
- Sign in with your Adobe ID
- Authorize Syncific to access your Lightroom catalog
Browsing
In Browse, select the Lightroom tab. Choose your catalog, then an album. Assets display with thumbnails from Adobe's CDN.
Syncing
Lightroom assets are downloaded at up to 2048px resolution, compressed to AVIF/WebP in your browser (zero server cost), then pushed to your destinations.
Figma
Source
Export frames and components from Figma files. Supports all frame types including components, groups, and sections.
Setup
- Go to Sources → click Connect on Figma
- Authorize with your Figma account
- Add Figma files by URL or file key in the Browse sidebar
Browsing
Select the Figma tab in Browse. Your added files appear in the left panel. Click a file to see its frames. Each frame/component can be synced individually.
Canva
Source
Sync designs directly from your Canva account. All design types are supported.
Setup
- Go to Sources → click Connect on Canva
- Authorize with your Canva account
Syncing
Canva designs are exported as high-quality PNG via the Canva Export API, then compressed to AVIF/WebP before delivery to your destinations.
Dropbox
Source
Sync images from your Dropbox folders. Supports recursive folder browsing.
Setup
- Go to Sources → click Connect on Dropbox
- Authorize with your Dropbox account
Browsing
Browse your Dropbox folder structure. Images are displayed with thumbnails. Click into folders to navigate deeper.
Google Drive
Source
Sync images from Google Drive folders. Thumbnails are provided directly by Google's API.
Setup
- Go to Sources → click Connect on Google Drive
- Authorize with your Google account
- Grant read-only access to your Drive files
OneDrive
Source
Sync images from Microsoft OneDrive. Requires a personal Microsoft account (Outlook/Hotmail/Live).
Setup
- Go to Sources → click Connect on OneDrive
- Sign in with your Microsoft account
Shutterstock
Source
Sync your licensed Shutterstock images. Only images you've already licensed are available.
Setup
- Go to Sources → click Connect on Shutterstock
- Authorize with your Shutterstock account
Custom Sources
Source Agency & Max
Connect any API as a creative source via Personal Access Token (PAT). Browse and sync assets from stock libraries, DAMs, headless CMSes, or any custom API endpoint — alongside your built-in OAuth sources.
How to set up
- Go to Sources → Custom Sources → Add Custom Source
- Choose a preset (auto-fills API URL, headers, and response mapping) or select Custom API to configure from scratch
- Paste your Personal Access Token (API key) for the service
- If using Custom API, configure the response mapping so Syncific knows how to extract assets from the API response
- Click Verify & Connect — Syncific tests the endpoint and stores your token securely
Available presets
| Preset | Category | What you need |
|---|---|---|
| Unsplash | Stock | Access Key from Unsplash Developers |
| Pexels | Stock | API Key from Pexels API |
| Pixabay | Stock | API Key from Pixabay API |
| Flickr | Stock / Personal | API Key from Flickr API |
| SmugMug | Photography | API Key + OAuth token |
| 500px | Photography | Consumer Key |
| Cloudinary | DAM | API Key + API Secret |
| Brandfolder | DAM | API Key |
| Bynder | DAM | OAuth token |
| Contentful | Headless CMS | CDA token + Space ID |
| Sanity | Headless CMS | API token + Project ID |
| Airtable | Database | Personal Access Token |
| Notion | Database | Integration token |
| WordPress | CMS | Application Password + site URL |
| Custom API | Any | API URL + token + response mapping |
Response mapping
When using a custom API (or overriding a preset), configure how Syncific extracts asset data from the API response:
| Field | Description | Example |
|---|---|---|
items_path | JSON path to the array of items in the response | results, data.images, photos |
id_field | Field name for the unique asset ID | id, asset_id |
name_field | Field name for the asset name / title | description, title, alt_description |
thumb_field | Field name or path for the thumbnail URL | urls.thumb, src.tiny |
download_field | Field name or path for the full-resolution download URL | urls.full, src.original |
per_page_param | Query parameter name for page size | per_page, limit |
per_page | Number of items per page (default: 30) | 30 |
Security
Your Personal Access Token is stored in an AES-256 encrypted vault file on the broker server. It is:
- Never stored in the database — only in the encrypted vault file
- Never sent to the client — API calls are made server-side through the broker
- Never logged — tokens are redacted in all activity logs
Plan availability
| Plan | Custom sources |
|---|---|
| Solo | — |
| Agency | Up to 5 |
| Max | Unlimited |
MCP tools
Two MCP tools are available for custom sources:
list_custom_sources— List all custom API sources and their connection statusbrowse_custom_source— Browse assets from a custom API source by source ID, with pagination
Example: "What custom sources do I have connected?" → calls list_custom_sources. Then "Show me my latest Unsplash photos" → calls browse_custom_source with the Unsplash source ID.
Destinations Overview
Syncific pushes optimized assets to 5 CMS platforms. Each destination stores credentials encrypted with AES-256. Images are compressed in your browser before upload — zero server-side processing cost.
WordPress
Destination
Upload to any self-hosted WordPress site using Application Passwords (WP 5.6+).
Setup
- In your WordPress admin, go to Users → Profile → Application Passwords
- Enter "Syncific" as the name and click Add New
- Copy the generated password
- In Syncific, go to Destinations → Add → WordPress
- Enter your site URL, username, and application password
- Click Verify & Connect
Wordfence / Security Plugins
If you're using Wordfence or another security plugin that blocks Application Passwords or the REST API:
- In Wordfence, go to Firewall → All Firewall Options → Allowlisted URLs
- Add
/wp-json/wp/v2/mediato the allowlist - Alternatively, whitelist the Syncific worker IP range in your firewall rules
- If Application Passwords are disabled, go to Wordfence → Login Security → Settings and enable Allow Application Passwords
Shopify
Destination
Upload product images and files to your Shopify store via OAuth.
Setup
- In Syncific, go to Destinations → Add → Shopify
- Enter your Shopify store domain (e.g., my-store.myshopify.com)
- Click Connect — you'll be redirected to Shopify to authorize
HubSpot
Destination
Upload assets to your HubSpot CMS file manager.
Setup
- In Syncific, go to Destinations → Add → HubSpot
- Click Connect — authorize via HubSpot OAuth
Contentful
Destination
Upload assets to your Contentful space via OAuth.
Setup
- In Syncific, go to Destinations → Add → Contentful
- Click Connect — authorize via Contentful OAuth
- Syncific automatically detects your space and environment
Webflow
Destination
Upload assets to your Webflow site via OAuth.
Setup
- In Syncific, go to Destinations → Add → Webflow
- Click Connect — authorize via Webflow OAuth
Browse & Sync
The Browse page is where you view, select, and sync assets from any connected source to any destination.
Source Tabs
Switch between sources using the tabs at the top: All Sources, Lightroom & Photoshop, Figma, Canva, Dropbox, Google Drive, OneDrive, Shutterstock.
Selecting Assets
Click on assets to select them. Use Select All to select everything in the current view, or Select Updates to select only changed assets.
Syncing
Choose destination(s) from the sync bar at the bottom and click Sync. Syncific will:
- Resolve source download URLs
- Compress images in your browser (AVIF → WebP → JPEG, whichever is smallest)
- Push compressed images to all selected destinations in parallel
- Generate alt text if auto metadata is enabled
- Record the sync in the Sync Map
Auto Metadata
Syncific can automatically generate alt text, titles, captions, and keywords for your synced assets.
Modes
| Mode | How it works | Cost |
|---|---|---|
| Off | No auto metadata | Free |
| Basic | Derives alt text from filename (e.g., "hero-banner-2024.webp" → "hero banner 2024") | Free |
| AI | Uses OpenRouter vision AI (Gemini 2.5 Flash) to analyze the image and generate descriptive metadata | Uses OpenRouter credits |
Configure in Settings → Auto Metadata.
Autosync
Set up scheduled syncs that run automatically. Syncific checks your sources on a schedule you define and pushes changes to all destinations.
Setup
- Go to Autosync
- Enable autosync
- Choose your interval (5 min to daily)
- Select which sources to monitor
Groups & Governance
Groups bundle multiple destinations together so one sync pushes to all of them. Governance rules enforce standards per group.
Creating a Group
- Go to Groups → New Group
- Name it and select destinations to include
Governance Rules
- Max file size — reject files over a size limit
- Min dimensions — reject images below a minimum width/height
- Allowed formats — only accept specific image formats
- Allowed sources — restrict which sources can sync to this group
- Auto-compress — always compress before push
- Autosync enabled — toggle whether autosync runs for this group
- Approval required — queue syncs for manual approval before pushing
- Default folder — set a default destination folder for the group
Optimize
Convert JPG and PNG images to modern formats (AVIF/WebP) directly on your destination's media library — even images that weren't synced through Syncific.
How it Works
- Go to Optimize
- Select a destination
- Browse the destination's media library — images are shown with size, format, and optimization status
- Select individual images or use Select All
- Set quality and max dimension
- Click Optimize Selected
Compression happens in your browser. Optimized images replace the originals on the destination — attachment IDs are preserved (WordPress with LightSync Pro plugin), so no broken links. Modern formats (WebP, AVIF) are automatically excluded since they're already optimized.
Progress is shown in real-time with per-image diagnostics. Average savings: 60-75% file size reduction.
Intelligence
Agency+
GSC-powered hero scores, A/B testing, and AI variant generation.
Hero Scores
Each synced image gets a hero score (0-200) based on quality metrics multiplied by a GSC performance weight. Tiers:
- Hero (150+) — top performers driving real traffic
- Strong (100-149) — solid performers
- Average (50-99) — room for improvement
- Weak (0-49) — underperforming or no GSC data
A/B Testing
Auto-detected when you sync similar assets to the same destination. Results based on GSC impressions and clicks.
AI Generate
Generate images using AI models via OpenRouter. Currently supports Google Gemini image generation models (Gemini 2.5 Flash Image, Gemini 3 Pro Image, Gemini 3.1 Flash Image).
Requirements
Connect your OpenRouter API key in Settings → OpenRouter.
How it Works
- Enter a text prompt describing the image you want
- Choose a model and aspect ratio
- Click Generate — the image appears in the preview panel
- Add alt text, select a destination, and click Compress & Sync
- The generated image is compressed to AVIF/WebP in your browser and pushed to the destination
Suggestions
Syncific scans your synced assets and proposes optimization actions: missing alt text, stale assets, format improvements, and more.
Review suggestions in the Suggestions page. Approve or dismiss each one individually.
Claude MCP Connector
Agency+
Syncific is the first creative asset platform with a native Claude AI (MCP) integration. Manage your entire sync workflow through conversation.
Setup
- Go to Settings → Claude.ai MCP Connector
- Copy the MCP URL
- In Claude.ai, go to Settings → Integrations → Add Integration
- Paste the URL
What You Can Do
- Browse and search your source assets
- Sync assets to destinations (with update-in-place — no duplicates)
- Trigger autosync on demand
- Detect and re-sync changed source files
- Sync specific pages of multi-page Canva designs
- Check sync status and activity per destination
- Generate AI images and metadata
- View hero scores and intelligence data
MCP Automation Recipes
Agency+
Ready-to-use prompts for Claude.ai. Copy these into Claude after connecting your MCP integration.
Daily Workflows
Morning sync check
"Check my Syncific activity from the last 24 hours. Show me what synced successfully, anything that failed, and how many assets are now live across my destinations."
New asset push
"Browse my Lightroom portfolio album and show me any assets that aren't in my sync map yet. List them with thumbnails so I can decide which ones to sync."
Quick single asset sync
"Sync the most recent asset from my Lightroom portfolio album to WordPress and Shopify. Generate alt text and set it as featured."
Campaign & Launch Workflows
Campaign launch
"Sync everything in my Figma '[Campaign Name]' file to all destinations. Generate AI alt text for each asset and confirm when complete."
Product launch — Shopify focus
"Browse my [source] and find assets tagged '[product name]'. Sync them all to Shopify only. Add the tag 'launch-2025' to each one."
Multi-source consolidation
"Pull all assets from my Lightroom '[Campaign]' album and my Figma '[Campaign]' file. Sync everything to WordPress and HubSpot. Show me a summary of what was pushed."
Canva Multi-Page Workflows
Sync specific pages of a design
"Show me the pages of my Canva design '[design name]'. I only want to sync pages 1, 3, and 5 to Shopify."
Full multi-page sync
"List all the pages in my Canva '[campaign name]' design and sync each page to WordPress as a separate asset."
Preview pages before syncing
"Get the page thumbnails from my Canva design [design id]. Show me all of them so I can pick which ones to push."
Autosync & Update Workflows
Run autosync now
"Trigger autosync right now — I just updated a bunch of source files and want the destinations refreshed immediately without waiting for the schedule."
Detect changed assets
"Check my source platforms and find any assets that have changed since the last sync. Show me the list before pushing anything."
Update in place without duplicates
"The Dropbox version of [filename] has been updated. Push the new version to all destinations it was originally synced to — I don't want duplicates, just replace the existing files."
Per-destination sync audit
"Show me every asset synced to my Shopify store specifically. Which ones are up to date and which need re-syncing based on source changes?"
Quality & Intelligence Workflows
Hero score audit
"Show me all my synced assets with a hero score below 40. Group them by destination and tell me which ones are worth updating versus removing."
Top performer report
"List my top 10 performing assets across all destinations by hero score. Tell me which sources they came from and which destinations they're on."
Identify missing alt text
"Scan my sync map and find all assets missing alt text. How many are there per destination? Then generate AI alt text for all of them."
Metadata & Enrichment Workflows
Bulk alt text generation
"Find all assets on my WordPress destination that have basic alt text instead of AI alt text. Regenerate them all using AI."
Alt text review
"Show me the AI-generated alt text for my last 20 synced assets. Flag any that seem generic or inaccurate so I can review them."
Agency & Client Workflows
Client site audit
"Check all assets synced to [client site URL]. Show me hero scores, missing alt text, and anything that hasn't been updated in the last 90 days."
Client onboarding sync
"I've just connected a new WordPress site for [client name]. Sync their Lightroom album '[album]' to it and generate AI alt text for every asset. Confirm when done."
Multi-site status report
"Give me a sync status summary across all my connected WordPress destinations. How many assets are on each site, when was the last sync, and are there any failures?"
Troubleshooting Workflows
Sync failure investigation
"Check my activity log for any failed syncs in the last 7 days. What failed, which destinations were affected, and what were the error reasons?"
Destination health check
"Test my connection to all destinations and tell me which ones are responding correctly and which have issues."
Tips
- Be specific about albums and folders. The more specific you are (album name, folder path, file name) the faster Claude can act.
- Chain prompts for complex workflows. Start with "show me" before "sync" — confirm the asset list looks right, then tell Claude to proceed.
- Use "confirm before syncing" when in doubt. Add this to any prompt and Claude will show you what it plans to do before executing.
- Hero scores need GSC data. Connect Google Search Console in Settings to unlock hero scoring.
- AI alt text uses OpenRouter credits. Basic alt text (filename-derived) is always free.
Google Search Console
Agency+
Connect GSC to enable hero scoring and performance-based image intelligence.
Setup
- Go to Settings → Google Search Console → Connect
- Authorize with your Google account
- GSC data is used to score your synced images based on real search impressions and clicks
OpenRouter
OpenRouter powers AI image generation and AI metadata enrichment.
Setup
- Go to Settings → OpenRouter → Connect
- Authorize via OpenRouter OAuth (or enter an API key manually)
Used by: AI Generate, AI Metadata mode
Notifications
Receive real-time notifications when events happen in Syncific. Use notification hooks to trigger external workflows (Zapier, n8n, custom APIs).
Events
| Event | Fires when |
|---|---|
asset.synced | An asset is successfully pushed to a destination |
sync.completed | A batch sync operation completes |
autosync.ran | An autosync cycle completes |
destination.connected | A new destination is connected (including via site invite) |
enrichment.completed | AI metadata is generated for an asset |
action.approved | A proposed action is approved and executed |
action.rejected | A proposed action is rejected |
upload_link.created | A client upload link is created |
upload_link.uploaded | A client uploads file(s) via an upload link — includes filename, alt text, destinations |
upload_link.expired | An upload link expires, hits its file limit, or is revoked |
Setup
- Go to Notifications → Create Notification
- Enter the endpoint URL
- Select events to listen for
All notification hooks are signed with HMAC-SHA256 for verification.
Custom Destinations
Push assets to any platform that has an HTTP endpoint. If your CMS, DAM, or internal tool isn't one of the five native destinations, custom destinations let Syncific deliver optimized, tagged images anywhere. Available on Agency and Max plans.
How it works
- Go to Destinations → Add Destination → Custom Destination
- Enter a name (e.g. "Strapi Production") and your endpoint URL
- Syncific generates an HMAC signing secret — copy and save it
- Your endpoint receives assets as multipart POST requests
What Syncific sends
Every push is a application/json POST containing the file as a base64 string alongside all metadata. No multipart parsing required.
Payload fields
| Field | Type | Description |
|---|---|---|
filename | string | Original filename (e.g. hero-banner.webp) |
mime | string | MIME type (e.g. image/webp, image/avif) |
alt_text | string | AI-generated or filename-derived alt text |
source | string | Where the asset came from (lightroom, figma, canva, dropbox, etc.) |
size_bytes | number | File size in bytes |
sync_id | string | Unique ID for this sync event (UUID) |
destination_id | string | Syncific destination ID |
workspace_id | string | Syncific workspace ID |
file_base64 | string | Base64-encoded image bytes (decode to get the file) |
existing_asset_id | string | If set, this is an update — the ID your endpoint returned on the original upload |
timestamp | number | Unix timestamp of the request |
Headers
| Header | Description |
|---|---|
X-Syncific-Signature | HMAC-SHA256 hex digest of the full JSON body, signed with your secret |
X-Syncific-Timestamp | Unix timestamp of the request |
Content-Type | application/json |
Expected response
Your endpoint must return JSON with the asset ID and URL so Syncific can track it in the sync map:
{
"asset_id": "abc-123",
"asset_url": "https://cdn.example.com/images/abc-123.avif"
}
Return any 2xx status for success. Non-2xx responses are treated as failures and logged in the activity feed.
Signature verification
Always verify the X-Syncific-Signature header to ensure the request came from Syncific. The signature is an HMAC-SHA256 hex digest of the full JSON body, signed with your signing secret.
Node.js / Express
import crypto from 'crypto'
import express from 'express'
const app = express()
app.use(express.json({ limit: '10mb' }))
const SECRET = process.env.SYNCIFIC_SECRET
app.post('/syncific/upload', (req, res) => {
// Verify signature
const body = JSON.stringify(req.body)
const expected = crypto.createHmac('sha256', SECRET)
.update(body).digest('hex')
if (req.headers['x-syncific-signature'] !== expected) {
return res.status(401).json({ error: 'Invalid signature' })
}
// Decode the file from base64
const fileBuffer = Buffer.from(req.body.file_base64, 'base64')
// Save the file however your platform needs
const assetId = saveToMyStorage(fileBuffer, req.body.filename)
const assetUrl = `https://cdn.example.com/${assetId}`
// If existing_asset_id is set, this is an update (re-sync)
if (req.body.existing_asset_id) {
replaceInMyStorage(req.body.existing_asset_id, fileBuffer)
}
res.json({ asset_id: assetId, asset_url: assetUrl })
})
Python / Flask
import hmac, hashlib, json, base64
from flask import Flask, request, jsonify
app = Flask(__name__)
SECRET = 'your_signing_secret'
@app.route('/syncific/upload', methods=['POST'])
def receive():
body = request.get_data(as_text=True)
signature = request.headers.get('X-Syncific-Signature', '')
expected = hmac.new(SECRET.encode(), body.encode(),
hashlib.sha256).hexdigest()
if not hmac.compare_digest(signature, expected):
return jsonify(error='Invalid signature'), 401
data = request.get_json()
file_bytes = base64.b64decode(data['file_base64'])
asset_id = save_to_storage(file_bytes, data['filename'])
asset_url = f'https://cdn.example.com/{asset_id}'
return jsonify(asset_id=asset_id, asset_url=asset_url)
PHP
<?php
$secret = getenv('SYNCIFIC_SECRET');
$body = file_get_contents('php://input');
$sig = $_SERVER['HTTP_X_SYNCIFIC_SIGNATURE'] ?? '';
$expected = hash_hmac('sha256', $body, $secret);
if (!hash_equals($expected, $sig)) {
http_response_code(401);
echo json_encode(['error' => 'Invalid signature']);
exit;
}
$data = json_decode($body, true);
$file = base64_decode($data['file_base64']);
$id = save_to_storage($file, $data['filename']);
$url = "https://cdn.example.com/{$id}";
echo json_encode(['asset_id' => $id, 'asset_url' => $url]);
Wix Velo
// backend/http-functions.js
import { ok, badRequest } from 'wix-http-functions'
import { mediaManager } from 'wix-media-backend'
export function post_syncific(request) {
return request.body.json().then(async data => {
const buffer = Buffer.from(data.file_base64, 'base64')
const result = await mediaManager.upload(
'/syncific', buffer, data.filename,
{ mediaOptions: { mimeType: data.mime } }
)
return ok({
body: JSON.stringify({
asset_id: result.fileUrl,
asset_url: result.fileUrl
})
})
}).catch(err => badRequest({ body: JSON.stringify({ error: err.message }) }))
}
Update vs. create
When Syncific re-syncs a changed source asset, the metadata JSON includes existing_asset_id — the ID your endpoint returned on the original upload. Use this to update the asset in place rather than creating a duplicate.
Metadata-only updates
When AI re-enrichment generates new metadata (alt text, title, caption, keywords) for an already-synced asset, Syncific fires a metadata-only POST to your endpoint without re-uploading the file. Detect these by checking the event field in the payload or the X-Syncific-Event header:
{
"event": "metadata.updated",
"existing_asset_id": "abc-123",
"alt_text": "Updated AI-generated description",
"title": "New title",
"caption": "...",
"keywords": ["tag1", "tag2"],
"sync_id": "uuid",
"destination_id": "5",
"workspace_id": "1",
"timestamp": 1776299939
}
No file_base64 is sent on metadata updates — your endpoint should look up the asset by existing_asset_id and update the metadata fields without touching the file.
In-Place Updates by Platform
When Syncific re-syncs a changed source asset, what happens depends on the receiving platform's capabilities. Some platforms support true in-place updates (same URL, new bytes — references on your site never break). Others assign new URLs on every upload, requiring find-and-replace or duplicate management.
example.com/hero.jpg just shows the new version. If it doesn't, you'll get a new URL and any existing references break.| Platform | In-Place? | How / Notes |
|---|---|---|
| WordPress | Yes | Native — LSP plugin uses update_attached_file(). Same attachment ID, same URL. |
| Shopify | Yes | Native — Files API supports byte updates by ID. |
| HubSpot | Yes | Native — Files v3 API supports replace. |
| Contentful | Yes | Native — Asset version updates with optimistic locking. |
| Webflow | No (auto-fixed) | Webflow assets are immutable. Syncific uploads new + walks pages/components/CMS to swap references automatically. |
| Cloudinary (custom) | Yes | Use the preset which sets public_id: "{{filename}}" + overwrite: true. Same filename = same Cloudinary URL forever. |
| AWS S3 (custom) | Yes | PUT to a deterministic key (e.g. /images/{{filename}}) overwrites the object at the same URL. |
| Cloudflare R2 (custom) | Yes | Same as S3 — PUT to same key = overwrite. |
| DigitalOcean Spaces (custom) | Yes | S3-compatible. PUT to same key = overwrite. |
| Bunny Storage (custom) | Yes | PUT to /{{filename}} = overwrite. CDN cache may take a moment to invalidate. |
| Vercel Blob (custom) | Partial | PUT to same path overwrites by default, but Vercel may add a random suffix unless addRandomSuffix: false is configured. Use deterministic paths. |
| Supabase Storage (custom) | Yes | Use x-upsert: true header (already in preset). PUT to same path overwrites. |
| Firebase Storage (custom) | Yes | POST with same name param overwrites the object. |
| Sanity (custom) | Partial | Sanity creates a new asset on every upload, but you can reference assets by document/field. Use Sanity's deduplication or write a transaction to replace asset references. |
| Strapi (custom) | No | Strapi uploads create new media. Use the fileInfo field to set a deterministic name; manual cleanup of old uploads required for true in-place behavior. |
| Ghost (custom) | No | Ghost's media upload always creates a new file with a hash-prefixed URL. References to old URLs break unless your post content uses Ghost's auto-resize URLs. |
| Bynder (custom) | Yes | Bynder supports asset versioning by ID. Use existing_asset_id to upload as a new version of the same asset. |
| Uploadcare (custom) | No | Each upload creates a new UUID. Reference files by your own ID stored in the response, then update those references. |
| DatoCMS (custom) | Partial | DatoCMS uploads create new asset records. To update in place, use the upload's id and PATCH with new file ref. |
| Wix (custom) | No | Wix Media Manager doesn't expose a "replace" API. Each upload creates a new file with a new URL. Pages reference specific file URLs, so old references break. Workaround: route Wix images through Cloudinary and use Cloudinary URLs in Wix. |
| Squarespace | No | No public media replace API. Same workaround as Wix — use external CDN URLs. |
| BigCommerce (custom) | Partial | Product image API supports update by ID. Standalone media library doesn't have replace API. |
| Generic Custom Endpoint | Depends | Your code controls this. Read existing_asset_id from the payload and update by that ID in your storage. Return the same asset_id to maintain the chain. |
Best Practice for Custom Webhook Endpoints
If you control the receiving endpoint, follow these patterns to ensure clean updates:
- Use
existing_asset_idas the lookup key. When set, treat the request as an update, not a new upload. - Return a stable, deterministic
asset_id. Syncific stores this and sends it back on future updates. - Use deterministic URLs / filenames in your storage. If your storage uses content-hashed URLs, the URL changes every update — consider mapping a stable slug to the latest version.
- Handle
metadata.updatedevents to apply alt text / title changes without re-uploading the file. - Don't trust the filename for uniqueness. Two different source assets can have the same filename; use the
sync_id+existing_asset_idpair for tracking.
Platform Presets (One-Click Setup)
The webhook setup includes presets for 14 popular platforms. Click a preset to auto-fill the URL, format, headers, and template — then swap in your platform-specific values.
| Preset | What to swap in | Auth method |
|---|---|---|
| Cloudinary | YOUR_CLOUD, YOUR_PRESET (unsigned preset name) | Unsigned preset (no header) |
| Uploadcare | YOUR_PUB_KEY | Public key in form field |
| Supabase Storage | YOUR_PROJECT, YOUR_BUCKET, YOUR_SERVICE_KEY | Bearer token header |
| Vercel Blob | YOUR_RW_TOKEN | Bearer token header |
| Firebase Storage | YOUR_BUCKET, YOUR_TOKEN | Bearer token header |
| AWS S3 Presigned | Your presigned PUT URL | URL-embedded signature |
| Bunny Storage | YOUR_ZONE, YOUR_STORAGE_KEY | AccessKey header |
| Sanity | YOUR_PROJECT, YOUR_DATASET, YOUR_TOKEN | Bearer token header |
| Strapi | Your Strapi URL, YOUR_TOKEN | Bearer token header |
| Ghost | Your Ghost URL, YOUR_ADMIN_API_KEY | Ghost admin API key |
| Bynder | YOUR_DOMAIN, YOUR_TOKEN | Bearer token header |
| DatoCMS | YOUR_API_TOKEN | Bearer token header |
| DigitalOcean Spaces | Your presigned PUT URL | URL-embedded signature |
| Cloudflare R2 | Your presigned PUT URL | URL-embedded signature |
| Custom | Any URL — configure format/headers manually | Your choice |
Choosing the Right Format
Webhook destinations support three body formats. Pick based on what your platform's upload API expects.
| Format | When to use | Body |
|---|---|---|
| JSON (default) | Custom endpoints, headless CMS APIs, serverless functions | JSON with file_base64 or file_data_uri |
| Form Data | Cloudinary, Uploadcare, Strapi, Ghost, Bynder — anything that expects multipart/form-data upload | Multipart form with file attached as file |
| Raw File | S3 presigned URLs, Vercel Blob, Bunny Storage, Cloudflare R2, Supabase Storage — anything that takes the raw bytes as the body | Image bytes only, Content-Type set to the image MIME |
HTTP Method
Default is POST. Use PUT for presigned URL uploads (S3, DO Spaces, R2), Vercel Blob, and Bunny Storage.
Custom Headers
For platforms that require authentication via HTTP headers (most modern APIs), add them as JSON. Template variables work inside header values too.
{
"Authorization": "Bearer YOUR_TOKEN",
"Content-Type": "{{mime}}"
}
URL Path Templating
If the target platform expects the filename in the URL path (like Bunny, Vercel Blob, Supabase), include {{filename}} in the webhook URL:
https://storage.bunnycdn.com/YOUR_ZONE/{{filename}}
Syncific URL-encodes the filename automatically.
Template Variables Reference
All available variables for payload templates, URLs, and header values:
| Variable | Example | Description |
|---|---|---|
{{filename}} | hero-banner.webp | Image filename |
{{mime}} | image/webp | Full MIME type |
{{format}} | webp | File extension (no dot) |
{{file_base64}} | UklGRh... | Base64-encoded image bytes |
{{file_data_uri}} | data:image/webp;base64,UklGRh... | Full data URI |
{{alt_text}} | golden retriever on beach | AI or filename-derived alt text |
{{source}} | lightroom | Where the asset came from |
{{source_asset_id}} | lr-abc123 | Stable source identifier — use as a deterministic key for in-place updates |
{{action}} | create or update | Whether this is a new asset or an update to a previously synced one |
{{is_update}} | true or false | Boolean flag — simpler alternative to action |
{{existing_asset_id}} | abc-123 | The destination platform's ID from the previous sync (empty on first sync) |
{{existing_url}} | https://cdn.example.com/img.webp | The previous destination URL — use to overwrite the same resource |
{{size_bytes}} | 25093 | File size in bytes |
{{sync_id}} | c0a617cf-5165-4ee3-8c2b | Unique per-sync UUID |
{{folder}} | products | Governance default folder (if set) |
{{folder_path}} | products/hero-banner.webp | Folder + filename — use as the object key for storage platforms |
{{destination_id}} | 19 | Syncific destination ID |
{{workspace_id}} | 1 | Syncific workspace ID |
{{timestamp}} | 1776299939 | Unix timestamp |
In-Place Updates
When an asset is re-synced after a source change, Syncific sends {{action}}: "update" along with {{existing_asset_id}} and {{existing_url}} from the previous sync. Use these to overwrite the existing resource instead of creating a duplicate:
- Object storage (S3, R2, Bunny, Supabase, Firebase, Vercel Blob, DO Spaces) — PUT to the same
{{folder_path}}. Presets do this by default. - Cloudinary — set
public_id: "{{source_asset_id}}"withoverwrite: true. Same public ID = same URL forever. - Custom endpoints — check
{{is_update}}in your receiver logic and use{{existing_asset_id}}to update the right record.
If the asset hasn't changed since the last sync (checksum matches), Syncific skips the push entirely — no duplicate, no wasted bandwidth.
Editing Existing Destinations
Click the Edit button on any destination card to update its name, URL, payload template, headers, HTTP method, or site domain. Changes take effect immediately for the next sync.
Decision Tree — Which Setup Do I Use?
- Is your platform in the preset list? → Click the preset. Swap in your values. Done. Presets are pre-configured for in-place updates where supported.
- Is it a custom endpoint you control? → Use the default JSON format. Check
{{action}}to decide create vs update. - Does the platform have an upload API that expects multipart? → Use Form Data. Set template to the form fields it wants (e.g.
upload_preset,public_id). - Did the platform give you a presigned URL? → Use Raw File body with PUT method. Include
{{folder_path}}in the URL for deterministic paths. - Platform needs a bearer token? → Add it to Custom Headers:
{"Authorization": "Bearer YOUR_TOKEN"}
Troubleshooting
| Error | Common cause | Fix |
|---|---|---|
HTTP 400 | Wrong body format or missing required field | Check the platform's API docs for the exact payload it expects |
HTTP 401 | Missing or invalid auth token | Add/fix the Authorization header in Custom Headers |
HTTP 403 | Token doesn't have upload permissions | Generate a new token with write access to media/storage |
HTTP 404 | Endpoint URL wrong or not deployed | Verify the URL in a browser. Make sure your function/endpoint is published. |
HTTP 413 | File too large for the endpoint's limit | Lower governance max_dimension to produce smaller files |
| Test passes, sync fails | Test sends a 1x1 pixel; real files may hit different limits | Check the activity log for the real error message from the destination |
Compatible Platforms
Beyond the presets, any platform with an HTTP upload API can receive Syncific pushes:
- Headless CMS — Strapi, Sanity, Prismic, DatoCMS, Ghost, Keystone, Contentstack, Storyblok
- DAM / Media — Bynder, Cloudinary, Uploadcare, imgix
- Storage — AWS S3, DigitalOcean Spaces, Backblaze B2, Cloudflare R2, Bunny.net, Firebase Storage, Supabase Storage, Vercel Blob
- E-commerce — BigCommerce, WooCommerce (headless)
- AI Agents — Image moderation, auto-tagging, or content generation endpoints
- Social Media (via Buffer, Zapier, or custom middleware) — Instagram, Facebook, LinkedIn, Pinterest, X
- Automation — Zapier, Make.com, n8n catch-hooks
- Custom — Any internal tool, serverless function, or Rails/Django/Express app
Settings
Manage your account, integrations, and preferences.
- Plan & Billing — view current plan, upgrade, manage billing via Stripe
- Account Name — set your account display name
- MCP Connector — Claude AI integration URL
- OpenRouter — connect for AI features
- Google Search Console — connect for intelligence
- Auto Metadata — choose Off / Basic / AI mode
- Theme — toggle dark/light mode
Billing
Manage your subscription, upgrade/downgrade plans, and access invoices.
Manage Billing
Click Manage Billing in Settings to open the Stripe customer portal. From there you can update payment method, view invoices, or cancel.
Free Trial
All plans include a 14-day free trial with full feature access. Your card is collected at signup but not charged until the trial ends. Cancel anytime from Settings.
Concurrent Sessions
Each plan limits how many devices can be signed in at the same time:
- Solo — 1 session. Signing in on a new device logs you out of the previous one.
- Agency — 3 concurrent sessions. Up to 3 team members can use Syncific simultaneously.
- Max — Unlimited sessions.
Sessions expire automatically after 60 minutes of inactivity. The most recent sign-in always takes priority — if you exceed your limit, the oldest session is signed out with a notification explaining why.
Team
Agency+
Invite team members to collaborate on your Syncific account.
Roles
| Role | Permissions |
|---|---|
| Owner | Full access — billing, settings, team management |
| Editor | Browse, sync, manage destinations and sources |
| Viewer | View-only access to browse and sync map |
Inviting Members
- Go to Team → Send Invite
- Enter their email and choose a role
- They'll receive an email with an invite link
Team Member Login
Team members log in via email — no license key needed. On the login page, click "Team member? Log in with email" and enter the email used for the invite.
Client Workspaces
Agency+
A workspace is an isolated environment for a single client. Each workspace has its own destinations, sync history, activity log, optimize history, webhooks, and governance rules. Switching workspaces is like switching between entirely separate accounts — except you only pay for one Syncific subscription, only sign in once, and manage everything from one dashboard.
When to use workspaces
| You are… | Recommended setup |
|---|---|
| A solo creative | 1 workspace (the default). You don't need to think about workspaces at all — Solo plan. |
| An agency with 3–10 ongoing clients | One workspace per client. Start on Agency ($149/mo, up to 10 workspaces). |
| An agency with 10+ clients or multiple brand portfolios | One workspace per client or brand, unlimited. Max ($399/mo). |
| An in-house team managing multiple brands | One workspace per brand. Agency if ≤10 brands, Max if more. |
What's isolated per workspace
- Destinations — each workspace connects its own WordPress, Shopify, HubSpot, Contentful, and Webflow sites. Client A's WordPress doesn't appear in Client B's destinations list.
- Sync history — the sync map (which assets went where) is workspace-scoped.
- Activity log — every sync event, error, and autosync run stays in the workspace where it happened.
- Optimize history + rollbacks — per-workspace optimize runs and rollback snapshots.
- Autosync rules + schedules — each workspace has its own autosync config. Client A can autosync every 15 minutes while Client B runs daily.
- Notifications + deliveries — your Zapier/n8n notifications for Client A never fire on Client B events.
- Governance rules — max file size, min dimensions, allowed formats, allowed sources, approval workflows — all per workspace.
- Google Search Console connection — each workspace connects its own client's GSC property.
- Destination invites — the magic-link invites you send to client webmasters are scoped to the workspace that created them.
What's shared across workspaces
- Your Syncific account and billing — one subscription covers all your workspaces.
- Team members — your agency team is defined at the account level (you don't re-invite people per workspace).
- Sources — your Lightroom, Dropbox, Figma, Canva, etc. connections are currently shared across all workspaces. Per-workspace source connections are on the roadmap for agencies where each client has their own source accounts.
- Your license key and login — one license, one login, many workspaces.
Creating a workspace
- Click the workspace switcher in the top command bar of the app (shows the current workspace name with a dropdown arrow).
- Click + New workspace.
- Enter a name (e.g., Acme Corp, Blue Ridge Bakery).
- Optionally pick an accent color for visual distinction.
- Click Create workspace. The app reloads with the new workspace selected and empty — ready for you to connect destinations, configure autosync, and start syncing.
You can also create and manage workspaces from the Workspaces page in the Account section of the sidebar.
Switching workspaces
Click the workspace name in the top command bar → pick a different workspace from the dropdown. The app performs a full reload so there's zero chance of cached data from one workspace leaking into another. Your workspace selection is saved in your browser, so next time you log in you land in the same workspace you left.
Agency Rollup
Agency and Max plans get an All Workspaces dashboard tab showing totals across every workspace: total assets synced, destinations, bytes saved, last activity per client. Great for monthly client reporting and for spotting workspaces that are going cold.
Renaming and archiving
From the Workspaces page in your account settings:
- Rename — click Rename on any workspace. The slug stays the same, just the display name changes.
- Archive — soft-deletes a workspace. Its data stays in the database (so you can recover it if needed) but it disappears from the switcher and the rollup view. You cannot archive your default workspace.
- Switching out — before archiving a workspace you're currently in, switch to a different workspace first.
Client portal — coming later
A future release will let agency owners invite end clients into a read-only view of their own workspace — they see only their assets, destinations, and reports, with no access to your agency dashboard or other clients. If this is important for your workflow, let us know — it shapes our roadmap priority.
Moving things between workspaces
Not currently supported. If you connect a destination to the wrong workspace, the cleanest fix is to archive it and reconnect under the correct workspace. We're tracking this as a feature request — watch for a "move to workspace" action in a future release.
Common scenarios
One agency, agency-owned creative assets, many client sites.
You shoot product photos for 10 clients under your own Adobe Creative Cloud account. Each client has their own WordPress site.
→ One workspace per client. Your Lightroom library is shared across all workspaces (same source credentials), but each client's workspace has only their WordPress destination connected. Sync Client A's album to Client A's workspace → only Client A's site updates.
Agency managing client-owned assets (each client has their own Dropbox).
Each client gave you OAuth access to their Dropbox.
→ Currently not fully supported — source credentials are account-level, so you'd need to reconnect Dropbox each time you switch. Per-workspace source connections are on the roadmap. Workaround: use one Dropbox folder per client under your own Dropbox and ask clients to share folders into yours.
In-house team with multiple brand portfolios.
You run marketing for a parent company that owns 4 distinct consumer brands. Each brand has its own Shopify store and its own Figma team.
→ One workspace per brand. Your team members are shared at the agency level, but each person picks which brand they're working on from the workspace switcher.
Freelance creative with one site.
→ Solo plan. You'll never see the workspace switcher. The app behaves as if workspaces don't exist.
Site Invites
Invite website owners to connect their CMS to your Syncific account. Useful for agencies managing client sites.
How it Works
- Go to Site Invites → Send Invite
- Choose the platform (WordPress, Shopify, etc.)
- Enter the site URL and recipient's email
- They receive an email with a connect link
- They enter their CMS credentials directly — you never see them
Direct Upload
Upload images from your desktop directly to any destination — no source connection needed. Images are compressed in your browser and pushed directly. Nothing is stored on Syncific servers.
How it Works
- Go to Upload in the sidebar (or drag files onto any Browse page)
- Drop images or folders — Syncific reads all images recursively
- Select destination(s) from the bottom bar
- Click Sync — an optional alt text modal appears for each image
- Images compress (AVIF/WebP) in your browser and push to all selected destinations
Update in Place
Re-uploading a file with the same filename replaces the existing image at every destination. Same URL, same attachment ID — no duplicates. The sync map tracks each upload for dedup and change detection.
upload_local tool.Client Upload
Create shareable upload links so your clients can push images directly to your destinations — without a Syncific account.
Creating a Link
- Go to Client Upload → Create Link
- Add a label (e.g. "Product Photos for Client A")
- Select which destination(s) receive the uploads
- Set max file count and expiration (1–90 days)
- Optionally set a password and/or require alt text
- Share the generated URL with your client
Security
- Write-only — clients can upload but cannot see, browse, or delete anything
- Password protection — optional SHA-256 hashed password gate
- Rate limited — 5 uploads per minute per link
- File cap — link stops accepting uploads after the max file count
- Expiration — link auto-expires after the set duration
- Revocable — kill any link instantly from the dashboard
- Auto-cleanup — expired/revoked links are deleted after 30 days
Tracking
Every client upload appears in your activity log and sync map as source: upload-link. Update-in-place works the same as direct upload — same filename through the same link replaces the existing file.
Security
Syncific uses a patent-pending broker architecture designed for zero credential exposure.
How Credentials Are Protected
- OAuth tokens — encrypted with AES-256, stored server-side in the broker
- Destination credentials — encrypted in Cloudflare D1, never exposed to frontend
- Your CMS never stores third-party source credentials
- Your sources never see your CMS credentials
- Webhooks — signed with HMAC-SHA256
- JWT tokens — short-lived, revocable, with role-based scoping
Programmatic Access
Syncific provides programmatic access through its Claude MCP integration — not a traditional REST API. This means you interact with Syncific through natural language in Claude.ai, and Claude handles the underlying operations for you.
Getting Started
Connect Syncific to Claude.ai in under a minute:
- Go to Settings → Claude.ai MCP Connector in your Syncific dashboard
- Copy the MCP URL
- In Claude.ai, go to Settings → Integrations → Add Integration
- Paste the URL and authorize
Once connected, Claude can browse your sources, sync assets, generate metadata, manage destinations, and more — all through conversation. See Claude MCP Connector and MCP Recipes for the full list of capabilities and ready-to-use prompts.
Available MCP Tools
Syncific's MCP server exposes 28 tools that Claude can call through natural language. You never need to type tool names — just describe what you want and Claude selects the right tool.
| Tool | Description | Example Prompt |
|---|---|---|
| Platform Status | Account health, connected sources, destinations, subscription status | "What's my Syncific status?" |
| Push Asset | Publish an asset to a destination or group with automatic format optimization | "Publish these photos to WordPress and Webflow" |
| Sync Map | See which assets are published where, when they were synced, and if the source changed | "Which photos are already on the Shopify site?" |
| AI Metadata | Generate alt text, titles, captions, and keywords using AI | "Generate alt text for everything I just published" |
| Get Enrichment | View AI-generated metadata for an asset across all destinations | "What alt text was generated for DSC_1234?" |
| Update Metadata | Manually edit and push alt text and titles to the destination | "Change the hero alt text to: Denver skyline at sunset" |
| Score Assets | Get SEO and quality scores — find low-scoring assets that need attention | "Which assets have the lowest SEO scores?" |
| Scan Site | Start an Intelligence Optimizer audit — crawl, score every image, generate fix recommendations | "Scan my WordPress site for image SEO issues" |
| Audit Status | Check scan progress and results — pages, images, issues, overall score | "How is the site audit going?" |
| List Issues | View issues by tier: Tier 1 (act now), Tier 2 (worth fixing), Tier 3 (watch list) | "Show me all Tier 1 issues from the latest audit" |
| Fix Issue | Apply a single fix — update alt text, compress image, convert format | "Fix issue #42 with custom alt text" |
| Fix All Alt Text | Bulk-apply AI-generated alt text across an entire site (WordPress, Elementor, Shopify, etc.) | "Fix all missing alt text on my WordPress site" |
| Optimizer Settings | Configure monthly auto-audit and auto-approve for Tier 1 recommendations | "Enable auto-audit and auto-approve Tier 1 fixes" |
| Propose Actions | List AI-recommended actions awaiting approval — with rationale and confidence | "Show me pending optimization suggestions" |
| Approve / Reject | Execute or dismiss a proposed action immediately | "Approve the high-confidence suggestions" |
| Changed Assets | Detect source assets that changed since last sync | "What Lightroom photos changed since last sync?" |
| Auto-Sync | Trigger sync immediately or configure scheduling | "Run autosync now" |
| Activity Log | Recent sync activity — what was pushed, where, when | "What synced in the last 24 hours?" |
| Weekly Stats | Weekly summary: assets synced, optimized, bytes saved | "Give me this week's sync stats" |
| Canva Pages | Get per-page metadata for multi-page Canva designs | "Show me the pages in my Brand Guidelines design" |
| Upload Local | Push an image from the conversation directly to destinations — no source connection needed | "Push this screenshot to my WordPress site" |
| Settings | Account configuration, enrichment mode, preferences | "Update my OpenRouter API key" |
All tools are workspace-aware. If you have multiple workspaces, tell Claude which one to use and it will scope all operations accordingly.