What one GoodRx price row actually contains
A GoodRx price feed is built from one repeating object: an offer to fill one prescription at one seller. Each offer carries an id that stops being opaque once decoded, because it unpacks into a version marker, the numeric drug id, the pharmacy chain id, the quantity and the coordinates the search ran against. That single string is why GoodRx data can be joined and diffed at all: two runs on the same strength, pack size and point produce the same key.
Seller and money. The seller is either a pharmacy chain with its own numeric id, display name and logo file, or a mail-order pharmacy carried as a separate object with a prose description and a free-shipping flag. Every amount arrives twice, as a minor-unit integer with a currency and a precision and as the formatted string the page prints. Beside the offer price sit the retail price that chain would charge without a code, the lowest price across the options, and a default option and a cheapest option that need not be the same row.
Coupon, membership and promotion. Options are typed: a coupon option, a home delivery option and an upsell option pointing at a subscription. A coupon carries the four values a pharmacist keys to adjudicate it - a BIN, a PCN, a group code and a member id - plus help text and separate phone lines for customer and pharmacist. Coupon money can be banded by days supply: one price for a short fill, another above the threshold. Promotions ride on the option as a campaign name, a campaign type, a discount amount, the base coupon price and the percent off that base. Rewards appear as an activity definition with a point total and its cash value. Price rows are labelled in the site's own words: with membership, no coupon necessary, special offers, pay online, buy online, free shipping.
Drug identity. Above the offers sits the prescription: a label with a name, a slug and a generic or brand type; a form with singular and plural names; a dosage; and a quantity. Every strength is its own drug instance with its own id and product image, so two strengths of one molecule are two keys. The selector publishes the legal combinations - which forms exist for the label, which strengths for the form, which pack sizes for the strength - with a default at each level and a custom quantity box that takes whole numbers only.