Spurlock Studios
Contact
Share LinkedIn X
A scuffed work smartphone with a blank glowing circular button. Thesis: GET TOUR DATES SHOW UP.

Get tour dates on the website automatically by treating the page as a reader of one write surface — usually Bandsintown, Songkick Tourbox, or Dice — then either embedding that vendor’s widget or syncing the same feed into owned JSON / a CMS, often with n8n. The designer ships the module once. The manager never opens Designer to change a city. Hard-coded date strings in the layout are not automation; they are a brochure that lies after the first routing change. This spoke sits under Websites That Feel Like Films. The ops rule — one calendar, many readers — is the companion post tour dates without five logins. This one is the site install.

On builds for acts like Foxtide and Arkayla, the tour block is a job: next dates, a ticket or notify path, an off-season empty state. I do not attach invented sell-out counts or “X% more ticket clicks” to those sites. The receipt is the architecture: one write, one display contract, no Designer in the Tuesday loop.

The short answer

  • Pick one write surface. Everyone on the team updates that system only.
  • Make the website a reader: vendor embed, owned JSON/CMS, or an n8n copy of that feed. Never all three as write paths.
  • Pin numeric IDs (id_… on Bandsintown, Tourbox snippet from your Integrations page, Dice partner filters). Name match is a collision.
  • Homepage: next three from the same feed as /tour. Empty state is designed. Past dates stay off the fold.
  • I will not invent a ticket lift. Measure time-to-update and outbound clicks on your domain.
Reader on the siteWrite stays inAutomatic if
Vendor embedBIT, Tourbox, or DiceSnippet uses pinned IDs
Owned JSON / CMSThat CMS, or the vendor via sync — never both by handManager never opens Designer
n8n copyStill the vendorJob upserts externalId and publishes

What does automatically mean on the website?

Automatically means a manager edit upstream appears on the live site without a designer deploy. It does not mean five widgets, a JSON file, and a spreadsheet all claiming to be current.

What fans seeWhat actually happenedHonest?
New city on /tour after a Tourbox saveWidget or API readerYes
Homepage “next 3” reshuffles when a room sells outSame feed, status field flippedYes
Designer pastes a new date into a rich-text blockManual publishNo
n8n writes CMS and the intern types a second rowTwo write surfacesNo
Link-in-bio still has last month’s roomsThird calendarNo

The same class of failure shows up on trades sites: hours and the phone number must match Google Business Profile, not a hero line someone forgot to edit. That is the trades and SMB playbook in a different costume. Tour dates are the artist version of hours. If they live in the design file, they will be wrong in public.

Test it out loud:

  1. Who adds a date at 11:40 p.m. the night a hold confirms?
  2. Do they open Bandsintown, Tourbox, Dice, or the CMS — one tool?
  3. After they save, can /tour move without you?

If step 3 is “I have to ship a build,” you do not have automatic dates. You have a launch brochure.

How fast the reader can move depends on the host. None of these are vendor SLAs. They are install choices.

HostWhat “automatic” requires after an upstream saveTypical lag if you get it right
Vendor widget (BIT / Songkick / Dice)Fan hard-refresh; widget fetches vendor JSONSeconds to a few minutes
Webflow CMS via APIPATCH then publish itemsMinutes — unpublished staged items look live in Editor and dead on .webflow.io production
Static HTML on a CDNClient fetch with a short cache, or n8n writes JSON and a rebuild hookMinutes if TTL is minutes; a day if you cached the HTML
Link-in-bio toolsPoint at /tourNever, if someone is still typing cities there
  • Widget pages are not behind a “cache HTML for 24h” rule during announce week
  • Webflow tour items are published, not only staged
  • Static hosts either fetch in the browser or rebuild on the sync
  • You have a named test: add a date, refresh, see it, delete it

Embed, owned JSON, or n8n — which reader should the site use?

Three honest site patterns. Pick one reader. The write surface is a separate choice (covered in the five-logins spoke). Mixing readers is fine only when they share the same upstream ID. Mixing writers is how you get two tours.

ReaderBest whenManager still writes inSite risk
Vendor embed (BIT / Songkick / Dice)You need it live this week; type system can absorb the widgetThat vendorIframe/CSS fight; logo; past-dates default
Owned JSON or CMS collectionFilm-grade rows, waitlist fields, per-show URLsCMS or the vendor if you sync — not both by handDual-write if Editor stays unlocked
n8n sync into CMS/JSONYou already have a CMS contract and a real APIStill the vendorFailed jobs, unpublished Webflow items, stale cache

Decision order (stop at the first yes):

  1. Will the manager live in Bandsintown, Tourbox, or Dice this quarter? → embed that widget first.
  2. Does the iframe break the type system or hide sold-out/waitlist states you need? → pull the API into your row component.
  3. Does the host not fetch JSON in the browser (or do you need CMS fields widgets cannot hold)? → n8n copies the feed into the CMS. Managers stay out of those fields.
HostTypical reader that stays automaticUsually a trap
WebflowBIT/Songkick/Dice embed, or CMS collection the API can publishDates in a rich-text embed on the Home canvas
Framer / custom ReactEmbed, or client fetch of BIT JSON with id_ + app_idCode override that hard-codes an array of shows
Astro / other staticClient fetch, or n8n → JSON + rebuild hookChecking a markdown file into git for every city
WordPressOfficial widget or a thin wrapper around itA page builder “event” block typed by hand

Embed is the default. Custom JSON is the upgrade when design or fields demand it. n8n is plumbing for that upgrade, not a personality.

How do Bandsintown, Songkick, and Dice embeds actually work?

Each embed is a live read of that vendor’s listing. Edits in the vendor dashboard update the snippet. You still have to paste the right snippet once, with the right identity, and not cache it into a fossil.

VendorOfficial path (checked September 2026)What the site getsLimit to budget for
BandsintownWidget builder + customization tableScript from widgetv3.bandsintown.com + .bit-widget-initializerPast dates default on; display-limit default is show all
SongkickTourbox → Integrations → Your websiteIframe fed by TourboxParent CSS cannot restyle iframe guts; attribution stays
DiceEvent Listing CreatorPartner widget (list or gallery); optional purchase overlayPartner ID + API key; no partner login, no official widget

Bandsintown attributes I actually set on artist homepages:

AttributeUse on the siteDefault to override
data-artist-nameid_{artist_id} from the public /a/{id} URLName string — collisions
data-display-limit3 on the homepageShow all
data-display-past-datesfalse on Upcoming modulestrue
data-display-start-timetrue when doors vs show time mattersfalse
data-display-logoOff when the type system cannot absorb itOn

BIT’s setup help is blunt: if the widget flakes, swap the artist name for the numeric ID. Two BIT widgets on one page is a blank hole and a support ticket that blames “Bandsintown being down.”

Songkick Tourbox is copy-paste from your Integrations page. Sold-out on the website widget is a Tourbox control, not a CSS trick. Festival “pick day” on the widget does not rewrite every other Songkick reader — do not assume /tour and Bandcamp saw the same Tuesday.

Dice is the third embed, not a vibe. The partner widget creator asks for an 8-digit Partner ID (attribution of clicks, views, purchases) and a 40-digit API string. Filter by exact artist / venue / promoter values. Script loads from Dice’s widget host (widgets.dice.fm on the WordPress wrappers). Dice’s Ticket Holders GraphQL is a partner API with restricted fields and a MIO token — not the default artist-site path. If you do not have a Dice partner account, you do not have this embed. Link out to the Dice event URL instead of inventing a scraper.

Same-day embed installs (one vendor, not three):

Bandsintown

  1. Claim the artist in Bandsintown for Artists. Copy the numeric ID from the public /a/{id} URL.
  2. Build the widget. Script: https://widgetv3.bandsintown.com/main.min.js. Initializer class: bit-widget-initializer.
  3. Set data-artist-name="id_{id}", homepage data-display-limit="3", data-display-past-dates="false".
  4. Paste once on Home and once on /tour (tour page omits the limit). Do not leave an old widget.bandsintown.com script beside v3.

Songkick

  1. Tourbox → Integrations → Your website.
  2. Copy that artist’s snippet. Paste into an HTML embed on Home (limit if the widget UI offers one) and /tour.
  3. Mark sold-out in Tourbox when the room is gone. Do not CSS-hide the Buy button on your side while Tourbox still says on sale.

Dice

  1. Open the Event Listing Creator. Pick list or gallery.
  2. Enter Partner ID and API string from the partner dashboard. Filter with exact artist (or promoter) values — a venue filter on an artist site dumps the room’s whole calendar onto your fold.
  3. Paste the embed. Optional purchase overlay only if Dice is actually selling that room.
  4. Confirm a known live Dice event appears, then a room that is not yours does not.
You sell tickets onEmbed on the siteDo not also
Bandsintown / mixed partnersBIT widget or BIT APIA second Songkick widget you never update
Songkick-first (Bandcamp matters)Tourbox widgetA BIT widget pointed at a duplicate profile
Dice-first roomsDice listing widgetA handmade “Buy on Dice” row with a stale slug

One embed matching the write surface. Two logos is not twice as automatic.

How do I pin identity so the widget is mine?

Wrong dates on an otherwise correct layout are almost always identity, not “the API is slow.”

SurfacePinFailure if you skip it
Bandsintown widgetdata-artist-name="id_123456"The other act with your spelling
Bandsintown APIhttps://rest.bandsintown.com/artists/id_{{artist_id}}/events/?app_id=...Name lookup returns the wrong catalog
Songkick widgetSnippet from this artist’s TourboxLeftover intern paste
Dice widgetPartner filters for this artist / promoter, not a venue you once playedThe room’s whole calendar on your homepage
CMS / n8nStore externalId = vendor event idDuplicate rows when the title string changes

Ship checklist:

  • Public BIT URL and Tourbox URL both resolve to this act
  • Widget / API uses id_ form, not a display name
  • Dice filters are exact strings the partner UI accepts (their own example is a venue name like “The Underworld”)
  • No second unclaimed BIT or Songkick profile for the same spelling
  • Embed snippet in the repo or CMS is commented with the production ID
  • Link-in-bio points at /tour, not a third handwritten list

Unclaimed duplicate profiles are how a well-meaning intern “fixes” a missing date by creating a second artist. Fans then see two calendars. Claim, merge, or report the duplicate. Do not start a new one.

When does owned JSON or a CMS beat the iframe?

Use owned JSON or a Tour CMS collection when the iframe cannot hold the job: waitlist, VIP copy, film-grade rows, or per-show URLs. The collection is still a reader if n8n or a human-in-CMS-only local calendar is the write. It becomes a second calendar the moment a manager types dates in Webflow and in Bandsintown.

Cap the schema. If the Editor can invent a new homepage from a tour row, you built a page builder and called it a calendar.

FieldRequiredWhy
externalIdYes if syncedIdempotent upsert; never key on city+date alone
start (datetime, offset explicit)YesSort, “next 3”, schema
cityYesHomepage can render before venue locks
venueNo (TBA allowed)Empty is not the string "TBA" unless you store TBA
ticketUrlNoEmpty drives Notify / waitlist, not a dead Buy
statusYestba / presale / onsale / soldout / canceled
noteNoSupport slot, festival day, door time — one line

Editor vs Designer:

SeatMay editMust not
Named managerVendor dashboard (source of truth)Webflow Designer, Framer canvas
CMS Editor (CMS-as-truth only)Tour collection fields aboveLayout, CMS schema, new components
n8nMapped fields from the APIA Slack-typed override field “just this once”
Designer / studioRow component, empty state, cacheThe date string

Bandsintown’s events API returns date/time, venue, ticket links, lineup, and the BIT event page. Managers get an app_id under Bandsintown for Artists → Settings → General. BIT’s own help: each key is linked to a single artist unless they authorize otherwise. Site display is the intended use; do not scrape it into a third-party “tour aggregator” you do not have terms for.

Songkick’s developer API is a separate product with attribution terms. Commercial sites should use their own key. The Tourbox widget already satisfies most artist homepages without you standing up that API.

JSON on the page is not a second calendar if it is generated from the same externalId. Hand-maintained shows.json in the repo is hard-coding with extra steps.

How should n8n sync dates without becoming a second calendar?

n8n is a copier. The vendor listing stays the write surface. The workflow reads, maps, upserts, and publishes. If a manager can also type a show in the CMS, you have rebuilt five logins with extra YAML.

I have 600+ automations built and 500+ live, and I have collaborated directly with the n8n team. The tour job is boring on purpose: HTTP in, map fields, write CMS, stop. It is not an agent loop.

Reference wiring (Bandsintown → Webflow). Swap the HTTP URL if Songkick or Dice is the source and you have licensed API access.

  1. Schedule Trigger. Minutes during announce week, hours in the off-season. Not days.
  2. HTTP Request GET https://rest.bandsintown.com/artists/id_{id}/events/ with query app_id and date=upcoming. Use n8n’s HTTP Request node. Store app_id in credentials, not in the canvas.
  3. Map. id → externalId. datetime → start. Venue city/name → city / venue. First ticket offers[].url → ticketUrl. Empty offers → status=tba or notify, not last tour’s Ticketmaster URL.
  4. Upsert. Find CMS item by externalId. Create or PATCH. Webflow Data API v2 PATCH /v2/collections/{id}/items is capped at 100 items per call.
  5. Publish. Staged PATCH is not the live site. POST /v2/collections/{id}/items/publish with itemIds, or PATCH the /items/live route if you mean to skip review. Scope cms:write.
  6. Reconcile. IDs present in CMS upcoming but missing from the API: mark canceled or unpublish. Do not delete the collection on an HTTP 500.
  7. Fail closed. On error, leave last good rows, alert the named owner. Turn on HTTP Request retry. Do not “clear all dates” as a cleanup step.

BIT’s events date query (from their API docs): upcoming (default), past, all, or a range like 2015-05-05,2017-05-05. Homepage and /tour should request upcoming. Do not pull all onto an Upcoming module.

BIT / CMS fieldMaps toRule
idexternalIdUnique; upsert key
datetimestartKeep the offset; do not strip to a date-only string
venue.citycityRequired even when venue is TBA
venue.namevenueEmpty or TBA — do not invent
offers[0].urlticketUrlFirst real offer; never a fallback from last tour
offers emptystatus notify/tbaNo Buy
Missing from upcoming payloadunpublish or canceledAfter a successful GET only

Webflow rate-limit responses tell you to respect X-RateLimit-Remaining. Batch PATCH is 100 items. A 12-date run does not need heroics. A 90-date festival summer might. If you get 429, wait and retry — do not wipe the collection to “start clean.”

n8n mistakeWhat fans seeFix
PATCH staged, never publishSite frozen; Designer looks “fine” in EditorPublish items or use live endpoints
Key on City — May 12Duplicate when venue locksexternalId
Treat empty upcoming array as errorHomepage hole in the off-seasonEmpty state module
Manager CMS edits after syncTwo toursLock those fields or CMS-as-truth only, never both
Cache HTML for a daySold-out still says BuyShort TTL on the tour route during announce week

Client-side fetch (no n8n) is valid on hosts that can call BIT in the browser. The app_id will be public; that is how BIT’s own widget works. Still pin id_. Still cache in minutes, not days. n8n earns its keep when you need Webflow CMS fields, private keys you do not want on the page, or a rebuild hook for a fully static host.

Do not invent a webhook BIT does not document. Poll the events endpoint. If a vendor later ships a real webhook, subscribe — do not assume it exists because n8n has a Webhook node.

How do homepage and /tour share one feed?

Homepage job: prove there is a tour and get the click. Tour page job: full list plus sold-out / waitlist. Same source. Different slice.

SurfaceShowsCTAReader setting
HomepageNext 3 upcomingTickets / Notify + All datesBIT data-display-limit="3"; CMS sort start asc, limit 3
/tourFull upcomingTickets, waitlist, notifyNo limit; past dates off or in an archive
EPKNext few + link to /tourBooking contact, not fan ticket UXSame feed, different chrome
Off-seasonZero rowsEmail / listen — not a broken iframeDesigned empty state

BIT’s customization docs: a “Show all dates” link appears when you exceed data-display-limit. On a film-grade homepage that link should go to your /tour, not to Bandsintown.com as the primary CTA. If the widget cannot retarget that link, use the API/CMS slice instead of fighting the iframe.

Procedure for a CMS homepage:

  1. Query upcoming where status is not canceled, start >= now, sort asc.
  2. Render three rows: date (with offset), city, venue or TBA, status, CTA.
  3. Fourth control is “All dates” → /tour.
  4. Zero rows: “No shows announced — join the list,” with email capture. Not a 404-looking widget.

Timezone: store the local offset on start. “7pm” without a zone is how a West Coast graphic and an East Coast module disagree by three hours. Google’s event structured data wants offsets on startDate if you emit Event JSON-LD at all. Most artist homepages should skip rich-result chasing until they have per-show URLs. A correct widget on /tour still beats decorated JSON-LD that says Friday is on sale.

If you do emit Event JSON-LD, generate it from the same feed as the page. Do not type it in the template.

Listing statuseventStatus if you emit schemaoffers.availability
On saleEventScheduledInStock only if the ticket URL is live
Sold outEventScheduledSoldOut
CanceledEventCancelledOmit a live Buy
PostponedEventPostponedNo leftover Friday URL
TBA venueSkip schema or omit location.name until realDo not invent a venue so Google is happy

Google’s own note: a schedule index is not the event page. If you will not ship /tour/city-date leaves, skip the rich-result chase. Widget on /tour is enough for the fan job.

What should the module do when there is no ticket URL?

Missing offers is a state. It is not a reason to paste last tour’s URL. TBA venue is a state. Sold out is a state. The module maps states to buttons. The manager flips them on the source.

SignalButton on the siteDo not
Ticket / offer URL presentBuy / Tickets (that URL)Wrap it in a generic “Learn more”
BIT offers emptyNotify Me (trigger=notify_me per BIT’s API CTA guidance) or your email formLast year’s Ticketmaster link
status=soldoutWaitlist / sold out labelHide the row so fans think the tour skipped their city
status=canceledRemove from upcoming or label canceledLeave EventScheduled JSON-LD
Venue TBACity + date + TBA; no BuyInvent a room “for the graphic”
Dice overlay enabledPurchase in the widget if that is the partner setupA second Buy that hits a different slug

BIT API CTA table I actually implement when we render rows:

API signalSite control
Ticket offer URLBuy
No offerNotify
Always optionalRSVP — only if you want BIT’s list
Artist followTrack — only if you want BIT’s list, not yours

Dice purchase overlay is a partner-widget option (“let fans buy tickets directly through the widget”). It is not a license to show Buy on rooms that are not on sale. If Dice is not the ticketer for a support slot, do not embed a Dice Buy for a bill you do not control.

Checklist before you ship CTAs:

  • Empty ticketUrl cannot render Buy
  • Sold-out flips in the source and on /tour without a designer
  • TBA has no ticket href
  • Canceled is gone from “Upcoming” or explicitly labeled
  • Social creatives pull city/date from the listing, not from a Figma frame that froze on Tuesday

What usually breaks first when teams try this?

The first break is almost never “Bandsintown went down.” It is identity, cache, or a second write surface.

SymptomFirst checkNot the first check
Site stale, vendor dashboard correctCDN / HTML cache / Webflow unpublished items“The API is down”
Widget blankArtist ID vs name; leftover v1 script + v3 scriptRedesign the Tour page
Wrong act’s roomsName matchNew CMS collection
Two rows for one nightTBA event left in place after the venue lockedA new n8n workflow
n8n “succeeded,” site unchangedStaged items never publishedRebuild the whole site
Sold-out on Instagram, Buy on the foldStatus not on the source; hard-coded URL in the componentA/B test the button color

Hard-code audit (run it on any artist site you inherit):

  • View source or the CMS. Are dates in a collection / widget, or in a rich-text block?
  • Change one listing upstream. Does /tour move without a designer?
  • Sold-out a room in BIT/Tourbox/Dice. Did the CTA change?
  • Is there an off-season empty state, or a 2024 date still labeled Upcoming?
  • Does the homepage cap at three from the same ID as /tour?

If any box fails, you do not have automatic tour dates. You have a brochure with a tour section.

Cost of the brochure, without fake percentages: support DMs, a canceled room that still looks on sale, a manager waiting on a designer during announce week, and Google/social previews that still show last Friday’s city. I have shipped hundreds of production sites. The tour module that survives is the one a tired manager can update from a phone.

Handoff is the slow failure. Intern created the BIT account on a personal Gmail. Label “has access.” Nobody can reset it in announce week.

SeatMay doMust not
Named owner (one human)Create, edit, cancel, change ticket URLsShare the password in a group chat
Backup (one human)Same, only if owner is offlineInvent a second artist profile
Designer / studioEmbed, style, cache, empty stateType dates into the design file
n8nCopy mapped fieldsInvent a show the vendor does not have

How does this affect conversion?

A live, honest date list with a working next action is table stakes. It is not a published ticket-conversion study. I will not invent a lift for this post. Measure on your domain.

The fold job is still identity first, then one listen / tour / contact path — cinema on the hero, ops on the dates. Automatic dates help conversion only by not lying and by not hiding the ticket path behind a designer bottleneck.

SignalHow to measureWhat it is not
Time-to-updateEdit upstream → hard-refresh /tour (minutes, not “sometime”)A vendor SLA you can quote without their docs
Ticket clickoutGA4 outbound click on ticketUrl / widget“X% more tickets sold”
Notify / waitlistForm completes on sold-out or TBA rowsA fake Buy that 200s
Empty-state capturesEmail confirms in the off-seasonA blank iframe you call “minimal”
Mismatch rateScreenshot vendor vs site once per announce weekA Lighthouse score

If you need a number for a deck, use your clickouts after the module is honest. Do not borrow a percentage from a widget vendor’s marketing page and stitch it to a client name.

Conversion also dies when the widget fights the brand so hard fans bounce before the row renders. That is a design constraint, not a reason to hard-code. Pull JSON. Keep the feed.

Announce-week measurement (no invented lifts):

  1. Monday: save one new date upstream. Hard-refresh /tour. Record minutes-to-appear.
  2. Tuesday: click the ticket CTA in a private window. Confirm it is this room’s URL.
  3. Wednesday: mark a room sold out upstream. Confirm Buy is gone on the site.
  4. Thursday: screenshot vendor vs site. File any extra row as an identity bug, not a “sync delay.”
  5. Friday: check the homepage still shows three, not the full run.

If step 1 is hours because HTML is cached, fix cache before you touch design. If step 3 fails, the CTA is hard-coded. That is the conversion bug. Button color is not.

What should I ask a designer about this?

If the designer cannot answer these in the kickoff, they are styling a brochure.

QuestionAcceptable answerWalk-away answer
Where does the date string live after launch?Widget, API, or CMS collection“In the hero”
Who changes a city without you?Named manager in BIT/Tourbox/Dice“We’ll hop on a call”
What is the empty state?Designed module + email“The widget handles it” (it will hole)
Homepage vs /tourLimit 3 vs full list, same IDTwo different paste jobs
Sold-out / TBA / no offerMapped buttonsOne Buy component
CacheMinutes in announce week“CDN default”
Identityid_ / Tourbox snippet / Dice partner filter in the repoArtist name as a string
SchemaOptional JSON-LD from the same feed, or noneHand-typed Event markup

Designer deliverables I actually sign:

  • Production artist IDs in the brand doc
  • Homepage module + /tour using the same reader
  • Empty, TBA, sold-out, canceled, on-sale states in the component
  • No date literals in Figma exports that ship to production
  • A 15-minute manager test in staging: add a fake date upstream, watch it appear, delete it

Cinema on the fold is a different job. Dates are ops wearing the type system.

When is a custom site worth it for this?

A custom (or heavily code-component) site is worth it for tour dates when the reader must match a film-grade system the iframe cannot, or when you need fields and URLs the widgets will not give you. It is not worth it so a designer can type cities faster. They will not.

Worth customNot worth custom
Row component that matches the world; API or CMS feedA $ template tour section you still paste into
Waitlist, VIP, or door-time fields widgets omitRecreating BIT’s default list in Webflow symbols by hand
Per-show URLs for Event schema you will maintainJSON-LD on a 40-date index page
Dice/BIT/Songkick identity already pinned, design is the remaining fightRebuilding the write surface as a Notion database
Static host that needs n8n → JSON + rebuildn8n because someone said “automation” in a sales call

If the manager will not open Bandsintown, Tourbox, or Dice, a custom site will not save you. They still need a write surface. Custom only changes how pretty the reader is.

Quiet local calendars (four basement shows, no Bandcamp/Spotify need) can be CMS-as-truth. Say that out loud. The moment platforms matter, the vendor listing is the write and the CMS is the reader — see the five-logins post.

What should I skip if I only have a week?

A week is enough to ship an honest reader. It is not enough to stand up n8n, Event rich results, and a waitlist product.

Do this:

  1. Name the write surface (BIT, Tourbox, or Dice) and the human who owns the login.
  2. Paste one official widget with pinned ID. Homepage display-limit 3; /tour full list; past dates off.
  3. Design the empty state.
  4. Point link-in-bio at /tour.
  5. Hard-refresh test: add a date upstream, confirm the site, remove it.

One-week calendar that actually ships:

DayDoDo not
MonName owner + write surface; claim the profileDebate n8n vs Make
TuePaste one official widget with pinned IDEmbed BIT and Songkick “just in case”
WedHomepage limit 3; /tour full; past dates offStyle the iframe until 2 a.m.
ThuEmpty state + bio link to /tourFooter tour list in Webflow rich text
FriUpstream add / sold-out / delete testEvent JSON-LD, Dice GraphQL, waitlist product

Skip until the widget is boring and correct:

  • n8n / Webflow Data API
  • Client-side BIT JSON (unless the iframe is already a brand fail)
  • Google Event rich results
  • Dual BIT + Songkick embeds
  • Dice GraphQL
  • A second “tour” section in the footer
  • Per-show marketing pages

When it is not worth doing yet: you have no named owner, no claimed vendor profile, and two people still updating Instagram first. Fix the write surface. Then install the reader. Automatic on a site that nobody updates upstream is a very pretty empty state.

FAQ

How do I get tour dates to show up on my website automatically?

Treat the site as a reader of one write surface. Embed the Bandsintown, Songkick Tourbox, or Dice widget that matches that surface, or pull the same feed into owned JSON / a CMS (n8n if the host needs a sync job). Do not type dates into the design file. Pin numeric IDs so the widget is yours.

How do I measure whether automatic tour dates on my website are working?

Time how long a source edit takes to appear on /tour after a hard refresh, and track outbound ticket or notify clicks on your domain. Screenshot the vendor dashboard against the site once per announce week. I will not invent a ticket-sales percentage; if the CTA still says Buy after you mark sold out upstream, the reader is broken.

What usually fails first when teams try this?

Identity, cache, or a second write surface. The widget matches the wrong artist, HTML is cached for a day, Webflow items stay staged, or someone types a parallel list in the CMS. Check artist ID, publish state, and “who is allowed to type a date” before you file a vendor outage.

How long does this take to show results?

A pinned official embed can be live the same day you claim the profile: paste, limit the homepage, design the empty state, test an upstream edit. n8n plus CMS publish is extra days because staged items and reconciliation are easy to get wrong. Spotify and Bandcamp have their own clocks; those are platform readers, not this module.

What should I skip if I only have a week?

Skip n8n, Event schema, and a second embed. Ship one official widget with pinned ID, homepage next-three, /tour as the full list, and an empty state. Point the bio link at /tour. Custom JSON waits until the iframe is the actual problem.

When is this not worth doing yet?

When nobody owns the vendor login and Instagram is still the write surface. Automatic display cannot fix a calendar that is not written down in one place. Claim the profile, name the owner, then install the reader. A custom tour UI on top of that chaos just fails in better type.

CTA

One write surface. The site reads it. No Designer in announce week.

Explore /websites or book a Website sprint at /contact?intent=websites-sprint.

FAQ

What questions does this article answer?

How do I get tour dates to show up on my website automatically?
Treat the site as a reader of one write surface. Embed the Bandsintown, Songkick Tourbox, or Dice widget that matches that surface, or pull the same feed into owned JSON / a CMS (n8n if the host needs a sync job). Do not type dates into the design file. Pin numeric IDs so the widget is yours.
How do I measure whether automatic tour dates on my website are working?
Time how long a source edit takes to appear on `/tour` after a hard refresh, and track outbound ticket or notify clicks on your domain. Screenshot the vendor dashboard against the site once per announce week. I will not invent a ticket-sales percentage; if the CTA still says Buy after you mark sold out upstream, the reader is broken.
What usually fails first when teams try this?
Identity, cache, or a second write surface. The widget matches the wrong artist, HTML is cached for a day, Webflow items stay staged, or someone types a parallel list in the CMS. Check artist ID, publish state, and “who is allowed to type a date” before you file a vendor outage.
How long does this take to show results?
A pinned official embed can be live the same day you claim the profile: paste, limit the homepage, design the empty state, test an upstream edit. n8n plus CMS publish is extra days because staged items and reconciliation are easy to get wrong. Spotify and Bandcamp have their own clocks; those are platform readers, not this module.
What should I skip if I only have a week?
Skip n8n, Event schema, and a second embed. Ship one official widget with pinned ID, homepage next-three, `/tour` as the full list, and an empty state. Point the bio link at `/tour`. Custom JSON waits until the iframe is the actual problem.
When is this not worth doing yet?
When nobody owns the vendor login and Instagram is still the write surface. Automatic display cannot fix a calendar that is not written down in one place. Claim the profile, name the owner, then install the reader. A custom tour UI on top of that chaos just fails in better type.
Sources

Last reviewed

More from this lane

Websites

All →
Build the house