docs
/
Courses — Appmint

Appmint Shipping: delivery offers, carriers and fulfilment

Written guide

Overview

Configure what the buyer can choose at checkout, connect the carrier integration and fulfil the selected order with a tracked shipment.

01. Delivery offer and dispatch origin

Why this matters

A delivery price shown to a buyer is not a purchased carrier label. The origin and parcel information must be usable for the later shipment.

Follow these steps

Open Storefront → Shipping → Settings → Shipping Methods → Add Method. Enter Name, Title, Currency, Active and the intended Use as the site default choice. In the current dedicated form, Ship from provides address fields directly: Warehouse name, Street, City, State, Postcode, country and Phone. It does not show a location/manual-address mode selector. Enter the actual complete dispatch address. Inspect product Weight, Length, Width, Height and packaging. Save and reopen both configuration and product.

Check the result

Do not substitute a warehouse label for a complete dispatch address. Keep weight/dimension units consistent with the selected rule/provider.

Shipping Settings keeps Shipping Methods, Providers and Product Shipping separate. The saved default method does not imply a connected carrier: this capture shows zero active integrations.

Shipping Settings keeps Shipping Methods, Providers and Product Shipping separate. The saved default method does not imply a connected carrier: this capture shows zero active integrations. Inspected historical screenshot; recapture current layout before final video.

02. Build eligible delivery options

Why this matters

An option combines where it applies with how its price is calculated. A more specific destination/class rule can change the choice.

Follow these steps

In Shipping Options add a customer-facing Label and Status. Set countries, states and postcodes; postcode rules allow exact values, prefixes such as 750*, and ranges. Set shipping classes and weight units/ranges where needed. Choose free, flat, weight, carrier or pickup. For flat enter rate and per-item choice; set free-over threshold when used. For weight enter tiers. For pickup configure the collection option. Inspect priority for equally specific options. Save and reopen.

Check the result

Empty geography means broad coverage; empty shipping classes represents ordinary goods in the schema. Test both a covered and excluded destination instead of promising worldwide shipping.

Save a controlled method and verify its fields

  1. Open Settings → Shipping Methods → Add Method. Enter a unique internal Name and a recognizable Title. Our isolated example is course-shipping-1004 / Course US Standard, currency USD. Leave Active off and Use as the site default off while preparing a rehearsal that must not change existing checkout.
  2. Choose Add a shipping option. In Name — What the customer sees, enter US standard delivery. Choose Flat fee under How it is priced, enter Amount 5, and leave Charge per item off for a per-order fee. Under Offered when → Countries, enter US. Empty countries would mean anywhere, so do not leave it blank by accident.

Actual flat-fee option, customer label and country condition

  1. Under Ship from, enter the actual dispatch address. The screenshot contains an explicitly fictitious course address and must not be copied for a real carrier request. Keep Fees and markup unchanged unless the handling policy requires them; a handling fee can change the total even when the option itself is flat.

The current form exposes the dispatch address and separate handling/markup controls

  1. Choose Create configuration once. The method list now displays Course US Standard, $5.00 · US. Reload, choose its Edit, and inspect the same option and identity.

Saved method after reload

Readback keeps the rehearsal inactive and non-default

  1. Turn on Active only for a method you intend to offer, and choose the default deliberately after checking product overrides and existing methods. This local rehearsal remained inactive/non-default; it does not prove a customer was quoted five dollars. The later checkout chapter must test the selected method with an eligible and an excluded destination.

Important distinction: The card can display a saved rate even while its configuration is inactive. Reopen Edit to check Active/default rather than treating a price card as proof it is live.

03. Connect EasyPost or another implemented provider

Why this matters

The carrier integration supplies live rates and labels; the shipping option chooses when to use it.

Follow these steps

Open Configuration → Integration Config → Integration Builder. The current builder places EasyPostProvider under API (not a Shipping category); its card carries Shipping and Logistics use-case tags. Find that named card using the provider search or the All/API list and select it. For EasyPost enter a recognizable Name and the API key from the provider account, using its test environment for the controlled rehearsal. Save, use the offered Test and reopen the configuration. In the shipping carrier option select the saved integration and allowed services. Shippo is another implemented provider. Its schema requires API Token and exposes Test Mode, defaulting off. Set the intended test mode and token, save, test and reopen that record separately rather than pasting an EasyPost key into it.

Actual EasyPost form: Integration type, inactive status and Api Key field

Current Appmint Studio capture, 4 October 2026. The draft is blank and unsaved; this is not evidence of an active EasyPost connection.

Reach provider setup from Shipping

Settings → Providers shows provider cards and their Configure actions. The local screen reports 0 of 6 configured. EasyPost, Shippo, ShipEngine, StampsCom, FedEx and UPS appear as setup choices; the listing alone is not a working rate or label result.

Providers view captured while setup is still loading

This image was captured before the provider list settled: it shows “Checking setup” and 0 of 0, not the later observed 0 of 6. Do not use this loading frame as proof of the final provider list or tracking readiness.

The automatic tracking panel separately reports Not checked for a shared EasyPost configuration. It explicitly says the agreement, balance and tracking subscription have not been checked here. Do not translate that into “tracking is enabled”; complete and verify the relevant shared-account setup before claiming it works.

Keep the provider connection separate from the delivery offer

These are two records with different jobs. Integration Config supplies credentials for the carrier API. A Shipping Method defines what the buyer may choose, its eligible destinations and its pricing policy. Saving an EasyPost integration does not, by itself, create a customer-facing delivery choice.

For the current EasyPost provider schema, the credential field is API Key (apiKey). There is no separate EasyPost test/live switch in this schema: use the key from the intended provider environment. The provider help identifies its API Keys page and distinguishes Test from Production keys. Never infer environment from your configuration's name.

The current EasyPost Test operation lists up to ten shipments. It does not purchase a label or prove that a specific parcel/address can obtain a rate. Verify these as separate outcomes: saved provider configuration → successful connection response → eligible checkout delivery choice → parcel-specific rate → deliberately purchased test label. A label purchase and a carrier collection are also different events.

Source checked 4 October 2026; no carrier request or label purchase was made in this enrichment pass.

Check the result

Mask credentials in capture. A saved or tested key is not a purchased label. EasyPost’s provider help distinguishes test and production keys; do not mix the environments. Carrier availability depends on the configured account.

04. Verify the customer choice

Why this matters

The address, product override and selected service determine the delivered total.

Follow these steps

Open the customer product and cart. Enter the intended shipping address and inspect eligible options, service labels, prices and total. Select one option and verify it remains selected through checkout. Compare a second destination and a product with Shipping Config/Flat Rate override or exclusions.

Check the result

Failed quotes must show their error or unavailable state. Do not quietly present a flat fee as proof that live carrier rates worked.

05. Create the linked shipment

Why this matters

The shipment wizard connects a saved order to addresses, packages and a selected rate.

Follow these steps

Open Shipping → Create and search/select the intended order. Inspect From and To, including recipient and contact. Add Package and enter length, width, height and weight. Choose Get Rates, wait for Select Shipping Rate and select the intended service. Choose Create Shipment once. Inspect Shipment Created, order number, carrier, tracking and label. Use Download Label or Print Label, then reopen Shipments and the original order.

Check the result

Creating a live label may incur provider cost; use the authorized test environment for recording. After an unclear response inspect existing shipments before repeating Create Shipment.

06. Tracking and corrections

Why this matters

A created label, dispatched parcel and delivered parcel are different stages.

Follow these steps

Use Track Package and inspect shipment status and the matching order/customer view. For an incorrect address or parcel stop before purchasing a replacement and inspect the existing shipment’s available cancel/refund/correction action. Record the provider result and new reference separately if a replacement is required.

Check the result

Unsupported carrier correction paths must be shown as limitations rather than invented buttons.

Detailed instructions

The following retained material documents earlier local work. Its pending checks remain pending; historical successful outcomes are not claims of a fresh execution. Use the source-authored instructions above to prepare the new recording, and preserve these references for comparison.

E09: Charge for delivery deliberately

Worked example

A customer needs the delivered price, so Cedar uses one five-dollar fee per order. Open Shipping, Settings and Add Method. Name it course-flat-shipping and title it Course standard delivery. Keep USD and Active, and select Use as the site default. Add a shipping option named Standard delivery. Choose Flat fee, enter five and leave Charge per item unchecked. That charges five for the order, not five for every print. Create configuration. Reload Shipping Methods and check the saved default before testing the customer cart.

Included controls: Settings Overview, Shipping Methods, Add Method, configuration identity, currency, Active, default, Flat fee, Charge per item, save readback.

Check the result: Default course-flat-shipping; actual shopper shipping5 later confirms per-order meaning.

Retained evidence: capture/SF06-shipping.webm, capture/SF21-variants-and-providers-readback.webm.

Implementation reference: shipping-config-form.tsx, shipping-options-editor.tsx.

Next-batch matching evidence: SF06-shipping.webm.

E10: Offer delivery only where it works

Learner draft — pending demonstration:

A flat price is useful only where the shop can deliver. In Offered when, destinations and ranges decide whether an option is available. Our rehearsal normally leaves geographic limits blank. Test any restriction with both an included and excluded address before relying on it: the retained local comparison allowed an excluded Ohio address to continue with zero shipping. That is historical failure evidence, not a new check of the installed build; repeat the included/excluded-address comparison before relying on the boundary. Tax needs its own calculation check. Product Taxable is only one input. AppEngine reads configured jurisdiction tax records; the location flat rate is a fallback when no destination is supplied. A shipping address does not create a tax rule, and setting Taxable does not prove a nonzero tax result.

Included controls: Offered when, country/state/postcode, product class, weight range, quantity range, order-total range, tax prerequisite.

Limitations and checks: Capture Offered when controls and precise boundary wording, add controlled geographic/range test, show included/excluded cart. Inspect real tax configuration entry, record nonzero-tax calculation and rounding without inventing tax policy.

Check the result: Matched destination offered, excluded destination not offered, exact subtotal/shipping/tax breakdown.

Implementation reference: shipping-options-editor.tsx, tax.service.ts.

A14: Prepare and track a shipment

Learner draft — pending demonstration:

The five-dollar delivery offer priced the purchase. Now Shipping manages the parcel. Start from the matching order, confirm the ship-from location and packed measurements, then use the supported shipment method. If a connected carrier provides a quote or label, compare it with the intended parcel before purchase. Follow the shipment's tracking and history separately from the order's payment state.

Included controls: Dashboard, Shipments, Create Shipment, ship from, packaging, weight/dimensions, provider quote, label, tracking, manual status.

Limitations and checks: Actual Create Shipment fields/navigation→supported shipment, provider test quote/label if available, tracking and manual state. Resolve/log automatic tracking404 with retest; do not assert status equals physical delivery.

Check the result: Order/address/parcel/label or manual-shipment reference agree; tracking source/states explained.

Implementation reference: shipping-create.tsx, shipping-tracker.tsx, shipping-auto-tracking.tsx.

A15: Give one product different shipping needs

Worked example

A product exception should change the delivery rule for a reason. Open Shipping, Settings and Product Shipping. Cedar Botanical Print currently says Default. Use that row’s gear to open its controls. Shipping Method offers Use site default, Free Shipping and Custom Flat Rate. Shipping Configuration can stay Default configuration or select course-flat-shipping; Ships From Location identifies the origin. We keep the print’s current default and cancel without saving. This is where you inspect an exception; it is not proof that an override changed the customer quote. Shipping Methods separately shows Course standard delivery, a five-dollar flat rate. Providers lists six choices, including EasyPost, and currently zero configured integrations. EasyPost Configure opens an Inactive API-key form with Test Connection; we cancel it too. A flat delivery quote is separate from purchasing a carrier label or enabling tracking. The retained automatic-tracking attempt returned HTTP 404. Its current resolution has not been verified by this capture, so repeat the operation on the installed build before claiming tracking is enabled.

Included controls: Product Shipping, Ships As, product config override, weight/unit/dimensions, boxes, free/flat override, origin, signature, hazmat, fragile, country/state exclusions, currency.

Verified scope / remaining work: Actual settings tabs, product gear choices and EasyPost blank form inspected/cancelled. Override save/quote, dimensions/packaging, origin availability, provider/label/tracking outcome pending.

Check the result: Override selected over default where supported; actual shipping result not just field readback.

Implementation reference: product-shipping-settings.tsx, product-form.tsx.

Actual evidence: SF43-shipping-settings.webm, SF44-shipping-forms.webm.

T13: Choose a different delivery model

Learner draft — pending demonstration:

Flat delivery suited our first print. Free, weight-based, carrier-priced and pickup choices answer different delivery promises. Compare only the settings that change the customer's offer: where it is available, how it is charged and what fulfilment must do. Carrier pricing needs a connected provider, a ship-from address and appropriate measurements. Choose the route you can actually operate, then check an eligible and ineligible basket.

Included controls: free, weight-based, carrier-based, pickup, per-item versus per-order, Shipping Providers, EasyPost/Shippo/ShipEngine/StampsCom/FedEx/UPS, quote prerequisites.

Limitations and checks: Each actual shipping pricing mode/condition, per-item versus per-order quantity comparison, pickup meaning, provider-specific exposed setup and sandbox quote/label prerequisites; precise available/error/unsupported boundary for each exposed carrier.

Check the result: All materially different rate/fulfilment alternatives actualbuyerchoice and result; no labelbuy implied by rate.

Implementation reference: shipping-options-editor.tsx, shipping-integrations.tsx.

Limitations and checks

Current UI entry and editor: . Corresponding SDK storefront schemas and the retained AppEngine references define fields and consumer boundaries. Provider calls, external delivery, payments and financial mutations were not performed for this writing task.

Next steps

You can now follow the module from its configuration to the record that proves the result. Use the relevant chapter to revisit an alternative or troubleshoot the exact failed handoff.

BusinessMade Shipping — supporting guide

Introduction and outcome

Spoken: “Welcome to BusinessMade Shipping. We will connect a shipping provider, configure the shipping rules, create a shipment and find its label and tracking. Provider setup and the shipping offer are separate, and we will connect them before requesting a rate.”

Prerequisites: A controlled test provider account, a valid ship-from location and test destination, product dimensions/weight and a rehearsal order. Creating or buying a label may be billable outside test mode.

1. Connect the provider

Explain first: “The provider connection enables carrier rates and labels. A shipping method describes the rules BusinessMade applies. Saving a method alone does not authenticate EasyPost or another provider.”

Demonstrate: Open Storefront → Shipping → Settings → Providers. Locate EasyPost or another provider actually returned by the integration list. Select Configure, or Manage for an existing connection. Complete that provider's rendered configuration fields with its test credentials; keep keys masked. Select Test Connection and inspect Test Successful or Test Failed. Select Save Configuration and return to Providers to inspect the configured state.

Result: Configuration and a successful connection test are separate observations. The form is provider-schema-driven: do not invent a universal API-key field or claim every displayed provider has identical capabilities.

Identify the EasyPost configuration

If you enter through Gateway Manager → Integration Builder instead of Shipping's provider panel, select EasyPostProvider and check the Shipping/Logistics use cases. Its current schema includes Api Key. Enter your authorized test key, save the configuration and reopen it; use the test action only in that controlled environment. The two entry points can have different button labels: Gateway Manager shows Save and Test, while the shipping panel has its own configuration controls.

Shared EasyPost provider configuration in Studio

Shared-component reference captured in Appmint Studio on October4, not the BusinessMade shell. The provider is Inactive and the Api Key area starts at the bottom of this frame. It illustrates configuration identity, not a successful provider test. BusinessMade-specific provider capture is still needed.

2. Create a shipping configuration

Explain first: “The shipping configuration holds the method's identity, origin and calculation options. Customer shipping charges and the provider's carrier cost may differ because of configured handling or markup.”

Demonstrate: Under Settings → Shipping Methods, use its new configuration action. In New shipping configuration, enter Name, Title and Currency. Set the displayed enabled/default choices deliberately. Fill the origin fields: warehouse name, street, city, state, postcode, country and phone. Configure Handling per order, Handling per item, and Markup only where needed. Choose fixed or percentage markup and the corresponding Amount or Percent. Review country/state restrictions. Select Create configuration, reopen it and inspect saved values.

Add the actual delivery option

  1. In Shipping Methods, create the configuration with a unique Name, readable Title and Currency. Keep Active and Use as the site default off while preparing an unfinished practice configuration.
  2. Under Shipping options, choose Add a shipping option. Give it a customer-readable label, choose Flat fee, enter Amount 5 for this example and leave Charge per item off for one charge per order. Set the intended destination eligibility in that option. A title and warehouse address without an option do not define the delivery offer.
  3. Fill Ship from with your real dispatch address before testing carrier rates. The example address in the screenshot is a course fixture, not a usable warehouse.
  4. Leave unnecessary handling fees blank and Markup as None. Review Never ship to separately from an option's eligible destinations.
  5. Save, reopen the same name and expand its shipping option. Check label, method, amount and destination rules. Enable it deliberately only when ready to test the intended customer's checkout.

Saved shared shipping configuration with option and origin

Shared editor, captured in Appmint Studio on October4: Course US Standard was reopened, with one US standard delivery option. Active and site-default remain off. This proves saved configuration, not that BusinessMade has quoted or purchased a label.

Gotcha: The configuration name is disabled when editing; keep a stable meaningful identifier. Do not add both handling and markup unintentionally. Restrictions must match the intended service area; a saved provider connection does not override these choices.

3. Configure product shipping overrides

Explain first: “Product Shipping chooses how this item uses the site's shipping rules. It is separate from the parcel dimensions entered when buying a label.”

Demonstrate: Open Settings → Product Shipping, search the product by name or SKU and open its edit control. Under Shipping Method, choose Use site default, Free Shipping or Custom Flat Rate. For the default method, select Shipping Configuration or retain Default configuration. For a custom flat rate, enter Flat Rate Amount. Inspect Ships From Location and leave it empty only when the default is intended. Select Save, refresh and reopen the product's shipping editor.

Bulk demonstration: Select only the intended product rows and choose Edit N selected. Set the offered Shipping Method, Flat Rate Amount or Shipping Configuration as appropriate, then Update N Products. Check multiple affected rows afterward. This is a deliberate multi-record update, not a preview operation.

Result: The product's override is retained. Free Shipping is a customer-charge choice; it does not make a carrier label free. Inspect parcel dimensions and weight separately in the shipment wizard.

Check the product's own shipping information

Open Storefront → Products, locate the same SKU and expand Shipping in its editor. Enter the item's Weight, its unit, and Length, Width and Height with the shown units. Inspect Ships As and Shipping Config. Leaving Shipping Config blank uses the site default; selecting a record makes the intended configuration explicit. Save Changes and reopen the same product.

BusinessMade product shipping fields

Actual BusinessMade capture: the course mug's dimensions and weight are still zero, Ships As is Ordinary goods, and no Shipping Config is selected. Fill the physical values before relying on calculated packing or rates. Product dimensions describe the item; confirm the packed parcel in the shipment wizard.

4. Create the shipment and request rates

Explain first: “The shipment wizard progresses through Select, Address, Parcel, Rate and Done. An order-linked shipment keeps its business context; a manual shipment requires you to supply all addresses.”

Demonstrate: Open Create Shipment. Search and select the rehearsal order, or choose Create Manual Shipment for the separate standalone example. At Address, use Select Store Location for the origin where appropriate. Read and correct the ship-from company/name, street, city, state and ZIP. Check the recipient name, address, apartment/suite, city, state, ZIP and phone. Proceed to Parcel. Enter Length (in), Width (in), Height (in) and Weight (lbs) as labelled. Select Get Rates and inspect the returned carriers, services and costs.

Result: Real returned rates belong to the displayed parcel and addresses. If the provider rejects the address or returns no services, explain that response and correct its cause before proceeding. Do not substitute made-up rate rows.

5. Create the label and inspect tracking

Explain first: “Selecting a rate is a quote decision. Creating the shipment or buying the label commits the provider action. Check the selected service and price before that step.”

Demonstrate: Choose the returned test rate. Select Create Shipment. Read Shipment Created! only if the request succeeds. Inspect Tracking Number, the label and public tracking link when returned. Use the provided label download/print controls. Open Shipments, locate the same shipment and open Shipment Details. Match the order, tracking and label rather than relying on the success toast alone.

Result: A saved shipment with a label and reference. A label is not proof the carrier has collected the parcel. Public tracking availability depends on the provider response.

6. Multiple boxes and automatic updates

Explain first: “Multiple boxes have their own rates and labels. Complete each box's result separately. Automatic tracking updates also depend on the provider connection and webhook setup.”

Demonstrate: In a prepared multi-box shipment use Get Rates for This Box, select its rate and inspect Buy Label — [amount] before committing the controlled test. Confirm each box's label result individually. In Settings → Providers, inspect Automatic tracking updates. The initial view reads saved setup and does not contact EasyPost. If configuration is missing/unavailable, use Refresh setup after correcting the provider. If configured but not enabled, choose Enable automatic updates. Inspect the returned readiness and Webhook URL. When On, Re-check / repair explicitly registers or repairs the webhook. Confirm an actual controlled tracking event and saved order update before claiming end-to-end automatic tracking.

Troubleshooting: Do not buy another label because a new window was blocked; reopen the saved shipment first. A failed second box does not erase a successful first label. A tracking page can be empty before carrier scans. Provider credentials, shipping-rule configuration and parcel data must each be checked when rates fail.

Next steps

Spoken: “BusinessMade connects the order, parcel, provider rate and shipment record. Keep that chain visible when choosing a label or investigating tracking, and use the saved shipment before repeating a purchase.”

Verification notes

Provider fields are schema-driven and must be captured for the chosen account. Product Shipping and webhook action controls were additionally checked in product-shipping-settings.tsx and shipping-auto-tracking.tsx; their live effect remains a later verification step.