Known limitations
Everything Adcraft 1.0.0 does not do yet, in one place, so you can decide before you buy and set honest expectations with your own customers.
5 min readUpdated Oct 17, 2026Applies to Adcraft 1.0.0
On this page
We would rather you read this before buying than discover it afterwards. Each item below is something the interface, the plan descriptions or older notes might suggest, but that version 1.0.0 does not do. Items will move off this page as they ship; the Changelog will say when.
Billing and plans
- Without Stripe, the billing page stays visible. With
STRIPE_SECRET_KEYunset, the plan and top-up buttons are still shown. In development they grant the plan and credits for free; in production they show that payments are not set up, unlessALLOW_SIMULATED_BILLING=trueturns the free grants back on. See Running without Stripe. - Monthly plans only. The billing page always starts a monthly checkout. The "Yearly, save 20%" toggle on the marketing pricing page changes only the displayed prices.
- Credits arrive per paid invoice, so a yearly price, if you sell one, grants one month's credits a year.
- Plan limits other than credits are display text. Brand counts, ad-account counts, "priority generation queue", "video priority" and "client review workspaces" are not enforced or implemented.
- No carousel format, although plan descriptions mention carousels.
- Plan status does not gate features. A cancelled or past-due workspace keeps its last plan's feature switches; it simply stops receiving credits. The Publishing switch is checked when the campaign builder opens, not when a campaign is submitted.
- Changing plan creates a new Stripe subscription rather than changing the existing one.
- Stripe product metadata is not read. Plans and credits come from
PLANSinapps/app/src/server/billing.ts. - No promotion codes or Stripe Tax on checkout.
- Some price-list figures differ from charges.
CREDIT_COSTS.conceptsand.staticAdonly drive the displayed price list. The editable static ad form estimates the model's price but charges 2 credits, and the "Generate missing sizes" label assumes 2 credits a size. - Placeholder runs cost credits. Sample concepts, placeholder product and presenter videos and placeholder bulk ads are charged like real ones.
- Some generations check the balance only in the browser, so a workspace can occasionally end slightly below zero credits.
- Revenue and margins in the admin panel are estimates, worked out from list prices and credits rather than imported from Stripe.
Accounts and admin
- No passwords. Sign-in is by magic link (Resend) or Google only; production needs one of them.
- Removing an address from
ADMIN_EMAILSalso removes admin rights that were set outside the panel, such as by the list itself or by editing the database. Only admins granted under Admin → Users are kept. See First admin. - View as support is not fully read-only. It uses the viewer role, but some video, brief, character, product library, brand, onboarding import and comment actions do not check the viewer role yet, so support can still make those changes.
- Viewers are not blocked from every editing action. The same unchecked actions are open to workspace viewers: they can create briefs, brands, videos and library products.
- A suspended member cannot switch to another workspace.
- No workspace switcher, although the invitation page mentions one.
- No automatic workspace deletion. Requests are recorded and emailed; deletion is manual.
- No deleting users or workspaces from the admin panel, and last sign-in is not tracked.
- The welcome screen always says 10 free credits, whatever the trial setting.
- Some guardrail wording is wider than the code. The monthly provider cost cap cannot be overridden per workspace, owners can raise as well as lower their spend approval threshold, and "actions per minute" only sets the generation rate limit (a quarter of the value).
- Rate limits are kept in memory per process and reset on restart.
Creative tools
- Single static ads need a connected image model; bulk generation does not check and produces placeholders.
- AI-designed static ads ignore the chosen art direction.
- Editable layers can be resized but not moved, and colours come from the brand kit only.
- No CSV import for bulk generation, although the create menu mentions one.
- No browsing or restoring brand kit versions, and saving the kit by hand hides the website findings until the site is read again.
- Product-video stills always use the default image model.
- Video caption style and fonts are fixed (DM Sans and Instrument Serif), not taken from the brand kit.
- Some video labels are out of date: the voice is always described as ElevenLabs, presenters as "licensed stock avatar", and the concept form says cloned voices need "a consent flow first".
- Voice cloning and design use HeyGen only; ElevenLabs cloning is not offered.
- Brand gallery review links exist in the code but no screen creates them.
- Templates saved from videos are not used by the video builders.
- Model names reflect what providers offered when 1.0.0 was built. Providers retire and rename models; update them under Admin → Models.
Publishing and performance
- Platform review is on you. Live publishing needs your own Meta, TikTok and Google Ads apps, approved by each platform.
- Google Ads publishes Demand Gen image ads only. Video needs YouTube hosting, which is not supported, and interests are not applied to targeting.
- Google Ads budget edits after publishing may not reach Google.
- TikTok conversion value is not read back, so TikTok ROAS is not reported.
- Platform AI-content labels are not set automatically.
- Fatigue alerts need 10 days of data and never appear in 7-day views or on the dashboard.
- Without Inngest there is no hourly sync. Use Sync now.
API and webhooks
- The API is read-only: it lists ads and serves their files. It cannot generate anything.
limitis capped at 100 even though larger values are accepted.- Webhooks are sent once, with no retries, and
creative.renderedis sent for static ads only.
Operations
- Without Inngest nothing runs on a schedule: no hourly performance sync and no nightly backup. Jobs run inside the web process with no retries.
- The nightly backup needs Inngest and a matching
pg_dump(the image includes the PostgreSQL 18 client). - Inline background-job errors appear in the logs only, not under Admin → Errors.
- Storage supports Cloudflare R2 or local disk, not other S3-compatible services.
- The embedded database is for evaluation. In Docker it needs
PGLITE_DATA_DIRon a mounted volume. - Rendering runs on your server. There is no cloud rendering option for video.
- Legal page wording is a template. Contact addresses come from
SUPPORT_EMAILandPRIVACY_EMAIL(withexample.complaceholders when unset), but the text of the privacy, terms and DPA pages is inapps/app/src/lib/legal.ts. Rewrite it, and setEMAIL_FROM, before launch: the default sender is Resend's test address. - Remotion licensing. Product-video rendering needs a Remotion company licence for organisations of more than three people.