schema

📊 buffer-analytics

Buffer Analytics SQLite Schema Reference #

The Buffer Analytics database is created and maintained automatically by scripts/buffer_analytics.py. Database tables, indexes, and analytical views are provisioned during sync operations.


1. Relational Tables #

channels #

Stores connected social media channel profiles and account configuration.

Column Type Constraints Description
id TEXT PRIMARY KEY Unique Buffer channel ID (e.g. 1234567890abcdef12345678)
organization_id TEXT Buffer organization ID
name TEXT Channel handle / username
service TEXT Social network (linkedin, twitter, bluesky, instagram, facebook)
display_name TEXT Formatted account display name
timezone TEXT Account timezone string (e.g. UTC, America/New_York)
is_disconnected INTEGER DEFAULT 0 1 if account is disconnected
is_locked INTEGER DEFAULT 0 1 if account is locked by plan limits
is_queue_paused INTEGER DEFAULT 0 1 if publishing queue is paused
avatar_url TEXT URL of profile picture
external_link TEXT URL of the social media profile
raw_json TEXT NOT NULL Complete raw JSON payload from Buffer API
created_at TEXT ISO-8601 creation timestamp
updated_at TEXT ISO-8601 modification timestamp
synced_at TEXT NOT NULL Timestamp of local database sync

posts #

Stores individual social media posts, scheduling lifecycle status, and text content.

Column Type Constraints Description
id TEXT PRIMARY KEY Unique Buffer post ID
organization_id TEXT Buffer organization ID
channel_id TEXT NOT NULL, FK -> channels(id) Associated social channel ID
channel_service TEXT Service name (linkedin, twitter, bluesky)
status TEXT NOT NULL Post status (sent, scheduled, draft, error)
text TEXT Full text copy of the post
external_link TEXT URL of the live published post on the network
sent_at TEXT ISO-8601 publication timestamp
due_at TEXT Scheduled publication timestamp
created_at TEXT Creation timestamp
updated_at TEXT Modification timestamp
scheduling_type TEXT Scheduling method (queue, custom_time, share_now)
is_ai_generated INTEGER DEFAULT 0 1 if marked AI generated in Buffer
thread_count INTEGER DEFAULT 0 Number of posts in thread
first_comment TEXT Scheduled first comment text
char_count INTEGER Total character count of post body
word_count INTEGER Total word count of post body
has_link INTEGER DEFAULT 0 1 if post contains URLs or external links
has_media INTEGER DEFAULT 0 1 if post contains image or video attachments
raw_json TEXT NOT NULL Complete raw JSON payload from Buffer API
synced_at TEXT NOT NULL Timestamp of local database sync

post_metrics #

Stores normalized engagement metrics recorded per post.

Column Type Constraints Description
id INTEGER PRIMARY KEY AUTOINCREMENT Unique metric record ID
post_id TEXT NOT NULL, FK -> posts(id) Associated post ID
channel_id TEXT Associated channel ID
channel_service TEXT Service name (linkedin, twitter, bluesky)
metric_type TEXT NOT NULL Metric key (impressions, reach, reactions, comments, reposts, clicks, engagementRate)
name TEXT Human-readable metric name
value REAL NOT NULL, DEFAULT 0 Metric numeric value
unit TEXT Unit (count, percentage)
description TEXT Metric description
recorded_at TEXT Timestamp recorded by Buffer
synced_at TEXT NOT NULL Timestamp of local database sync

post_assets #

Stores media attachments (images, videos, thumbnails) linked to posts.

Column Type Constraints Description
id TEXT PRIMARY KEY Asset identifier or URL hash
post_id TEXT NOT NULL, FK -> posts(id) Associated post ID
type TEXT Media type (image, video, gif)
mime_type TEXT MIME format (e.g. image/png, video/mp4)
source TEXT Full-resolution asset URL
thumbnail TEXT Thumbnail asset URL
raw_json TEXT Complete asset JSON payload

post_tags #

Stores organizational tags and campaign labels assigned in Buffer.

Column Type Constraints Description
id TEXT PRIMARY KEY (post_id, id) Tag identifier
post_id TEXT PRIMARY KEY (post_id, id), FK -> posts(id) Associated post ID
name TEXT Tag name / label
color TEXT Hex color code

sync_history #

Audit log recording every backfill and incremental sync operation.

Column Type Constraints Description
id INTEGER PRIMARY KEY AUTOINCREMENT Unique sync run ID
organization_id TEXT Buffer organization ID
channel_id TEXT Specific channel ID if scoped
sync_mode TEXT NOT NULL Sync type (incremental, full)
start_date TEXT Starting date of sync window
end_date TEXT Ending date of sync window
posts_fetched INTEGER DEFAULT 0 Count of records fetched from API
posts_inserted INTEGER DEFAULT 0 Count of newly inserted posts
posts_updated INTEGER DEFAULT 0 Count of existing posts refreshed
started_at TEXT NOT NULL Start timestamp
finished_at TEXT Completion timestamp
status TEXT NOT NULL Status (success, failed, running)
error_message TEXT Error details if failed

2. Analytical SQL Views #

v_posts_summary #

Primary analytical view flattening posts with pivoted metrics, engagement rate calculations, and temporal calendar dimensions.

Column Type Description
post_id TEXT Unique post ID
service TEXT Social network (linkedin, twitter, bluesky)
channel_name TEXT Channel username / handle
status TEXT Post status (sent, scheduled, draft)
sent_at TEXT Full ISO timestamp of publication
sent_date TEXT Date string (YYYY-MM-DD)
year_month TEXT Year and month string (YYYY-MM)
day_of_week TEXT Full day name (Monday, Tuesday, Wednesday, etc.)
hour_of_day INTEGER UTC hour of publication (0 to 23)
char_count INTEGER Body text character count
word_count INTEGER Body text word count
has_link INTEGER 1 if external links are present in text
has_media INTEGER 1 if image or video attachments are present
thread_count INTEGER Number of posts in thread
external_link TEXT Live social network URL
text TEXT Full text copy of post
impressions REAL Total post views / impressions
reach REAL Unique viewers reached
reactions REAL Total likes and reactions
comments REAL Total comments received
reposts REAL Total retweets / reshares
clicks REAL Total link clicks
engagement_rate REAL Overall engagement percentage