Design exploration · not yet scheduled

Bringing a Canva lookbook into a BloomBoard proposal

Florists design lookbooks in Canva because its image editing is excellent. These mockups show the import flow (Option 3): the lookbook's pages are pulled in via Canva's API and become ordinary full-bleed custom pages — already supported by Custom Pages v1 — so the client sees one seamless, white-labelled document on web and in the PDF.

2026-08-13 · builds on Custom Pages v1 (ProposalDesignSelection.custom_pages) · OAuth via the existing comms/oauth.py PKCE engine · ingest via MediaService.upload_from_url

The flow at a glance

Canva is involved exactly twice — once to connect, once per import. Everything the client ever sees is served by BloomBoard.

🎨
Design in Canva
Florist builds the lookbook with Canva's tools, as they do today
🔗
Connect Canva
OAuth consent in Settings
One-time
🖼️
Pick & import
Choose the design in the studio; pages export as images
📄
Custom pages
One full-bleed page per Canva page — reorder, anchor, delete
💐
Client sees one document
Web view + PDF, fully white-label. No Canva anywhere
Snapshot on send

1Connect Canva — Settings

A one-time connection, following the Email settings connect-card pattern. Both states shown.

Settings → Integrations
app.bloomboard.io/settings/integrations
Integrations
Connect the tools you already design and plan with.
1 C
Canva
Import your Canva lookbooks straight into proposals.
Connect
2 C
Canva Connected
dylan@rootlab.co.za · can view your designs and export them3
Disconnect
1Disconnected state. "Connect" opens Canva's OAuth consent screen in a popup; on return the card flips to connected with a ?connected= banner, same as email.
2Connected state — sage badge, matching brand status colours (no generic green).
3Plain-language scope summary: read designs + export. We never get edit access.

2Entry point — the studio outline

"Import from Canva" lives in the existing custom-page add menu, next to blank pages and starter layouts. No new surface to learn.

Template studio → document outline
app.bloomboard.io/events/smith-wedding/proposal/design
Sections
Cover
Welcome
Event overview
Visual direction
Arrangements
Investment summary
Custom pages
Venue mood after Visual direction
+ Add page1
1The existing add-page affordance in the custom-pages group — unchanged.
2One new menu row. If Canva isn't connected yet, choosing it shows a connect prompt first, then continues straight into the picker.

3Pick a design

Modelled directly on the Pinterest import modal: same head/body/foot rhythm, same selection language. The grid lists the florist's own Canva designs, newest first.

Import modal — step 1 of 2
1Selected design gets the terracotta ring — same selection treatment as pin tiles.
2Thumbnails and page counts come from Canva's design-list API; no export happens until the florist commits.

4Choose pages & placement, then import

All pages start selected — the common case is "bring the whole lookbook". Placement reuses the custom-page anchor model.

Import modal — step 2 of 2
1Page thumbnails from Canva's low-res preview export; the real import fetches print-quality PNGs sized for the proposal page (A4/Letter aware).
2The two anchor choices map straight onto after_section and document_end in the existing custom-pages schema. Pages can still be dragged anywhere afterwards.
Committing state
!If the design uses premium Canva elements the florist hasn't licensed, the export fails per-page — we surface Canva's reason in florist language and import the rest.

5After import — ordinary pages, plus refresh

Imported pages behave exactly like hand-built custom pages. The only Canva-specific affordance is the refresh nudge on drafts when the source design has been edited since import.

Studio outline after import
app.bloomboard.io/events/smith-wedding/proposal/design
2
This lookbook was edited in Canva after you imported it.
Imported 3 days ago · edited in Canva yesterday
Refresh pages Dismiss
Custom pages
1 Lookbook · pages 1–7 C Canva after Visual direction
Venue mood end of document
1The imported group carries a small Canva badge so the florist knows where it came from — but each page is a normal custom page: drag to reorder, delete, re-anchor.
2Draft-only nudge, powered by comparing Canva's updated_at against our import timestamp on studio load. No webhook exists for this, so it's checked when the studio opens — not pushed. Refresh replaces the page images in place, keeping order and anchors. Sent proposals are snapshots and never change.

6What the client sees

Nothing to learn here — and that's the point. Lookbook pages sit inside the document on the web view and in the PDF, indistinguishable from native pages.

Client proposal · app.bloomboard.io/p/… (or the florist's own domain)
Visual direction (native)
from Canva
Lookbook page 1 (imported)
from Canva
Lookbook page 2 (imported)
!The "from Canva" tags above are annotation only — the client sees no badge, no link, no Canva branding. Pages render full-bleed in the web view and paginate into the PDF like any custom page.

For contrast — the "alongside" alternative (Option 2)

If we ever want the live-updating version instead, it looks like this: a link card on the proposal page that opens Canva's viewer. Always current, but it leaves the branded experience, requires the design to be public, and never appears in the PDF. Not the recommended v1.

Client proposal — supplementary card

Open decisions

Things to settle before implementation — none block the design above.

📏
The 12-page cap Recommend: raise to ~24 for imports
MAX_CUSTOM_PAGES = 12 in template_studio/services/custom_pages.py. Canva lookbooks routinely run longer. Image-background pages are cheap to render, so the cap is policy, not performance — but raising it needs a quick check against the PDF measure loop.
Refresh semantics Recommend: replace-in-place
Refresh swaps each page's image for the re-exported one, preserving order, anchors, and any pages the florist deleted. If the Canva design gained pages, new ones append to the group; if it lost pages, we drop the orphans and say so.
🔐
Where the connect card lives
There's no Integrations settings page yet — Email, WhatsApp and Payments each have their own. Mockup 1 assumes a new Integrations page; the alternative is inline-connect only (from the import modal), deferring the settings surface.
⏱️
Canva review lead time
A public Connect integration needs Canva's review (demo video, scope justification). Weeks, not days — worth starting the developer-account + submission process well before the code is finished. Scopes requested: design:meta:read, design:content:read, profile:read only.
🧺
Ship the manual path first? Recommend: yes
Everything in mockups 2, 4 (placement), 5 and 6 also serves a plain "upload N images → N pages" bulk flow with zero Canva dependency. Shipping that first delivers the client-facing outcome immediately; the Canva picker then bolts on as pure friction removal.