✦ Get upto 70% discount on bulk credits View tiers →
Western reports  /  Guides

Sell a preview, then upsell the full report

Give your customer a short, finished reading with an “Unlock the full report” button at the end. When they pay, send the longer version, with everything they already read carried over word for word.

1.How the upsell works

1

You give the customer a short report - the teaser

A real, finished, branded reading - just a short one. It covers the opening sections and stops there, with an “Unlock the full report” button at the end.

↓
2

They click the button and pay you

It takes them to your site - your checkout, your pricing page, wherever you want them to land. You take the payment; we are not involved in it.

↓
3

You send them the full report

The longer version of the same reading. Everything they already read stays exactly as it was, word for word, and the remaining sections are added underneath.

Same customer, same reading, twice. The second report continues from the first instead of starting over - so nothing they have already read changes, and the full report feels like the rest of the same book rather than a different one.

2.Why it makes money

A normal report is one sale. This is two: a cheap one that gets the customer to buy at all, and a bigger one they choose themselves once they have read the first.

The teaser is not a sample or a blurred page - it is a real, finished, branded report. That is the whole reason it works. The customer gets something genuinely worth reading, so they trust that the rest is worth paying for.

Free, or very cheap?

Both work, and most astrology businesses pick one of the two.

Give the teaser away free. This is the common play - plenty of astrology companies offer a “free reading” to bring people in. You pay the 50 credits yourself and treat it as the cost of winning a customer. In return you get their birth details and their email, and someone who has already read your writing and liked it. That is a far warmer lead than a visitor who only saw a sales page.

Or charge a very small amount. A token price covers your credit cost and filters out people who were never going to buy. You will hand out fewer teasers this way, but a higher share of them go on to buy the full report.

The rule of thumb: give it away when you want volume and email addresses, charge a little when you want fewer but more serious buyers. Either way the money is in the upgrade, not the teaser.

What it costs you

Each report you generate costs you credits, and the upgrade is charged in full - it is not discounted just because it reuses sections. So a Snapshot teaser followed by a Comprehensive upgrade costs you:

What you generateCredits
Snapshot teaser50
Comprehensive upgrade200
Total for that customer250
!
Price the teaser knowing you pay for both. Most sellers either charge a small amount for the teaser to cover its cost, or give it away and treat the 50 credits as the cost of winning the customer. Either works - just don’t plan on the upgrade being cheaper because it reuses text.

3.What you need to decide

Four decisions, all business ones. Settle these before anyone writes code - they are what your developer will ask you for.

  • Which report you are selling. Any of the 11 Western reports. The teaser and the full version must be the same one.
  • How big the teaser is. The shortest option is cheapest for you and leaves the most left to sell.
  • Where the unlock button goes. Your checkout, your pricing page, a signup form - any link you like.
  • Whether the teaser is free or paid, and what you charge for the full report. Your prices are yours - the credit costs above are only what you pay us.
i
That is the business side done. Everything below is for whoever builds it - you can hand them this page from here on.

4.Before you start

i
This guide covers only what the upsell flow needs. For every field a Western report accepts, see the Western Reports API reference.

Every Western report uses one endpoint:

POST /api/v1/western/reports/generate

And every request needs these headers:

Content-Type: application/json
Authorization: Bearer {api_acc_token}   // identifies your account
x-api-key: {api_key}                  // LIVE key, or test_api_key for test mode

Your live key deducts from remaining_credits; your test key deducts from remaining_test_credits.

Credits per tier

Charged in full, every time you generate.

Tiertier valueCredits
Snapshotsnapshot50
Insightinsight100
Advancedadvanced150
Comprehensivecomprehensive200

How generation works

The same for both steps: you send the request and get URLs back immediately with status: "processing". The report finishes in the background in roughly 10–30 seconds. Poll the returned statusUrl until status: "completed", then the HTML and PDF URLs are ready.

5.Step 1 - generate the locked teaser

Pick a small tier - snapshot, insight or advanced - and set locked: true. Send the person’s full birth details and your branding, exactly like any normal report.

The branding fields set how the PDF looks. To choose your colours, fonts and cover layout visually and preview them on real report pages, use the Report Studio.

!
Comprehensive cannot be locked. It is the full report, so locking it makes no sense - locked: true with the comprehensive tier is rejected with a 422. Lock a smaller tier instead.
curl -X POST https://pdf.divineapi.com/api/v1/western/reports/generate \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_ACC_TOKEN" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "report_type": "western-inner-moon",
    "tier": "snapshot",
    "locked": true,

    "full_name": "Alex Rivera",
    "day": 14, "month": 6, "year": 1990,
    "hour": 10, "min": 25, "sec": 0,
    "gender": "male",
    "place": "New York, USA",
    "lat": 40.7128, "lon": -74.006, "tzone": -4,
    "lan": "en",

    "company_name": "Astro Insights",
    "company_url": "https://astroinsights.co",
    "company_email": "hello@astroinsights.co",
    "footer_text": "© 2026 Astro Insights",
    "logo_url": "https://astroinsights.co/logo.png"
  }'

The response comes back immediately:

{
  "reportId": "e6eba5d8-2e27-4406-b9a1-706087fdbb0d",
  "htmlUrl":  "https://pdf.divineapi.com/reports/html/….html?token=…",
  "pdfUrl":   "https://pdf.divineapi.com/reports/pdfs/….pdf?token=…",
  "statusUrl":"https://pdf.divineapi.com/api/v1/reports/…/status?token=…",
  "status":   "processing"
}
i
Save the reportId. You need it in step 2. Give the customer the htmlUrl or pdfUrl once the status reads completed.

The teaser looks like a normal report but with fewer sections, and ends with a CTA block: a heading, a short paragraph, and an “Unlock the full report →” button. By default that button points at your company_url and opens in a new tab. You can change all of it - see section 5.

6.Step 2 - generate the full report on unlock

After the customer pays on your site, make a second call for a higher tier and add source_report_id set to the teaser’s reportId. Send all the same inputs again - same person, same branding - just change the tier and drop locked.

curl -X POST https://pdf.divineapi.com/api/v1/western/reports/generate \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_ACC_TOKEN" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "report_type": "western-inner-moon",
    "tier": "comprehensive",
    "source_report_id": "e6eba5d8-2e27-4406-b9a1-706087fdbb0d",

    // same birth data and branding as the teaser
    "full_name": "Alex Rivera",
    "day": 14, "month": 6, "year": 1990,
    "lat": 40.7128, "lon": -74.006, "tzone": -4,
    "company_name": "Astro Insights"
  }'

You get back a brand-new report with a new reportId and new URLs. In it:

  • Every section the customer already saw in the teaser is reused word-for-word.
  • The new sections of the bigger tier are freshly generated.
  • There is no unlock button, because you didn’t set locked.

The teaser is not touched. The full report is a separate file, and both stay available.

7.Customising the unlock box

Four optional parameters change the locked CTA. Each is independent - set only what you want, and anything you omit keeps its default. They apply only when locked: true, and they appear in both the HTML and the PDF.

ParameterControlsDefault if omitted
unlock_headingThe heading“This is a preview of your full report”
unlock_messageThe paragraph“You’re seeing a taste of what the stars reveal. Unlock the complete reading to get every section in full detail.”
unlock_button_labelThe button text“Unlock the full report →”
unlock_button_urlWhere the button goesYour company_url

Added to the step 1 body:

"locked": true,
"unlock_heading": "You've unlocked a glimpse ✨",
"unlock_message": "This is the first chapter of your Inner Moon reading. Get all 21 sections in the full report.",
"unlock_button_label": "Get my full reading →",
"unlock_button_url": "https://astroinsights.co/checkout?report=inner-moon"

The button opens in a new tab. If unlock_button_url isn’t a valid http(s) link and company_url isn’t either, the box still renders - the button just isn’t clickable.

8.The rules

Read these once and you will avoid every common error. Pricing is covered in section 2.

A. Which tiers can be locked

snapshot, insight and advanced can be locked. comprehensive cannot - it is the full report, so use a smaller tier as the teaser.

B. Upgrades go up only, within the same report

When you send source_report_id, the new report must be the same report family as the source (Inner Moon to Inner Moon, not Inner Moon to Career) and a strictly higher tier. You may skip tiers - snapshot straight to comprehensive is fine. You cannot downgrade, and you cannot re-make the same tier.

C. It must be the same person

The source and the new report must have identical birth details - name, date, time, place, latitude and longitude - and belong to the same account. For Monthly and Yearly Horoscopes the period must match too (horoscope_month / horoscope_year). This is what stops one customer’s content being reused for someone else.

D. Inputs

The upgrade call needs all the same inputs as a normal report - birth data plus branding - in addition to source_report_id. Sending only source_report_id is not enough.

9.Error responses

HTTPMessage containsCause → fix
422Comprehensive reports cannot be lockedYou set locked: true on comprehensive → lock snapshot, insight or advanced instead.
400source_report_id not foundWrong or mistyped id → use the reportId from the teaser response.
400belongs to a different clientThe source was made on another account → use the same account.
400different birth chartBirth details don’t match the source → send the exact same person.
400different report familyUpgrading across families → keep the same report_type family.
400higher tier … no downgrade or same-tierTarget tier is at or below the source → target a higher tier.
400different horoscope periodPeriod differs from the source → match horoscope_month / horoscope_year.
402insufficient creditsNot enough credits for the tier → top up, or use your test key.

10.FAQ

Do I have to go one tier at a time?

No. You can jump from any lower tier to any higher one - snapshot straight to comprehensive, for example. You just can’t go down.

Can I chain upgrades?

Yes. Point source_report_id at whichever report the customer currently has; each step reuses everything below it. Each step is billed at that tier’s full price.

Will the full report’s shared sections read exactly like the teaser?

Yes, reused verbatim. Only the new sections are generated fresh.

Does the teaser get deleted or changed?

No. The full report is a separate new report; the teaser stays exactly as it was.

Does the unlock box appear in the PDF too?

Yes, in both the HTML and the PDF. In the PDF the button opens in the reader’s browser.

Can I lock a Comprehensive report just to add the CTA?

No - and you wouldn’t want to. It would hand over the entire report with a pointless unlock button while charging full price. Use a smaller tier as the teaser.

11.Quick checklist

Teaser - step 1

  • Tier is snapshot, insight or advanced - not comprehensive
  • locked: true
  • Full birth data and branding
  • Optional unlock_* overrides
  • Save the returned reportId

Full report - step 2, after payment

  • Same report_type family, a higher tier
  • source_report_id is the teaser’s reportId
  • Same birth data and branding, and the same period for horoscopes
  • No locked
  • Poll statusUrl until completed, then deliver the new URLs