Documentation

Landfall documentation

Everything you need to install Landfall, get an accurate delivery date onto your storefront, and tune it for your business — every app page, every storefront block, every setting, with step-by-step instructions and worked examples.

Table of contents

What Landfall does

Landfall shows your shoppers an accurate “Arrives by” delivery date — one that is learned from your store’s own delivery history rather than typed in by hand, and then graded against the carrier’s real delivery scan so you always know whether the dates you show actually hold up.

Most delivery-date apps ask you to enter lead times and hope they’re right. Landfall reads your last 60 days of fulfilments, models every shipping lane, and keeps the numbers current on its own. You can still override anything you want — but you don’t have to configure a thing for it to work.

Landfall delivery date shown on a Shopify product page
The core outcome: a clear, honest “Arrives by” date on the product page.
↑ Back to top

Key features

A quick map of everything the app does. Each links to its full section below.

Learned lead timesProcessing + transit modelled per destination and carrier from your real orders — no manual tables.
Accuracy gradingEvery promise is checked against the carrier’s delivery scan, so accuracy is measured, not claimed.
Slippage alertsGet told when a lane starts running slower than its history, before shoppers feel it.
Storefront blocksProduct, cart, collection, ZIP checker, cutoff countdown and pickup — all no-code theme blocks.
Override rulesMatch by product, collection, tag, vendor, SKU, variant or destination zone.
Cutoff, holidays, restockDispatch cutoff countdown, week-offs and holidays, and out-of-stock restock ETAs.
Pickup & warehouses“Ready for pickup” dates and multi-location origin routing by country.
57 languagesLabels and dates auto-translate to the shopper’s storefront locale, with per-locale overrides.
Privacy-safe analyticsRevenue influenced, engagement and accuracy — aggregate counts only, no shopper tracking.
Custom messages & CSSMessage templates with date placeholders, date formats, and your own CSS.
ExclusionsHide the date on chosen products or by tag, for digital goods and made-to-order lines.
↑ Back to top

How the engine works

Understanding this makes every other setting make sense.

1. It reads your history

On install (and continuously afterwards) Landfall reads your fulfilments from the last 60 days. For each shipment it derives two numbers:

  • Processing time — order placed → carrier’s first scan (how long you take to dispatch).
  • Transit time — carrier’s first scan → delivered (how long the carrier takes).

These are modelled per destination zone (country, and US states where volume allows) and per carrier. That pairing is what we call a lane.

2. It picks an honest number

For each lane Landfall computes percentiles rather than an average, because averages hide the tail that actually causes complaints:

PercentileUsed forMinimum deliveries required
p50“Typical” — the optimistic end of a range8
p80The promise — the date shown to shoppers20
p95“Worst case” — shown to you in Analytics60

Honest sample floors. If a lane hasn’t reached the minimum number of deliveries, Landfall shows a dash (—) instead of a number, and the storefront widget stays hidden for that lane. It would rather say nothing than say something it can’t stand behind. Thin lanes fill in as you ship more.

3. It shows the date server-side

The date is rendered in Liquid, server-side, from a single published metafield. There is no JavaScript fetch, so there’s no layout shift, no flash of missing content, and no browser-locale date bugs.

4. It grades itself

Every date shown is recorded as a promise. When the carrier reports the delivery, Landfall compares the promise to what actually happened and marks it kept or missed. That’s what powers the accuracy numbers on Home and Analytics — and the alerts when a lane degrades.

Accuracy dashboard grading delivery dates against carrier scans
Promise accuracy, graded against the carrier’s own delivery scan, broken out per destination.
↑ Back to top

Quick start

Four steps, about five minutes. The Home page tracks your progress through exactly these.

  1. Install the app. Add Landfall from the Shopify App Store. On first open it analyses your last 60 days of deliveries automatically — nothing to configure.
  2. Turn on the app embed. In Shopify admin go to Online Store → Themes → Customize → App embeds, and enable Landfall. This lets the blocks render on your storefront.
  3. Add the delivery-date block. Still in the theme editor, open your Product template, choose Add block in the product-information section, and pick Delivery date. Drag it just under the price or the add-to-cart button. Save.
  4. Check your storefront. Open any product page. You should see the learned “Arrives by” (or “Arrives between”) date. That’s it — you’re live.

Tip. Landfall’s Home page has one-click links straight into the theme editor for steps 2 and 3, so you don’t have to hunt for them.

↑ Back to top

Verify it’s live

Three signals confirm a healthy install:

  • Home checklist reads 4 / 4. The “Show the date on your storefront” step ticks automatically once a real shopper has seen the widget.
  • Storefront status shows “Publishing”. On Home, the App-embed card flips from “Not detected” to “Publishing”.
  • Analytics starts counting. Widget views appear under Storefront engagement within a few minutes of real traffic.

Seeing no date on a product? That is usually correct behaviour, not a bug — see Troubleshooting. The most common causes are a thin lane (below the sample floor), an excluded product, or an out-of-stock item with no restock basis.

↑ Back to top

Home

Your control room: setup progress, delivery health at a glance, and alerts.

Hero & plan

The header shows your current plan and a setup progress ring (e.g. 4/4). If you’re on anything below Premium there’s an Upgrade button that takes you to Shopify’s hosted plan picker.

The four headline metrics

MetricWhat it meansWhat good looks like
Delivery promises keptShare of graded promises delivered on or before the date shown.85%+ — below 80% means your promise is too optimistic.
Shipments with carrier dataHow much of your volume has a usable carrier delivery scan.90%+ — low coverage means fewer lanes can be modelled.
Orders analysedFulfilments read in the rolling 60-day window.More is better; thin stores will see dashes on some lanes.
Parcels in flightPromises made but not yet delivered — grading pending.Informational; it rises and falls with your shipping volume.

Alerts

Landfall raises two kinds of alert, each dismissible:

  • Accuracy drop — a destination is keeping noticeably fewer of its promises (e.g. “GB is keeping only 43% of its promises across 14 orders”). Worth checking that carrier.
  • Transit slip — a lane’s transit time has moved (e.g. “DE slipped from 6d to 10d”). Landfall has already widened the date; the alert just tells you why.

Setup checklist & live preview

The four-step checklist mirrors Quick start and reflects your real status — it is not a static list. Beside it, Live storefront preview renders exactly what a shopper sees on a product page with your current settings.

Resources

Shortcuts to this documentation, the changelog, developer support and direct contact.

↑ Back to top

Analytics

Real numbers only — engagement comes from an aggregate, no-PII pixel; revenue comes from recorded orders; accuracy comes from your deliveries. Empty means genuinely zero, never a placeholder.

Landfall analytics dashboard showing revenue, orders and engagement
Business impact and storefront engagement, filterable by date range with period comparison.

Date range & comparison

  1. Pick a preset — 7, 30 or 60 days — or choose a custom From/To.
  2. Optionally set Compare to: previous period, same days last month, or same days last year.
  3. Press Apply. Every metric card then shows a ▲/▼ percentage delta versus that comparison window.

The sections

SectionContainsUse it to…
Business impactRevenue influenced, orders with a delivery date, promises kept in rangeShow the commercial value of the badge
Storefront engagementWidget views, hovers, clicks, click-through rate, add-to-cart rate, engagement rateSee whether shoppers actually notice the date
Views by deviceDesktop vs mobile splitDecide where to optimise placement
Promise accuracyPromises kept, graded, parcels in flight, average days late when missedJudge whether your promise is calibrated
Coverage & reachCarrier-data coverage, orders analysed, kept count, active/total rulesDiagnose thin data
Top productsMost-delivered products by volumeSee where accuracy matters most
Customers by countryOrder share per destinationPrioritise which lanes to fix
Transit by laneDestination, deliveries, typical, promise, worst caseUnderstand the numbers behind each date
CarriersShipments and delivery-data coverage per carrierSpot a carrier that reports poorly

Every card has a tooltip. Hover the small ⓘ icon for a plain-English explanation of what the metric is and how it’s calculated.

↑ Back to top

Rules optional

The engine works with zero rules. Add one only to override the learned result for a specific case — pad a slow lane, flag a made-to-order item, or hide the date for a set of products.

Override rules table matching by product, tag, vendor and zone
Rules are evaluated in priority order; the first match wins.

How matching works

Rules are sorted by priority (lower number runs first). The first matching, enabled rule wins for a given variant — later rules are ignored. A rule matches when both the scope and the destination zone match.

Fields

FieldPurposeExample
NameYour own label, shown in the tableMade-to-order gift sets
Match typeAll, product, collection, tag, vendor, SKU or varianttag
Match valueThe tag/vendor/SKU text, or the product/collection/variant IDgift-set
Destination zoneLimit to one country/zone, or * for allDE
Override processing daysReplaces the learned processing time5
Override transit daysReplaces the learned transit time10
Custom messageReplaces the whole line. Supports [min_date], [max_date], [date]Handmade to order — arrives by [max_date]
Hide the delivery dateSuppresses the widget entirely for matches
PriorityLower runs first10

Add a rule

  1. Open Rules in the app’s left navigation.
  2. Fill in the Add a rule form — name, match type and value at minimum.
  3. Set the effect: processing days, transit days, a custom message, or “hide”.
  4. Give it a priority if order matters, then press Add rule.
  5. The rule publishes to your storefront immediately — refresh a matching product to confirm.

Rule limits apply per plan (Free 3, Startup 15, Growth 50, Premium unlimited). The page shows usage as “X of Y used”. Deleting always works, even when you’re over the cap.

↑ Back to top

Exclude products

Hide the delivery date on products where a date makes no sense.

Typical cases: digital downloads, gift cards, pre-orders with an unknown date, or services.

  1. Open Exclude products.
  2. Press Add products — Shopify’s product picker opens.
  3. Select the products to hide, then confirm.
  4. They appear in the Hidden products list; the widget stops rendering for them right away.

Prefer tags for bulk. Excluding by product is per-item. To hide a whole class of products, set an exclude tag in Settings → Hide the widget and tag the products — it scales better and doesn’t count against your rule cap.

↑ Back to top

Settings

Everything about how and where your dates appear. The right-hand column shows app status, a live preview, and a sticky Save button.

Landfall settings with live preview of the delivery date widget
Settings with a live preview — what you configure is what shoppers see.

Dispatch cutoff

Orders placed before this time (your store’s local time, HH:MM) are treated as dispatching the same business day. This powers the countdown in the Order-by cutoff block and shifts the computed date.

Example: set 14:00 if you hand parcels to the carrier at 2pm.

Week-offs & holidays

Dates when your warehouse is closed. Transit still reflects the carrier’s real behaviour — this only affects your side. Enter dates one per line, e.g. 2026-12-25.

Hide the widget

Products carrying any of these tags never show a date. One tag per line — a bulk alternative to Exclude products.

Out-of-stock restock lead

For a sold-out variant, Landfall uses Shopify’s own incoming inventory date if you’ve set one; otherwise it falls back to this number of days. Leave it blank to hide the date entirely when an item is out of stock — often the most honest choice.

Store pickup

Enable to show a “Ready for pickup” date. Configure the ready-in business days, the label wording, and your location name. Pair it with the Pickup ready date block.

Warehouses (origin routing)

If you ship from more than one location, list them as Name | countries | processing days, one per line. Landfall picks the warehouse serving the shopper’s country and applies its handling time; a line with no countries becomes the default.

Singapore DC | SG,MY,ID | 1 US East | US,CA | 2 Global | | 3

Language labels

Auto-translation is on by default in 57 languages — see Multi-language. Add a line here only to override the wording for a specific locale:

fr = Arrive le | Arrive entre le de = Ankunft bis | Ankunft zwischen

Custom CSS

Restyle the widget to match your theme. Injected wherever the date renders. Target .landfall-eta and its parts.

.landfall-eta { font-weight:600; color:#0a7d3b; } .landfall-eta__icon { opacity:.5; }

Where your date appears

A reference table mapping each surface to the block that powers it, with links into the theme editor.

↑ Back to top

Plans

Compare tiers, see what you’re on, and upgrade or downgrade at any time.

The page shows the guarantee banner (30-day refund, direct founder support, no commission on your orders), four tier cards with the current plan badged, a full compare-plans matrix, and an FAQ. Upgrading hands off to Shopify’s hosted plan picker — billing is handled entirely by Shopify.

↑ Back to top

Guide

A condensed version of this documentation inside the app, plus the changelog.

Covers how Landfall works, getting started, the storefront surfaces table, an FAQ, and a per-version changelog so you can see exactly what shipped and when.

↑ Back to top

Storefront surfaces

Every surface is a standard Shopify theme app block — added in the theme editor, no code, removable at any time. All of them render server-side.

Delivery dates across product, collection and cart pages
One consistent date across the whole buying journey.

Product page — “Delivery date”

The core block, and the one to add first.

  1. Theme editor → Product template → Add blockDelivery date.
  2. Position it under the price or above add-to-cart.
  3. Configure the block settings below, then Save.
SettingWhat it does
DisplayDate range (“Arrives between X and Y”, from p50→p80) or Single date (“Arrives by Y”).
Labels & joining wordLeave blank to auto-translate; type a value to force wording everywhere.
Date formatJul 24, 2026 · Jul 24 · Fri, Jul 24 · 7/24/2026
Custom messageOverrides the labels. Use [min_date], [max_date], [date].
Out-of-stock prefixShown before the date on sold-out items, e.g. “Back in stock, then arrives by”.
Show shipping originNames the warehouse serving the shopper (needs Warehouses configured).
Show clock iconToggles the small icon.
Anonymous widget analyticsOn by default. Powers the engagement metrics; turn off to disable entirely.
Reserved heightReserves vertical space to keep layout perfectly stable.

Expected outcome: “Arrives between Jul 22 and Jul 24” on every product with a modelled lane.

↑ Back to top

Cart — “Cart delivery date”

A whole-cart promise. Because an order arrives when its slowest item does, this block takes the maximum across all line items rather than showing a per-item date that would contradict itself.

Add it: theme editor → Cart template → Add blockCart delivery date.

Expected outcome: “Everything arrives by Fri, Jul 26”.

↑ Back to top

Collection — “Collection delivery”

A single honest banner for the visitor’s country on collection pages. A collection holds many products with different processing times, so Landfall shows a range based on your shop-wide processing default plus that country’s transit lane, rather than pretending to know an exact per-card date.

Options: label wording, clock icon, alignment and vertical padding.

↑ Back to top

Delivery checker

An interactive block letting shoppers confirm the delivery window for their own location before they buy — it removes the “will it get here in time?” doubt at the moment it decides the sale.

ZIP and country delivery checker on a product page
Shoppers check their own delivery window without leaving the product page.

Add it: theme editor → Product template → Add blockDelivery checker. Configure an honest message for destinations you don’t serve.

↑ Back to top

Order-by cutoff

A same-day-dispatch countdown (“Order within 4h 12m for dispatch today”). It is driven by the Dispatch cutoff setting and is honest by design — once the cutoff passes it simply shows the next dispatch day rather than resetting a fake timer.

Set the cutoff first. Without a cutoff time in Settings the block has nothing to count down to.

↑ Back to top

Store pickup — “Pickup ready date”

Shows when an order will be ready to collect. Uses processing time only (no transit), so local shoppers get a realistic “Ready for pickup” date instead of a shipping estimate.

Ready for pickup dates across store locations
Ready-for-pickup dates per location, powered by your real processing time.

Requires: pickup enabled in Settings → Store pickup.

↑ Back to top

Multi-language

Global-ready with zero setup. Labels and dates adapt to each shopper’s storefront locale in 57 languages.

Delivery dates localized in multiple languages worldwide
Each shopper sees the date in their own language and local date format.

How it resolves

  1. Landfall reads the shopper’s active storefront locale.
  2. If you left the block label blank, it uses the built-in translation for that language.
  3. If you typed a label in the block, that wording is used everywhere.
  4. If you added a per-locale override in Settings, that always wins for that locale.

Dates themselves are localised by Shopify’s own date handling, so month and weekday names translate too — and because it’s server-side, there are no browser-locale date bugs.

Covered languages include French, German, Spanish, Italian, Portuguese (PT & BR), Dutch, Swedish, Danish, Norwegian, Finnish, Icelandic, Polish, Czech, Slovak, Slovenian, Croatian, Bosnian, Serbian, Hungarian, Romanian, Bulgarian, Greek, Turkish, Russian, Ukrainian, Lithuanian, Latvian, Estonian, Catalan, Galician, Japanese, Chinese (Simplified & Traditional), Korean, Thai, Vietnamese, Indonesian, Malay, Filipino, Hindi, Bengali, Tamil, Telugu, Marathi, Gujarati, Kannada, Malayalam, Punjabi, Urdu, Arabic, Hebrew, Persian, Swahili and Afrikaans.

↑ Back to top

Messages & styling

Message placeholders

Custom messages (per block or per rule) support three placeholders:

PlaceholderResolves to
[date]The promise date (same as [max_date])
[min_date]The optimistic end of the range (p50)
[max_date]The promise end of the range (p80)
Order today, get it by [max_date] Arrives between [min_date] and [max_date] Free delivery — on your doorstep by [max_date]

Styling

Use Settings → Custom CSS for global styling. The widget inherits your theme’s font and colour by default, so in most themes it already looks native.

↑ Back to top

Configuration recipes

Worked examples for common situations.

Made-to-order line

Goal: a handmade range takes 5 days to build before it ships.

  • Rule → match tag = made-to-order, zone *
  • Override processing days = 5
  • Custom message = Handmade to order — arrives by [max_date]

Outcome: those products show a later, clearly-explained date; everything else is untouched.

A carrier is running slow into one country

Goal: pad Germany while a backlog clears.

  • Rule → match all, zone DE, override transit days = 10, priority 30

Outcome: German shoppers see a safer date. Remove the rule when the alert clears and the learned lane recovers on its own.

Hide dates on digital products

  • Settings → Hide the widget → add tag digital, then tag those products.

Outcome: no date on downloads or gift cards, and no rule-cap usage.

Two warehouses, different handling

  • Settings → Warehouses:
    US East | US,CA | 2
    Global | | 3
  • Product block → enable Show shipping origin

Outcome: US/Canada shoppers get the US lane and see “Ships from US East”; everyone else falls back to Global.

Same-day dispatch urgency

  • Settings → Dispatch cutoff = 14:00
  • Add the Order-by cutoff block above add-to-cart

Outcome: a live countdown to same-day dispatch that never lies once the cutoff passes.

↑ Back to top

Best practices

  • Start with zero rules. Let the engine learn for a week before overriding anything — most “problems” resolve themselves as lanes fill in.
  • Prefer a range over a single date when your transit is variable. It sets a realistic expectation and keeps your kept-rate high.
  • Put the date near the buying decision — directly under the price or above add-to-cart converts better than in a tab or the footer.
  • Watch “promises kept”, not just the date. If it drops below ~80%, your promise is too optimistic — pad the lane or switch to a range.
  • Use tags, not per-product rules, for anything that applies to more than a couple of items.
  • Leave the restock lead blank unless you genuinely know when stock lands. A hidden date beats a wrong one.
  • Set your cutoff honestly. A cutoff you don’t actually hit will quietly wreck your accuracy.
  • Re-check after peak. Carrier behaviour shifts in Q4; the engine adapts, but it’s worth reviewing alerts weekly.
↑ Back to top

Plans & limits

Every plan includes the learned dates, accuracy grading and all storefront blocks. The tiers differ on override-rule capacity.

PlanOverride rulesEverything else
Free3Learned dates, grading, all blocks, analytics, 57 languages
Startup15As above
Growth50As above
PremiumUnlimitedAs above

Paid tiers include a 30-day free trial, and there is never a commission on your orders. Billing is handled by Shopify; change or cancel any time from the Plans page. Current prices are on the pricing section of our site and on the App Store listing.

↑ Back to top

Troubleshooting

No date is showing on a product

Work through these in order:

  • Thin lane. That destination hasn’t reached the sample floor yet (20 deliveries for the promise). Landfall deliberately shows nothing rather than guessing. Check Analytics → Transit by lane for a dash.
  • Out of stock. With no incoming-inventory date and no restock lead set, the widget hides by design.
  • Excluded. Check Exclude products and your Settings exclude tags.
  • A rule is hiding it. Check Rules for a matching “hide” rule.
  • Block not added. Confirm the app embed is on and the Delivery date block is in the product template.
The date looks too optimistic or too late

Check Analytics → Promise accuracy. If “promises kept” is high but the date feels late, switch the block to a range so the optimistic end shows too. If kept-rate is low, the promise is too tight — add a rule padding transit for that zone until the engine catches up.

Engagement metrics are all zero

The anonymous analytics beacon is a block setting. Confirm Send anonymous widget analytics is enabled on the Delivery date block, and that the widget is actually rendering on a page real shoppers visit. Numbers appear within a few minutes of live traffic.

Top products shows generic names

Product titles are resolved live from the Admin API. If a product has since been deleted, it falls back to a generic label. Live stores with existing products show real titles.

My translated label isn’t appearing

If you typed a label into the block settings, that wording is forced for every language. Clear the block label to let auto-translation resume, or add a per-locale override in Settings.

Changes aren’t showing on the storefront

Settings and rules publish on save. Refresh the product page (and clear any full-page cache your theme or CDN applies). The Live preview in Settings always reflects the current configuration.

↑ Back to top

Privacy & data

  • No shopper tracking. The optional analytics beacon records aggregate counts only (views, hovers, clicks, add-to-cart) by day and device type. No personal data, no cookies, no cross-site identifiers, no profiles.
  • No customer PII is stored. Landfall models shipping lanes from fulfilment timings and destination zones, not from people.
  • Encrypted at rest and in transit. HTTPS everywhere; the app database sits on an encrypted volume.
  • Opt out entirely by turning off Send anonymous widget analytics on the block.

Full details in our Privacy Policy and Refund Policy.

↑ Back to top

Support

Real help from the people who built it — never a ticket queue. Most questions get answered within a few hours.

↑ Back to top