# Product & Upsell Setup

**Portable handoff doc** — copy this file (and `docs/`, `assets/`, campaign HTML) to any host. Paths below are **site-relative** unless noted. Absolute URLs use the deployment base; replace `BASE_URL` when moving.

| Field | Value |
|-------|--------|
| **Legal entity** | Structure.ai, Inc. |
| **Entity type** | C Corporation (C Corp) |
| **EIN (US Tax ID)** | 92-3888418 |
| **Brand / DBA on pages** | Structure Business Solutions |
| **Current deploy root** | `/var/www/campaigns` |
| **Current base URL** | `https://learn.structure-business-solutions.com` |
| **Merchant of record** | Digistore24 (DS-us) |
| **Last updated** | 2026-08-11 |

**Machine-readable twin:** [`agent-manifest.json`](./agent-manifest.json)  
**Assets for agents:** [`../assets/MANIFEST.json`](../assets/MANIFEST.json) · [bulk ZIP](./campaign-assets.zip)  
**HTML index of this folder:** [`index.html`](./index.html)

---

## 0. How to use this doc elsewhere (transportability)

This campaign is a **static site**: folders of HTML + images. No app server required.

### What to copy

```
campaigns/                    # or any web root
  index.html
  legal-information/
  margin-checker/             # P&L sales
  ar-checker/                 # Collections sales
  ask-your-pl/                # P&L OTO1
  talk-with-your-ar/          # Collections OTO1
  case-study-pl/ + thank-you/
  case-study-collections/ + thank-you/
  90-day-pl-reset/ + thank-you/
  90-day-collections-reset/ + thank-you/
  assets/                     # PNG + MANIFEST.json
  docs/                       # this guide, agent-manifest, ZIP
```

### Relocate checklist

1. Point DNS / vhost document root at the folder above.
2. Search-replace host-specific strings (or keep relative `/path/` links and only fix absolute ones):
   - `https://learn.structure-business-solutions.com` → your new `BASE_URL`
   - Digistore product IDs and checkout domains stay the same unless you clone products
3. In **Digistore Conversion Cockpit**, update every step’s **sales page URL** and freeflow final thank-you to the new host.
4. Update Digistore product **salespage / thankyou** fields (API or UI) to match.
5. Refresh `docs/agent-manifest.json` and `assets/MANIFEST.json` `base_url` / full `url` fields (or regenerate).
6. Legal page already uses the legal entity + EIN; keep `/legal-information/` linked from all footers.

### Agent pull (any environment)

```bash
# Prefer relative paths when already on the server
cp -a /var/www/campaigns/docs ./handoff-docs
cp -a /var/www/campaigns/assets ./handoff-assets

# Or over HTTPS (replace BASE_URL)
BASE_URL='https://learn.structure-business-solutions.com'
curl -fsSL "$BASE_URL/docs/PRODUCT-UPSELL-SETUP.md" -o PRODUCT-UPSELL-SETUP.md
curl -fsSL "$BASE_URL/docs/agent-manifest.json" -o agent-manifest.json
curl -fsSL "$BASE_URL/docs/campaign-assets.zip" -o campaign-assets.zip
curl -fsSL "$BASE_URL/assets/MANIFEST.json" -o assets-MANIFEST.json
unzip campaign-assets.zip -d assets
```

Relative page links in HTML (`/margin-checker/`, `/assets/logo.png`) work on any host that serves this tree at `/`.

---

## 1. Company & compliance identity

| | |
|--|--|
| Legal name | **Structure.ai, Inc.** |
| Structure | **C Corp** |
| EIN | **92-3888418** |
| Brand on marketing | Structure Business Solutions |
| Address | 10962 Patriot Hwy, Fredericksburg, VA 22408, United States |
| Email | contact@structure-business-solutions.com |
| Phone | +1 540 783 5040 |
| Public legal page | `/legal-information/` |

Use **Structure.ai, Inc.** + EIN on Digistore vendor profile and legal disclosures. Marketing pages may still say “Structure Business Solutions.”

---

## 2. Funnel overview

Two parallel funnels (P&L and Collections). Same structure:

```
Sales page (free checker)
    → Digistore checkout (main $27)
        optional order bump (worksheets $17)
    → Freeflow OTO 1: AI prompt pack $47  (YES / NO)
    → Freeflow OTO 2: Case study seat $497 (YES / NO)  [same product on YES and NO path]
    → Thank-you (Reset TY after freeflow end; Case study TY if case seat bought)
```

### P&L funnel

| Step | Product | ID | Price | Page |
|------|---------|-----|-------|------|
| Sales | 90-Day P&L Reset | **719738** | $27 | `/margin-checker/` |
| Bump | P&L Reset Worksheets | **719748** | $17 | (order form) |
| OTO1 | Talk With Your P&L | **719745** | $47 | `/ask-your-pl/` |
| OTO2 | Case Study Seat · P&L Plan | **720646** | $497 | `/case-study-pl/` |
| TY main/AI | — | — | — | `/90-day-pl-reset/thank-you/` |
| TY case | — | — | — | `/case-study-pl/thank-you/` |

**Upsell tree (API keys `y` / `yy` / `yn` — Digistore UI often shows `J` / `JJ` / `JN` for Ja):**

| Position | Meaning | Product |
|----------|---------|---------|
| `y` (J) | First offer after main buy | 719745 Talk With Your P&L |
| `yy` (JJ) | After YES on OTO1 | 720646 Case Study P&L |
| `yn` (JN) | After NO on OTO1 | 720646 Case Study P&L |

### Collections funnel

| Step | Product | ID | Price | Page |
|------|---------|-----|-------|------|
| Sales | 90-Day Collections Reset | **719749** | $27 | `/ar-checker/` |
| Bump | Collections Reset Worksheets | **719750** | $17 | (order form) |
| OTO1 | Talk With Your AR | **719751** | $47 | `/talk-with-your-ar/` |
| OTO2 | Case Study Seat · Collections | **720647** | $497 | `/case-study-collections/` |
| TY main/AI | — | — | — | `/90-day-collections-reset/thank-you/` |
| TY case | — | — | — | `/case-study-collections/thank-you/` |

**Upsell tree:** `y`→719751, `yy`/`yn`→720647

---

## 3. Digistore checkout URLs

| Product ID | Order form |
|------------|-----------|
| 719738 | https://www.checkout-ds24.com/product/719738 |
| 719749 | https://www.checkout-ds24.com/product/719749 |
| 719748 | https://www.checkout-ds24.com/product/719748 |
| 719750 | https://www.checkout-ds24.com/product/719750 |
| 719745 | https://www.checkout-ds24.com/product/719745 |
| 719751 | https://www.checkout-ds24.com/product/719751 |
| 720646 | https://www.checkout-ds24.com/product/720646 |
| 720647 | https://www.checkout-ds24.com/product/720647 |

Active payment plans (exactly **one** each — required for clean one-click):

| Product | Payplan ID | Amount | `is_for_sale` |
|---------|------------|--------|---------------|
| 719738 | 1478152 | $27 | all |
| 719749 | 1478168 | $27 | all |
| 719748 | 1478166 | $17 | all |
| 719750 | 1478169 | $17 | all |
| 719745 | 1478161 | $47 | upsell,upgrade |
| 719751 | 1478170 | $47 | upsell,upgrade |
| 720646 | 1479789 | $497 | upsell,upgrade |
| 720647 | 1479790 | $497 | upsell,upgrade |

Legacy upgrade IDs (not used for freeflow one-click): OTO AI ~14881/14882; case study ~14901/14902.

---

## 4. Freeflow / one-click upsell (critical)

### How it works

1. Buyer completes main product checkout.
2. Digistore redirects to first OTO **sales page URL** with query param:
   - `digistore_upsell_session_id=…`
3. Page loads `https://www.checkout-ds24.com/service/digistore.js` and calls `digistoreUpsell()`.
4. Script rewrites links:
   - `/answer/yes` → `/answer/{sessionId}/yes`
   - `/answer/no` → `/answer/{sessionId}/no`
5. YES opens Digistore one-click modal (card on file); NO advances tree.

### OTO page button rules (copy-paste pattern)

```html
<a href="https://www.checkout-ds24.com/answer/yes">Yes · $47</a>
<a href="https://www.checkout-ds24.com/answer/no">No thanks</a>
<script src="https://www.checkout-ds24.com/service/digistore.js"></script>
<script>digistoreUpsell();</script>
```

**Do not:**

- Pre-set `window.DS24_UPSELL_SESSION_ID` before `digistoreUpsell()` (skips link rewrite).
- Overwrite button `href` / `onclick` after Digistore wires them.
- Point YES at `/product/…` or `/upgrade/…` for freeflow one-click (full form / wrong path).
- Leave **two active payplans** on an OTO (forces plan chooser instead of one-click).

### Conversion Cockpit

- Open **main** product → Conversion Cockpit.
- Tree positions: first upsell, then YES/NO branches (UI: J / JJ / JN).
- There is often **no separate “turn freeflow on” toggle** — configuring the tree + sales URLs + empty main thank-you is what activates the session redirect.
- Sales page URLs on each step must match the live OTO pages.
- **Final freeflow thank-you** (API cannot set `upsell_freeflow_thankyou_url`): set in Cockpit UI to:
  - P&L: `{BASE_URL}/90-day-pl-reset/thank-you/`
  - Collections: `{BASE_URL}/90-day-collections-reset/thank-you/`
- Keep main product **thank you URL empty** while freeflow is active (a custom main TY can short-circuit freeflow).

### Test path

1. Vendor → **Make a test purchase** on main product (card / test pay).
2. Land on OTO1 URL with `digistore_upsell_session_id=…`.
3. YES → one-click modal → OTO2; NO → OTO2; end → final thank-you.

---

## 5. Lessons learned (Digistore setup)

Hard-won rules from building these funnels. Apply when cloning products or moving hosts.

### 5.1 Freeflow session ID

| Symptom | Cause | Fix |
|---------|--------|-----|
| OTO shows “session missing” / YES fails | Digistore never appended `digistore_upsell_session_id` | Cockpit tree + sales URLs correct; clear main `thankyou_url`; freeflow only runs after real post-purchase redirect |
| Session in URL but YES broken | Custom JS overwrote Digistore-wired links, or `DS24_UPSELL_SESSION_ID` set early | Use stock pattern: plain `/answer/yes\|no` + `digistore.js` + `digistoreUpsell()` only |
| Session never appears in browser | Testing by opening OTO URL manually | Must come from Vendor test purchase / live checkout through freeflow |

**Rule:** The session is issued only on Digistore’s freeflow redirect after payment. It is not something you invent client-side.

### 5.2 YES must be freeflow answer, not product URL

| Wrong | Why it fails | Right |
|-------|--------------|-------|
| `href` → `/product/719745` | Full checkout, new session, not one-click | `/answer/yes` |
| `href` → `/upgrade/{id}` | Upgrade flow, not freeflow one-click | `/answer/yes` |
| YES pointing at main Reset product | Buyer re-buys frontend | OTO product only via answer path |

### 5.3 One payment plan per OTO

Multiple active payplans on an upsell product force Digistore’s **plan chooser** and break pure one-click. Deactivate duplicates; leave a single plan with `is_for_sale` including `upsell` (and `upgrade` if needed).

### 5.4 Main thank-you URL vs freeflow

If the **main** product has a custom `thankyou_url`, Digistore may skip freeflow and send buyers straight to that page (no session, no OTOs).

- While freeflow is active: leave main thank-you **empty**.
- Set the **final freeflow thank-you** in Conversion Cockpit (not always available via API).
- Case-study products keep their own thank-you (booking CTA) for when that product is purchased.

### 5.5 Cockpit labels are not English “Y”

API / docs use `y`, `yy`, `yn`. The Digistore UI often labels the same nodes **J / JJ / JN** (Ja). Map carefully; do not assume missing English “Y” means freeflow is off.

### 5.6 API limits (do in Digistore UI)

These were **not** reliably settable via REST/MCP during setup:

- Freeflow final thank-you (`upsell_freeflow_thankyou_url`)
- Some freeflow enable flags (`is_free_upsell_enabled` may still show `N` in API while Cockpit tree works)
- Product **approval** submit and reviewer vault file attachment workflow details
- Full Conversion Cockpit tree editing (configure in UI)

API works well for: create/update product metadata, payplans, salespage/thankyou URLs, access instructions text, deactivating extra payplans.

### 5.7 Auth headers

- Digistore **REST**: `X-DS-API-KEY: <key>`
- Digistore **MCP**: Bearer token style per MCP config — do not mix headers between REST and MCP

### 5.8 Approval / test purchase

- Unapproved products often cannot take public or test pay until status allows vendor test purchase.
- Some products require a **test purchase** before submit-for-approval.
- Product **files must live in Digistore download vault** so reviewers can access digital goods.
- Prices on sales pages must match payplans ($27 / $17 / $47 / $497).
- Refund messaging: Digistore **60-day** buyer protection on these offers; keep page copy aligned.
- Always state digital delivery / online service; include “withdrawal … by Digistore24” on thank-yous.
- No non-Digistore checkout CTAs on sales pages (Cal.com = booking only).

### 5.9 Order bumps vs freeflow OTOs

- Order bumps attach on the main order form (worksheets $17).
- Freeflow OTOs are post-purchase pages with session + one-click.
- OTOs should be `is_for_sale` upsell/upgrade so they are not standalone impulse frontends unless intended.

### 5.10 Case study thank-you + Cal.com

Case study purchase should land on case TY with **book Call 1** first (72-hour rule in copy). Put the same Cal.com URLs in Digistore **access instructions** for the case products so email delivery matches the page.

### 5.11 Images and absolute hosts

Prefer site-root paths (`/assets/…`) in HTML so relocating the tree does not break images. Absolute `BASE_URL` only in Digistore-stored URLs and agent manifests.

### 5.12 Destructive edits

When bulk-rewriting OTO HTML for freeflow, keep a backup. A bad global replace once ate page bodies; restore from backup then re-apply only the YES/NO + script block.

---

## 6. Cal.com booking

| Use | URL |
|-----|-----|
| Free strategy after P&L Reset | https://cal.com/structure-business-solutions/pl-reset-strategy-session |
| Free strategy after Collections Reset | https://cal.com/structure-business-solutions/collections-reset-strategy-session |
| Case study P&L Call 1 + Call 2 | https://cal.com/structure-business-solutions/case-study-pl-calls |
| Case study Collections Call 1 + Call 2 | https://cal.com/structure-business-solutions/case-study-collections-calls |

Schedule (ops): Mon–Fri 10:00–19:00 America/New_York, Microsoft Teams, 24h notice. Reminders: 24h + 1h email.

---

## 7. Site map (HTML pages)

| Path | Role |
|------|------|
| `/` | Index / hub |
| `/margin-checker/` | P&L sales |
| `/ar-checker/` | Collections sales |
| `/ask-your-pl/` | P&L OTO1 |
| `/talk-with-your-ar/` | Collections OTO1 |
| `/case-study-pl/` | P&L OTO2 |
| `/case-study-collections/` | Collections OTO2 |
| `/90-day-pl-reset/thank-you/` | P&L post-purchase TY |
| `/90-day-collections-reset/thank-you/` | Collections post-purchase TY |
| `/case-study-pl/thank-you/` | Case study P&L TY + book |
| `/case-study-collections/thank-you/` | Case study Collections TY + book |
| `/legal-information/` | Legal (Structure.ai, Inc. · EIN · Digistore MoR) |
| `/docs/` | Documentation hub |
| `/assets/` | Image assets catalog |

---

## 8. Assets (downloadable)

**Bulk ZIP (relative):** [`./campaign-assets.zip`](./campaign-assets.zip)  
**Manifest (relative):** [`../assets/MANIFEST.json`](../assets/MANIFEST.json)  
**Catalog:** [`../assets/`](../assets/)

| File | Typical use |
|------|-------------|
| `cover.png` | P&L Reset product image |
| `pl-reset-book-ds.png` | P&L TY / book mock |
| `margin-checker.png` | Margin checker visual |
| `collections-reset-book.png` | Collections Reset cover |
| `ar-checker-laptop.png` | AR checker visual |
| `ask-pl-tablet.png` | Talk With Your P&L OTO |
| `talk-with-your-ar-tablet.png` | Talk With Your AR OTO |
| `logo.png` | Brand |
| `favicon-pl.png` | P&L favicon |
| `favicon-collections.png` | Collections favicon |

### Agent download recipes

```bash
BASE_URL='https://learn.structure-business-solutions.com'   # change when relocating

curl -fsSL "$BASE_URL/docs/campaign-assets.zip" -o campaign-assets.zip
unzip campaign-assets.zip -d assets

curl -fsSL "$BASE_URL/assets/MANIFEST.json" -o MANIFEST.json
# each entry: .url, .sha256, .bytes, .path

curl -fsSL "$BASE_URL/docs/agent-manifest.json" -o agent-manifest.json
curl -fsSL "$BASE_URL/docs/PRODUCT-UPSELL-SETUP.md" -o PRODUCT-UPSELL-SETUP.md
```

HTML pages are public over HTTPS at the same host; paths are in `agent-manifest.json` → `pages`.

---

## 9. Compliance notes (Digistore approval)

- Legal entity on vendor/legal: **Structure.ai, Inc.**, C Corp, EIN **92-3888418**.
- Prices on pages must match Digistore payplans ($27 / $17 / $47 / $497).
- Refund: Digistore **60 days**; sales copy aligned to 60-day buyer protection.
- All sales + thank-you pages link **Legal information** (`/legal-information/`).
- Digital products: explicit “digital / no physical shipment”; case study: “online service”.
- Thank-you pages include: *The withdrawal from your account will be done by Digistore24.*
- No non-Digistore checkout links (Cal.com is booking only; optional DFY = Digistore only).
- OTO YES buttons show price + one-time (not subscription).
- Product files must live in Digistore download vault for reviewer access.
- Some products require a **test purchase** before submit-for-approval.

---

## 10. Ops checklist

- [ ] Download vault files uploaded for all digital products  
- [ ] Freeflow final thank-you set in Conversion Cockpit (both mains)  
- [ ] Test purchase main → session ID on OTO1 → YES one-click → OTO2 → final TY  
- [ ] Case study test: land on case TY with Cal.com book working  
- [x] Legal page: Structure.ai, Inc. · C Corp · EIN 92-3888418  
- [ ] Submit / re-submit products for DS-us approval after vault + test pay  
- [ ] If relocating host: Cockpit + product URLs + manifests updated  

---

## 11. Filesystem layout (portable)

```
{WEB_ROOT}/                    # e.g. /var/www/campaigns
  index.html
  legal-information/
  margin-checker/
  ar-checker/
  ask-your-pl/
  talk-with-your-ar/
  case-study-pl/ + thank-you/
  case-study-collections/ + thank-you/
  90-day-pl-reset/ + thank-you/
  90-day-collections-reset/ + thank-you/
  assets/          # PNG + MANIFEST.json + index.html
  docs/            # PRODUCT-UPSELL-SETUP.md, agent-manifest.json, campaign-assets.zip, index.html
```

Serve `{WEB_ROOT}` as the site root. No build step required.
