سأكون صريحاً: عندما طلب مني عميل لأول مرة استخدام Airtable كـ CMS في 2023، اعتقدت أنه يمزح. تطبيق جدول بيانات يغذي موقع ويب في الإنتاج؟ لكن بعد بناء ستة مواقع بهذه الطريقة — بعضها مع Astro وبعضها مع Next.js — تغير رأيي. يحقق Airtable توازناً حلواً لمشاريع معينة تفتقدها منصات CMS headless التقليدية تماماً. فريق التسويق لديك يعرف بالفعل كيفية استخدامه. إنه مرن بما يكفي لنمذجة معظم المحتوى. والـ API بسيط جداً.

لكن ليس بدون أخطار. حدود المعدل، التعامل مع المرفقات، غموض البيانات العلائقية — هناك الكثير مما لم تخبرك به منشورات المدونة حول "Airtable كـ CMS" من 2023. يغطي هذا الدليل كل شيء تعلمته من شحن مشاريع حقيقية مع هذه المجموعة في 2026.

جدول المحتويات

استخدام Airtable كـ CMS مع Astro و Next.js في 2026

لماذا Airtable كـ CMS يحقق معنى فعلياً

أكبر حجة لـ Airtable ليست تقنية — إنها بشرية. محررو المحتوى لديك يعرفون بالفعل كيفية استخدامه. لا توجد احتكاكات في التدريب، لا حساب جديد تنسى، لا واجهة نمذجة محتوى للتعلم. يفتحون واجهة تشبه جدول البيانات، يكتبون الأشياء، وتظهر على الموقع.

إليك ما يجعله جيداً حقاً لحالات الاستخدام معينة:

  • منحنى تعلم صفر للمحررين. إذا كان بإمكان شخص ما استخدام Google Sheets، فيمكنه استخدام Airtable.
  • مخطط مرن. إضافة حقل جديد تستغرق خمس ثوان. لا هجرات، لا نشر مخطط.
  • طرق وتصفيات مدمجة. يمكن للمحررين إنشاء طرق مصفاة وأنظمة Kanban والمعارض — كل ذلك دون مساعدة المطور.
  • البيانات العلائقية. على عكس جداول البيانات المسطحة، يدعم Airtable السجلات المرتبطة والبحث والتجميع.
  • الطبقة المجانية سخية بما يكفي. 1000 سجل لكل قاعدة و 1000 استدعاء API شهرياً في الخطة المجانية. تزيد خطة الفريق ($20/مقعد/شهر في 2026) إلى 50000 سجل وحدود API أعلى.

استخدمت Airtable كـ CMS لمواقع المحافظ وقوائم الأحداث ودلائل الفريق ومجموعات المنتجات ولوحات الوظائف والمدونات الصغيرة. إنه يعمل بشكل مفاجئ جيد لكل هذه.

متى يجب ألا تستخدم Airtable كـ CMS

دعني أنقذك من بعض الألم. لا تستخدم Airtable كـ CMS إذا:

  • لديك أكثر من ~10000 سجل محتوى. يصبح بطيئاً، وتصفية الـ API تصبح مشكلة حقيقية في الحجم.
  • تحتاج إلى نصوص غنية مع مكونات مضمنة. تدعم حقول النصوص الطويلة في Airtable Markdown الأساسي، لكن لا يمكنك تضمين مكونات React أو كتل مخصصة مثل Sanity أو Contentful.
  • تحتاج إلى أذونات دقيقة على المحتوى. نموذج الأذونات في Airtable هو لكل قاعدة وحسب الجدول، وليس لكل سجل. إذا كان على المحرر A عدم رؤية مسودات المحرر B، فستواجه وقتاً سيئاً.
  • تحتاج إلى معاينة في الوقت الفعلي. لا توجد سير عمل مسودة/معاينة مدمج. يمكنك اختراقه مع طرق مصفاة وحقل حالة، لكنه فوضوي.
  • تحتاج إلى تحويلات الصور. عناوين URL مرفقات Airtable مؤقتة (تنتهي صلاحيتها بعد حوالي ساعتين). ستحتاج إلى خط أنابيب صور منفصل.

لأي شيء يتجاوز موقع محتوى صغير إلى متوسط، من المحتمل أن تكون أفضل حالاً مع CMS headless مخصص. نحن نغطي ذلك في عمل تطوير CMS headless.

إعداد قاعدة Airtable للمحتوى

قبل كتابة أي كود، احصل على قاعدة Airtable الخاصة بك بشكل صحيح. إليك البنية التي أستخدمها لمدونة نموذجية:

بنية القاعدة

أنشئ جدولاً يسمى Posts بهذه الحقول:

اسم الحقل نوع الحقل ملاحظات
العنوان نص سطر واحد الحقل الأساسي
Slug نص سطر واحد آمن للـ URL، صغير
النص نص طويل (Markdown) تفعيل تنسيق نص غني
المقتطف نص طويل نص عادي، 1-2 جملة
منشور خانة اختيار تصفية هذا للإنتاج
تاريخ النشر التاريخ فرز حسب هذا بترتيب عكسي
المؤلف ربط مع جدول المؤلفين ربط علائقي
الوسوم اختيار متعدد أو ربط مع جدول الوسوم
صورة مميزة مرفق صورة واحدة
عنوان SEO نص سطر واحد تجاوز اختياري
وصف SEO نص طويل وصف Meta

أنشئ عرضاً مصفى يسمى "منشور" يعرض فقط السجلات حيث تكون منشور محددة. هذا هو محتوى الإنتاج الخاص بك.

إعداد الـ API

  1. انتقل إلى airtable.com/create/tokens وأنشئ رمز وصول شخصياً.
  2. أعطه نطاق data.records:readdata.records:write إذا كنت بحاجة إلى وصول الكتابة).
  3. حدد نطاقه للقاعدة المحددة التي تستخدمها.
  4. خزنه في ملف .env الخاص بك. لا تلتزمه أبداً.
# .env
AIRTABLE_TOKEN=pat_xxxxxxxxxxxxx
AIRTABLE_BASE_ID=appXXXXXXXXXXXXXX

يمكنك العثور على معرف القاعدة الخاص بك في توثيق Airtable API أو في الـ URL عند عرض القاعدة الخاصة بك.

استخدام Airtable كـ CMS مع Astro و Next.js في 2026 - البنية المعمارية

ربط Airtable مع Astro

Astro هو إطار العمل المفضل لدي لمواقع Airtable عندما يكون المحتوى في الغالب ثابتاً. بما أن Astro ينشئ HTML ثابت بشكل افتراضي، فإنك تجلب جميع بيانات Airtable الخاصة بك في وقت البناء، مما يعني صفر استدعاءات API من الزوار والقلق بشأن حدود المعدل في الإنتاج.

إذا كنت تستكشف Astro لمشروعك القادم، لديننا خبرة عميقة به — تحقق من خدمات تطوير Astro الخاصة بنا.

تثبيت الـ SDK

npm install airtable

إنشاء أداة جلب البيانات

// src/lib/airtable.ts
import Airtable from 'airtable';

const base = new Airtable({ apiKey: import.meta.env.AIRTABLE_TOKEN })
  .base(import.meta.env.AIRTABLE_BASE_ID);

export interface Post {
  id: string;
  title: string;
  slug: string;
  body: string;
  excerpt: string;
  publishDate: string;
  featuredImage: { url: string; filename: string } | null;
  tags: string[];
}

export async function getPosts(): Promise<Post[]> {
  const records = await base('Posts')
    .select({
      view: 'Published',
      sort: [{ field: 'Publish Date', direction: 'desc' }],
    })
    .all();

  return records.map((record) => ({
    id: record.id,
    title: record.get('Title') as string,
    slug: record.get('Slug') as string,
    body: record.get('Body') as string,
    excerpt: record.get('Excerpt') as string,
    publishDate: record.get('Publish Date') as string,
    featuredImage: record.get('Featured Image')
      ? {
          url: (record.get('Featured Image') as any[])[0].url,
          filename: (record.get('Featured Image') as any[])[0].filename,
        }
      : null,
    tags: (record.get('Tags') as string[]) || [],
  }));
}

export async function getPostBySlug(slug: string): Promise<Post | undefined> {
  const records = await base('Posts')
    .select({
      view: 'Published',
      filterByFormula: `{Slug} = '${slug}'`,
      maxRecords: 1,
    })
    .all();

  if (records.length === 0) return undefined;
  const record = records[0];

  return {
    id: record.id,
    title: record.get('Title') as string,
    slug: record.get('Slug') as string,
    body: record.get('Body') as string,
    excerpt: record.get('Excerpt') as string,
    publishDate: record.get('Publish Date') as string,
    featuredImage: record.get('Featured Image')
      ? {
          url: (record.get('Featured Image') as any[])[0].url,
          filename: (record.get('Featured Image') as any[])[0].filename,
        }
      : null,
    tags: (record.get('Tags') as string[]) || [],
  };
}

استخدمه في صفحات Astro

---
// src/pages/blog/[slug].astro
import { getPosts, getPostBySlug } from '../../lib/airtable';
import Layout from '../../layouts/Layout.astro';

export async function getStaticPaths() {
  const posts = await getPosts();
  return posts.map((post) => ({
    params: { slug: post.slug },
  }));
}

const { slug } = Astro.params;
const post = await getPostBySlug(slug!);

if (!post) return Astro.redirect('/404');
---

<Layout title={post.title}>
  <article>
    <h1>{post.title}</h1>
    <time>{post.publishDate}</time>
    <div set:html={post.body} />
  </article>
</Layout>

هذا كل شيء. في astro build، يتم جلب كل منشور من Airtable وتقديمه إلى HTML ثابت. لا يقوم موقع الإنتاج الخاص بك باستدعاءات API.

ربط Airtable مع Next.js

Next.js يعطيك مرونة أكثر. يمكنك جلب وقت البناء مع generateStaticParams، أو وقت الطلب مع مكونات الخادم، أو استخدام ISR (الإنشاء الثابت الإضافي) للحصول على أفضل ما في العالمين.

نبني الكثير من مواقع Next.js — إنها خبزنا وزبدتنا. انظر إلى قدرات تطوير Next.js الخاصة بنا.

أداة الجلب (إصدار Next.js)

أفضل استخدام Airtable REST API مباشرة مع fetch في Next.js بدلاً من الـ SDK. إنه يعطيك تحكماً أفضل على التخزين المؤقت مع امتدادات fetch من Next.js.

// lib/airtable.ts
const AIRTABLE_TOKEN = process.env.AIRTABLE_TOKEN!;
const AIRTABLE_BASE_ID = process.env.AIRTABLE_BASE_ID!;

const headers = {
  Authorization: `Bearer ${AIRTABLE_TOKEN}`,
  'Content-Type': 'application/json',
};

export async function fetchPosts() {
  const url = new URL(
    `https://api.airtable.com/v0/${AIRTABLE_BASE_ID}/Posts`
  );
  url.searchParams.set('view', 'Published');
  url.searchParams.set('sort[0][field]', 'Publish Date');
  url.searchParams.set('sort[0][direction]', 'desc');

  const res = await fetch(url.toString(), {
    headers,
    next: { revalidate: 60 }, // ISR: إعادة تحقق كل 60 ثانية
  });

  if (!res.ok) throw new Error(`Airtable API error: ${res.status}`);

  const data = await res.json();
  return data.records.map((record: any) => ({
    id: record.id,
    title: record.fields['Title'],
    slug: record.fields['Slug'],
    body: record.fields['Body'],
    excerpt: record.fields['Excerpt'],
    publishDate: record.fields['Publish Date'],
    tags: record.fields['Tags'] || [],
  }));
}

صفحة ISR مع App Router

// app/blog/[slug]/page.tsx
import { fetchPosts } from '@/lib/airtable';
import { notFound } from 'next/navigation';

export async function generateStaticParams() {
  const posts = await fetchPosts();
  return posts.map((post: any) => ({ slug: post.slug }));
}

export default async function BlogPost({
  params,
}: {
  params: Promise<{ slug: string }>;
}) {
  const { slug } = await params;
  const posts = await fetchPosts();
  const post = posts.find((p: any) => p.slug === slug);

  if (!post) notFound();

  return (
    <article>
      <h1>{post.title}</h1>
      <time>{post.publishDate}</time>
      <div dangerouslySetInnerHTML={{ __html: post.body }} />
    </article>
  );
}

مع revalidate: 60، سيقدم Next.js الصفحة المخزنة مؤقتاً وينعشها في الخلفية في أكثر من مرة كل 60 ثانية. يقوم المحررون بتحديث Airtable، والموقع يتحدث في غضون دقيقة. لا إعداد Webhook، لا تشغيل إعادة بناء.

التعامل مع الصور والمرفقات

هذه أكبر مشكلة عند استخدام Airtable كـ CMS. انتهاء صلاحية عناوين URL مرفقات Airtable. إنها عناوين URL موقعة تصبح غير صالحة بعد حوالي ساعتين تقريباً. إذا قدمتها مباشرة في HTML الخاص بك، فسوف تنقطع.

إليك خياراتك:

الخيار 1: التنزيل في وقت البناء (Astro)

للمواقع الثابتة، قم بتنزيل الصور أثناء البناء وقدمها محلياً:

import fs from 'fs/promises';
import path from 'path';

async function downloadImage(url: string, filename: string) {
  const res = await fetch(url);
  const buffer = Buffer.from(await res.arrayBuffer());
  const outputPath = path.join('public', 'images', 'cms', filename);
  await fs.mkdir(path.dirname(outputPath), { recursive: true });
  await fs.writeFile(outputPath, buffer);
  return `/images/cms/${filename}`;
}

الخيار 2: الوكيل من خلال CDN

قم بإعداد Cloudflare Worker أو Vercel Edge Function الذي يعمل كوكيل لعناوين URL صور Airtable، ويخزنها مؤقتاً، ويقدمها من خلال المجال الخاص بك. يعمل هذا لـ Astro و Next.js.

الخيار 3: استخدم مضيف صور منفصل

قم برفع الصور إلى Cloudinary أو Imgix أو S3، وخزن عنوان URL الدائم في حقل نص بدلاً من استخدام حقل مرفق Airtable. هذا ما أنصح به لمواقع الإنتاج — إنه الأكثر موثوقية.

التخزين المؤقت وحدود المعدل والأداء

لدى Airtable حدود معدل صارمة: 5 طلبات في الثانية لكل قاعدة. هذا ليس كثيراً. إليك كيفية البقاء أسفل هذا.

الاستراتيجية الإطار كيفية عملها
الإنشاء الثابت Astro جميع استدعاءات الـ API تحدث في وقت البناء. صفر استدعاءات وقت التشغيل.
ISR Next.js الاستجابات المخزنة مؤقتاً، أعيد التحقق منها على مؤقت.
ذاكرة التخزين المؤقت في الذاكرة كليهما ذاكرة تخزين مؤقت استجابات الـ API في خريطة مع TTL.
Webhook + إعادة بناء كليهما أتمتة Airtable تشغل إعادة بناء Vercel/Netlify.
ذاكرة تخزين مؤقت Redis/KV Next.js (Vercel) خزن استجابات الـ API في Vercel KV أو Upstash Redis.

بالنسبة لمواقع Astro، يعني نهج وقت البناء أنك تضرب الـ API فقط أثناء النشر. بالنسبة لـ Next.js مع ISR، ستضربه في أكثر من مرة لكل فترة إعادة تحقق لكل صفحة.

إذا كان لديك الكثير من الصفحات وفترات إعادة تحقق قصيرة، فكر في جلب جميع السجلات مرة واحدة وتخزين مؤقت لمجموعة البيانات بأكملها بدلاً من جعل استدعاءات API لكل صفحة.

أهمية التصفية

يعيد Airtable الحد الأقصى من 100 سجل لكل طلب. تتعامل طريقة .all() في الـ SDK مع التصفية تلقائياً، لكن إذا كنت تستخدم fetch مباشرة، فتحتاج إلى اتباع رمز offset:

async function fetchAllRecords(tableName: string) {
  let allRecords: any[] = [];
  let offset: string | undefined;

  do {
    const url = new URL(
      `https://api.airtable.com/v0/${AIRTABLE_BASE_ID}/${tableName}`
    );
    url.searchParams.set('view', 'Published');
    if (offset) url.searchParams.set('offset', offset);

    const res = await fetch(url.toString(), { headers });
    const data = await res.json();

    allRecords = [...allRecords, ...data.records];
    offset = data.offset;
  } while (offset);

  return allRecords;
}

محتوى النصوص الغنية والـ Markdown

يمكن لحقول النصوص الطويلة في Airtable تخزين Markdown إذا فعلت خيار "نص غني". لكن ما تحصل عليه من الـ API هو نصوص منسقة بـ Markdown، وليس HTML.

تحتاج إلى تحويلها. أستخدم marked للحالات البسيطة أو unified مع مكونات remark لمزيد من التحكم:

import { marked } from 'marked';

const htmlContent = marked.parse(post.body);

بالنسبة لـ Astro، يمكنك أيضاً استخدام معالجة Markdown المدمجة:

---
import { marked } from 'marked';
const html = marked.parse(post.body);
---
<article set:html={html} />

شيء واحد يجب الحذر منه: محرر النصوص الغنية في Airtable ينتج نكهته الخاصة من Markdown. يتعامل مع الضغط والمائل والارتباطات والعناوين والقوائم بشكل جيد. كتل الأكواد والجداول مدعومة لكن يمكن أن تكون صعبة الاستخدام. إذا كان محتوى الخاص بك يحتاج إلى تنسيق معقد، فكر في جعل المحررين يكتبون في وضع Markdown العادي.

Airtable مقابل خيارات CMS Headless التقليدية

دعنا نكون صريحين بشأن المقايضات. إليك كيفية مقارنة Airtable مع منصات CMS headless المخصصة في 2026:

الميزة Airtable Sanity Contentful Strapi
منحنى تعلم المحرر منخفض جداً متوسط متوسط جيد
نمذجة المحتوى مرن، غير رسمي ممتاز ممتاز جيد
حدود معدل الـ API 5 req/s لكل قاعدة سخي (CDN) سخي (CDN) استضافة ذاتية
التعامل مع الصور عناوين URL منتهية الصلاحية CDN مدمج CDN مدمج استضافة ذاتية
المعاينة/المسودات يدوي (خانة اختيار) مدمج مدمج مدمج
التسعير (فريق من 5) 100$/شهر (فريق) طبقة مجانية قابلة للتطبيق 300$/شهر+ مجاني (استضافة ذاتية)
دعم Webhook من خلال الأتمتة مدمج مدمج مدمج
جودة النصوص الغنية Markdown الأساسي Portable Text نصوص منسقة نصوص غنية
محتوى علائقي سجلات مرتبطة مراجع مراجع علاقات

يفوز Airtable في تجربة المحرر والمرونة. يخسر في التعامل مع الصور وأسالب المعاينة وموثوقية الـ API عند الحجم. للمواقع الصغيرة إلى المتوسطة حيث يكون المحررون بالفعل في Airtable؟ إنه خيار صلب. لمواقع غنية بالمحتوى مع سير عمل معقد؟ اذهب مع CMS حقيقي.

أنماط العمارة في العالم الحقيقي

إليك الأنماط التي استخدمتها في الإنتاج:

النمط 1: ثابت بالكامل مع Astro + Rebuild Webhooks

أفضل لـ: مواقع التسويق والمحافظ والدلائل مع < 500 سجل.

  1. Astro يجلب جميع بيانات Airtable في وقت البناء.
  2. أتمتة Airtable ترسل Webhook إلى Vercel/Netlify عند تحديث السجل.
  3. الموقع يعاد بناؤه في 30-60 ثانية.
  4. الصور التي تم تنزيلها في وقت البناء — لا توجد مشاكل عناوين URL منتهية الصلاحية.

النمط 2: ISR مع Next.js

أفضل لـ: المدونات والكتالوجات والمواقع ذات التحديثات المتكررة.

  1. Next.js ينشئ الصفحات مع ISR (إعادة تحقق كل 60-300 ثانية).
  2. Airtable API يسمى مرة واحدة لكل إعادة تحقق لكل صفحة فريدة.
  3. الصور يتم بروكسيها من خلال Cloudinary أو تنزيلها إلى CDN.
  4. يرى المحررون التحديثات في غضون دقائق دون تشغيل إعادة بناء كاملة.

النمط 3: Airtable + CMS تكميلي

أفضل لـ: المواقع حيث يوجد بعض المحتوى في Airtable والمحتوى الآخر يحتاج إلى تحرير أغني.

  1. البيانات المنظمة (أعضاء الفريق والأحداث والمنتجات) تبقى في Airtable.
  2. محتوى طويل الشكل (منشورات المدونة ودراسات الحالة) يذهب إلى Sanity أو Notion.
  3. الواجهة الأمامية تجلب من كلا المصدرين في وقت البناء أو مع ISR.

هذا النهج الهجين أكثر شيوعاً مما قد تعتقد. لقد بنينا عدة مواقع بهذه الطريقة — إذا كنت تفكر في شيء مشابه، دعنا نتحدث عن الأمر.

تشغيل عمليات إعادة البناء من Airtable

لدى Airtable أتمتة مدمجة يمكنها إطلاق Webhooks. قم بإعداد مشغل في "عند تحديث السجل" في جدول Posts الخاص بك، ثم أرسل طلب POST إلى Webhook بناء منصة النشر الخاصة بك:

// Vercel deploy hook
https://api.vercel.com/v1/integrations/deploy/prj_xxxx/yyyy

// Netlify build hook
https://api.netlify.com/build_hooks/xxxxxxxxxxxx

أضف تأخير 30 ثانية في الأتمتة لدمج عمليات التحرير السريعة.

الأسئلة الشائعة

هل Airtable مجانية للاستخدام كـ CMS؟ تتضمن الخطة المجانية من Airtable 1000 سجل لكل قاعدة و 1000 استدعاء API شهرياً. هذا يكفي لموقع صغير، لكن من المحتمل أن تحتاج إلى خطة الفريق ($20/مقعد/شهر في 2026) لأي شيء جدي. توفر خطة الفريق 50000 سجل وحدود API أعلى.

كيف أتعامل مع عناوين URL صور Airtable المنتهية الصلاحية؟ تنتهي صلاحية عناوين URL مرفقات Airtable بعد حوالي ساعتين. بالنسبة للمواقع الثابتة المدمجة مع Astro، قم بتنزيل الصور في وقت البناء. بالنسبة لـ Next.js مع ISR، إما بروكسي الصور من خلال CDN مثل Cloudinary، أو خزن عناوين URL الصور في خدمة استضافة صور منفصلة وقم بالإشارة إليها كحقول نصية في Airtable.

هل يمكن لـ Airtable معالجة مدونة بمئات المنشورات؟ نعم، إلى حد ما. تتعامل Airtable مع مئات السجلات بشكل جيد. بمجرد دخولك في الآلاف، بدء الـ API تصفية وأوقات البناء بصيرة. بالنسبة لمدونة بأقل من 1000 منشور، يعمل بشكل جيد. بعد ذلك، فكر في CMS headless مخصص.

هل Airtable أفضل من Notion كـ CMS؟ هم يحل مشاكل مختلفة. Airtable أفضل للبيانات المنظمة (المنتجات والأحداث وأعضاء الفريق) بسبب نموذج قاعدة البيانات العلائقية الخاصة به. Notion أفضل للمحتوى المكتوب الطويل لأنه محرر قائم على كتل. Airtable API أيضاً أكثر نضجاً وأسرع من Notion.

كيف أقوم بإعداد وظائف المعاينة/المسودة مع Airtable؟ أضف حقل "حالة" متعدد الاختيار مع خيارات مثل "مسودة" و"قيد المراجعة" و"منشور". أنشئ عرضاً مصفى لكل حالة. موقع الإنتاج الخاص بك يجلب من عرض "منشور". للمعاينات، أنشئ مسار معاينة منفصل يجلب من عرض "قيد المراجعة"، محمي بالمصادقة.

هل يجب أن أستخدم الـ SDK الـ Airtable أم REST API مباشرة؟ بالنسبة لـ Astro، تعمل حزمة airtable npm الرسمية بشكل جيد لأنك تجلب في وقت البناء. بالنسبة لـ Next.js، أنصح باستخدام fetch مباشرة مع REST API — فهو يعطيك التحكم على توجيهات التخزين المؤقت من Next.js مثل revalidate و tags. الـ SDK لا يفهم خيارات fetch الموسعة من Next.js.

ما هو الحد الأقصى من استدعاءات الـ API التي يسمح بها Airtable؟ تفرض Airtable حد معدل 5 طلبات في الثانية لكل قاعدة. تجاوز هذا يعيد حالة 429. في خطة الفريق، تحصل على بدل استدعاء شهري أعلى، لكن حد المعدل في الثانية يبقى كما هو. الإنشاء الثابت و ISR هما أفضل الطرق لتقليل استخدام الـ API.

هل يمكنني استخدام Airtable مع Astro و Next.js معاً في نفس المشروع؟ ليس تماماً في نفس المشروع، لكن يمكنك الحصول على قاعدة Airtable مشتركة تغذي عدة واجهات أمامية. بعض الفريق يستخدم Astro لموقع التسويق الخاص به و Next.js لتطبيق الويب الخاص به، كلاهما يقرأ من نفس قاعدة Airtable. فقط كن حذراً من حدود المعدل المشتركة عبر جميع المستهلكين.